/*
 *	app.h
 *
 *	dppcmcnv - WAV to PPD コンバータ
 *	Copyright (C) 2002-2011 Naoyuki Sawa
 *
 *	* Sun Jul 21 04:37:00 JST 2002 Naoyuki Sawa
 *	- 作成開始。
 */
#ifndef __APP_H__
#define __APP_H__

#define STRICT
#include <windows.h>
#include <mmreg.h>
#include <msacm.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "msacm32.lib")

#define VERSION		"20110611"

/* piece.h (BIOS 1.18) より */
#define PW_TYPE_8BITPCM		0
#define PW_TYPE_16BITPCM	1
#define PW_TYPE_4BITADPCM	2
#define PW_TYPE_2BITADPCM	3						/*{{2006/12/19追加: 2bitADPCM可変周波数(独自拡張)}}*/
#define PW_TYPE_CONT		0x10	/* 連続出力 */
#define PW_TYPE_ADP_INI		0x20	/* ADPCM初期化要求 */
#define PW_TYPE_VR		0x40	/* 可変レート */
#define PW_TYPE_ADPCM		(PW_TYPE_4BITADPCM|PW_TYPE_ADP_INI)
#define PW_TYPE_ADPCM_V		(PW_TYPE_4BITADPCM|PW_TYPE_VR|PW_TYPE_ADP_INI)
#define PW_TYPE_ADPCM_X		(PW_TYPE_2BITADPCM|PW_TYPE_VR|PW_TYPE_ADP_INI)	/*{{2006/12/19追加: 2bitADPCM可変周波数(独自拡張)}}*/
#define PW_TYPE_ADPCM_NI	(PW_TYPE_4BITADPCM)
#define PW_TYPE_ADPCM_V_NI	(PW_TYPE_4BITADPCM|PW_TYPE_VR)
#define PW_TYPE_ADPCM_X_NI	(PW_TYPE_2BITADPCM|PW_TYPE_VR)			/*{{2006/12/19追加: 2bitADPCM可変周波数(独自拡張)}}*/
#define PW_STAT_START		1	/* 再生開始 */
#define PW_STAT_END		2	/* 再生終了 */
typedef struct tagPCEWAVEINFO {				/*    実行時メモリ上では...	ファイル上では... */
	volatile unsigned char stat;			/*  0 ステータス		PW_STAT_START固定 */
	unsigned char type;				/*  1 データ形式		(同左)            */
	unsigned short resv;				/*  2 0または周波数(ADPCM_V時)	(同左)            */
	const void* pData;				/*  4 データへのポインタ	NULL              */
	unsigned long len;				/*  8 データの長さ(サンプル数)	(同左)            */
	struct tagPCEWAVEINFO *next;			/* 12 次へのポインタ		NULL              */
	void (*pfEndProc)(struct tagPCEWAVEINFO*);	/* 16 終了時コールバック	NULL              */
} PCEWAVEINFO;

/* ファイル上では、PCEWAVEINFOの前にシグネチャとサイズを置きます。
 * 「"P/ECE" Official WebPage 開発者掲示板」にて、この件に関する質疑応答がありました。
 * 念のため保存しておいたので、「keep/wavデータの再生について.txt」を参照してください。
 */
#define PPDSIG		((int)'PPCM')
typedef struct _PPDHDR {
	int sig;	/* 'PPCM'固定                   */
	int len;	/* PPDHDRを除いたファイルサイズ */
} PPDHDR;

// wav.c
typedef struct WAV {
	WAVEFORMATEX* fmt;	/* フォーマット         */
	int c_data;		/* データサイズ[バイト] */
	char* data;		/* データ               */
} WAV;
WAV* wav_new();
void wav_free(WAV* wav);
WAV* wav_load(const char* path);
void wav_to_wav(WAV* wav1, WAV* wav2);

// wav2adpc.c
void encode(unsigned char *adp,signed short *wave,int size);

/*{{2006/12/19追加: 2bitADPCM可変周波数(独自拡張)*/
// wav2adp2.c
void encode2(unsigned char *adp,signed short *wave,int size);
/*}}2006/12/19追加: 2bitADPCM可変周波数(独自拡張)*/

// main.c
void usage();
void die(const char* fmt, ...);
void cmdline(int argc, char* argv[]);
void writedata(FILE* fp, void* data, int len);
void writepcm(FILE* fp, WAV* wav);
void writeadpcm(FILE* fp, WAV* wav);
void writeadpcm2(FILE* fp, WAV* wav);	/*{{2006/12/19追加: 2bitADPCM可変周波数(独自拡張)}}*/
void do_norm8(WAV* wav);	/*{{2011/06/10追加: ノーマライズ}}*/
void do_norm16(WAV* wav);	/*{{2011/06/10追加: ノーマライズ}}*/
void do_cut8(WAV* wav, int cut_level);	/*{{2011/06/06追加: 無音カット}}*/
void do_cut16(WAV* wav, int cut_level);	/*{{2011/06/06追加: 無音カット}}*/

#endif /*__APP_H__*/
