/*	
 *	clipaudi.h
 *
 *	USB Audio Device
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2014 Naoyuki Sawa
 *
 *	* Sun Sep 21 23:12:43 JST 2014 Naoyuki Sawa
 *	- 1st リリース。
 *	* Tue Sep 23 03:01:15 JST 2014 Naoyuki Sawa
 *	- Audio_Write_sub()をアセンブラ化しました。
 *	- Audio_ep2_txdone()をアセンブラ化しました。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __CLIP_AUDI_H__
#define __CLIP_AUDI_H__

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

/****************************************************************************
 *	プロダクトID
 ****************************************************************************/
#define AUDIO_PRODUCT_ID	(PCE_PRODUCT_ID+0x1A)	/* 重複禁止!! */

/****************************************************************************
 *	定数、マクロ、構造体
 ****************************************************************************/
/* アセンブラコードから直接参照するため、レイアウト固定です!! */
typedef struct _ST_Audio {
	uint16_t	bAlternateSetting;	/* +0,2 0=「Zero-bandwidth Alternate Setting 0」,1=「Operational Alternate Setting 1」 */	//Audio_Start()を実行して、Windows7がデバイスを認識した後、音量アイコンを右クリック⇒録音デバイス⇒P/ECE USB device⇒プロパティ⇒聴く⇒「このデバイスを聴く」をOnにすると、「Zero-bandwidth Alternate Setting 0」から「Operational Alternate Setting 1」へ変化する。
	uint16_t	Pos;			/* +2,2 バッファ内の読み出し位置 */	//┐
	uint16_t	Len;			/* +4,2 バッファ内の有効データ長 */	//├→書き込み位置は「(Pos+Len)%Cap」で求められる。
	uint16_t	Cap;			/* +6,2 バッファ容量 */			//┘
	 int16_t	Buf[0/*Cap*/];		/* +8,? バッファ */
} ST_Audio;
extern ST_Audio* pAudio;

/****************************************************************************
 *	アプリケーション用関数
 ****************************************************************************/

/* USB Audio Deviceを開始します。
 * [in]
 *	Cap		バッファ容量
 *			0を指定すると、既定のバッファ容量を用いる。
 * [note]
 *	- Audio_Start()を呼び出したアプリケーションは、終了する前に必ず、Audio_Stop()を呼び出してください。
 *	  Audio_Stop()を呼び出さずに終了すると、P/ECEシステムが異常動作となります。
 */
void Audio_Start(int Cap);

/* USB Audio Deviceを終了します。
 * [note]
 *	- Audio_Stop()は、常に安全に呼び出すことができます。
 *	  Audio_Start()を呼び出さずに、Audio_Stop()を呼び出しても安全です。
 */
void Audio_Stop();

/* サウンドデータを書き込みます。
 * [in]
 *	buf		データアドレス
 *	len		データ長
 * [note]
 *	- 当関数は、割込み許可状態でも、割込み禁止状態でも、呼び出すことができます。
 *	- 16kHzよりも早い周期でデータを書き込んだり、一度にまとめてたくさんのデータを書き込むと、バッファがあふれることがあります。
 *	  バッファがあふれた場合、古いデータが破棄され、音飛びが生じますが、動作には支障ありません。
 *	- 上記のバッファあふれを避けるには、サウンドデータのミキシング単位の2倍の容量のバッファを用意しておけば、安全だと思います。
 *	  Audio_Start()にCap=0を指定して初期化すれば、一般的なミキシング単位の2倍の容量のバッファが確保されます。
 */
void Audio_Write(const int16_t buf[/*len*/], int len);

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif /*__CLIP_AUDI_H__*/
