#pragma once #include "WaveOut.h" typedef BOOL (__stdcall *SAVECALLBACK)(int percent,LPCTSTR lpszMessage,LPVOID lpParam); //テンポラリーファイル名の取得 BOOL __stdcall _GetTempFileName(CString& strTempFileName,LPCTSTR lpPrefixString,LPCTSTR lpszExt); class CWaveFile : public CWaveOut { public: //コンストラクタ CWaveFile(CWnd* pWndCallBack=NULL); //デストラクタ virtual ~CWaveFile(); //メンバー変数の初期化 void Init(); //演奏の停止して、読み込み中のファイルを閉じます。(オーバーライド) void Delete(BOOL bDeleteBaseClass=FALSE); //Waveファイルがオープンされているかどうか?(オーバーライド) virtual BOOL IsWaveFile() const{return (m_hmmio!=0);}; //読み込み中のデバイスハンドルが有効か?(オーバーライド) virtual BOOL IsOpen() const{return IsWaveFile();}; //Waveファイルを開きます。 BOOL OpenFile(LPCTSTR lpszFileName,BOOL bDeleteMemberParam=TRUE); //音源ストリームを読み込みます。(オーバーライド) //pIndexSample://現在の演奏位置変数へのポインタ virtual UINT StreamIn(LPVOID pBuffer,UINT nBufSize,UINT* pIndexSample); //基底クラスに音源ストリームを引渡します。(オーバーライド) virtual UINT StreamIn(LPVOID pBuffer,UINT nBufSize); //現在演奏中の音源データをオーディオファイルに書き込みます。(重ね書き可) BOOL SaveFile(LPCTSTR lpszFileName,SAVECALLBACK lpfnCallBack,LPVOID lpParam); //現在演奏中の音源データをWAVEファイルの書き込みます。(重ね書き不可&オーバーライド) virtual BOOL WriteFile(LPCTSTR lpszFileName); //現在演奏中のファイルを重ね書きします。 BOOL OverWriteFile(){return SaveFile(m_strPathName,NULL,NULL);}; //演奏を開始します。 // timePerOut:一回に演奏する時間(_秒) BOOL Play(UINT timePerOut=100){return CWaveOut::Play(&m_wfx,timePerOut);}; //演奏を停止します。 void Stop(UINT indexSample=-1); //演奏位置を設定します。(オーバーライド) virtual void SetPos(UINT nPos); //演奏位置を取得します。(オーバーライド) virtual UINT GetPos() const{return m_indexSample;}; //音源データのバイト数を取得します。 UINT GetLength() const{return m_nDataSize;}; //演奏予定の音源データ数を取得します。 UINT GetSamples() const{return (m_nDataSize)?m_nDataSize/m_wfx.nBlockAlign:0;}; //指定の演奏時間から演奏位置を設定します。 void SetPastTime(UINT nTime){m_indexSample=(UINT)(((double)nTime*(double)m_wfx.nSamplesPerSec/1000.0)+0.5);}; //現在の演奏時間を取得します。 UINT GetPastTime() const{return (UINT)((double)m_indexSample*1000.0/(double)m_wfx.nSamplesPerSec+0.5);}; //総演奏予定時間を取得します。(オーバーライド) virtual UINT GetTotalTime() const{return (UINT)((double)GetSamples()*1000.0/(double)m_wfx.nSamplesPerSec+0.5);}; //ファイルのWAVEFORMATEX構造体を取得します。 int GetWaveFormat(LPWAVEFORMATEX pwfx=NULL) const; protected: //WAVEファイルヘッダーを読み込み、WAVEFORMATEX構造体を取得します。 BOOL ReadHeader(HMMIO hmmio); //Wave音源データをファイルストリームに書き込みます。(オーバーライド) virtual BOOL WaveStreamOut(HMMIO hmmio); //派生クラスから書き込み用のバッファサイズを取得します。(オーバーライド) //(オーバーライドしない場合、Waveファイルの音源データを読み込むバッファサイズは、 //100_秒演奏するのに必要なサイズとします。) virtual UINT GetSizeOfSaveBuffer() const{return m_wfx.nAvgBytesPerSec/10;}; //ファイル保存時に、メンバー変数に指定のあるコールバック関数を呼び出します。 // 戻り値=TRUE:保存継続、[FALSE]:保存中止。 BOOL SaveCallBack(int percent,LPCTSTR lpszMessage=NULL); //データストリームをリセットします。(オーバーライド) virtual void ResetStream(){Stop(0);}; //INFOチャンク内のメタデータを読み込みます。 BOOL ReadListINFO(HMMIO hmmio); //INFOチャンクを新たに作成して、メタデータを書き込みます。 BOOL WriteListINFO(HMMIO hmmio); HMMIO m_hmmio; //読み込みファイルハンドル MMCKINFO m_mmckRiff; //現在読み込み中のRIFFチャンクのMMCKINFO構造体 MMCKINFO m_mmckData; //現在読み込み中のdataチャンクのMMCKINFO構造体 LONG m_posStart; //音源データの開始位置 WAVEFORMATEX m_wfx; //ファイルのWAVEFORMATEX構造体 UINT m_indexSample; //現在の演奏位置 UINT m_nDataSize; //wave音源データバイト数 CString m_strPathName; //現在演奏中のパス名 //ファイル保存時に呼び出される、コールバック関数へのポインタと引数を保存します。 SAVECALLBACK m_lpfnSaveCallBack; LPVOID m_lpSaveParam; CString m_strPostMsg; //コールバック関数にポストする文字列を一時格納します。 CString m_strFileType; //ファイル形式文字列を格納します。(例:"WAV") public: //現在演奏中のパス名の取得 LPCTSTR GetPathName() const{return m_strPathName;}; //現在演奏中のファイル形式文字列を取得します。 LPCTSTR GetFileType() const{return m_strFileType;}; /* チャンクタグ一覧 [ 0]:メディア元 ISRC [ 1]:作成日 ICRD [ 2]:アルバム名 IPRD [ 3]:曲名 INAM [ 4]:ジャンル IGNR [ 5]:コメント ICMT [ 6]:アーティスト IART [ 7]:著作権代理人 ICMS [ 8]:著作権情報 ICOP [ 9]:録音エンジニア IENG [10]:ソフトウェア ISFT [11]:キーワード IKEY [12]:エンコード技術者 ITCH [13]:タイトル ISBJ [14]:トラック番号 ITRK */ #define LIST_INFO_CHUNK_COUNT 15 protected: //INFOチャンク文字列格納用CStringクラス CString m_strChunkText[LIST_INFO_CHUNK_COUNT]; public: //INFOチャンク文字列数の取得 UINT GetChunkCount() const{return LIST_INFO_CHUNK_COUNT;}; //タグ文字列の取得 LPCSTR GetChunkTagByIndex(UINT index) const; //INFOチャンク文字列の取得 LPCTSTR GetChunkTextByIndex(UINT index) const; //INFOチャンク文字列の検索 LPCTSTR FindChunkTextByTag(LPCSTR lpszTag) const; //INFOチャンク文字列の設定 void SetChunkTextByTag(LPCSTR lpszTag,LPCTSTR lpszText); //INFOチャンク文字列の設定 void SetChunkTextByIndex(UINT index,LPCTSTR lpszText); //タグの詳細記述の取得 LPCTSTR ChunkDescription(LPCSTR lpszTag) const; //INFOチャンク文字列の削除 void DeleteChunkByTag(LPCSTR lpszTag); //INFOチャンク文字列の削除 void DeleteChunkByIndex(UINT index); //すべてのINFOチャンク文字列の削除 void DeleteAllINFOChunk(); }; //演奏を停止します。 inline void CWaveFile::Stop(UINT indexSample) { //WAVE出力デバイスを停止します。 CWaveOut::Stop(); //引数が-1以外の場合にのみ、指定の演奏位置に移動します。 if (indexSample<-1) SetPos(indexSample); } //演奏位置を設定します。 inline void CWaveFile::SetPos(UINT nPos) { UINT nSamples=GetSamples(); m_indexSample=(nPos=GetChunkCount()) return FALSE; return (LPCTSTR)m_strChunkText[index]; } //INFOチャンク文字列の設定 inline void CWaveFile::SetChunkTextByIndex(UINT index,LPCTSTR lpszText) { if (index