#pragma once // CSoundFile command target #include "CDDAFile.h" #include #include #pragma comment(lib, "msacm32.lib") //ドライバーIDリストの取得 BOOL __stdcall _GetAcmDriverIDList(CObArray& listDriverId); //ドライバーIDの検索(ドライバー名で検索) HACMDRIVERID __stdcall _FindAcmDriverID(LPCTSTR lpszDriverName); //短いドライバー名の取得 CString __stdcall _GetAcmDriverShortName(HACMDRIVERID hadid); //長いドライバー名の取得 CString __stdcall _GetAcmDriverLongName(HACMDRIVERID hadid); //指定ドライバーIDの指定フォーマットタグ内で、 //指定フォーマット番号の、WAVEFORMATEX構造体を取得します。 BOOL __stdcall _GetAcmDriverWaveFormat(HACMDRIVERID hadid,WORD wFormatTag,DWORD dwFormatIndex,LPWAVEFORMATEX pwfx,int iFormatSize); //ドライバーIDの取得 HACMDRIVERID __stdcall _GetDriverIDSuggest(LPWAVEFORMATEX pwfxSrc,LPWAVEFORMATEX pwfxDst,DWORD cbwfxDst); class CMP3File : public CDDAFile { public: //コンストラクタ CMP3File(CWnd* pWndOwner=NULL); //デストラクタ virtual ~CMP3File(); //メンバー変数の初期化 void Init(); //メンバー変数の削除 virtual void Delete(); //MP3ファイルがオープンされているかどうか?(オーバーライド) virtual BOOL IsMP3File(){return ((m_hAcmStream!=NULL)&&(m_iLayer>0));}; //読み込み中のデバイスハンドルの有効/無効を基底クラスに返します。(オーバーライド) virtual BOOL IsOpen(){return (IsMP3File())? TRUE:CDDAFile::IsOpen();}; //MP3からWave音源に変換してストリーム読み込み(オーバーライド) virtual UINT StreamIn(LPVOID pBuffer,UINT nBufSize,UINT* pIndexSample); //現在システムによって推奨されているドライバーIDの取得 void GetDriverIDSuggest(HACMDRIVERID* phadidEnc=NULL,HACMDRIVERID* phadidDec=NULL); //ドライバーIDの取得 void GetDriverID(HACMDRIVERID* phadidEnc=NULL,HACMDRIVERID* phadidDec=NULL); //ドライバーIDの設定 void SetDriverID(HACMDRIVERID hadidEnc=(HACMDRIVERID)-1,HACMDRIVERID hadidDec=(HACMDRIVERID)-1); //MPEGLAYER3WAVEFORMAT構造体の取得 BOOL GetMpegLayer3WaveFormat(MPEGLAYER3WAVEFORMAT* pmp3wfEnc=NULL, MPEGLAYER3WAVEFORMAT* pmp3wfDec=NULL); //MPEGLAYER3WAVEFORMAT構造体の設定 void SetMpegLayer3WaveFormat(MPEGLAYER3WAVEFORMAT* pmp3wfEnc=NULL, MPEGLAYER3WAVEFORMAT* pmp3wfDec=NULL); private: //MPEGLAYER3WAVEFORMAT構造体の作成 BOOL FillMpegLayer3WaveFormat(MPEGLAYER3WAVEFORMAT* pmp3wf); protected: //MP3ファイルを開きます。(オーバーライド) // lpszFileName:ファイルのパス名 virtual BOOL ReadFile(LPCTSTR lpszFileName); //MP3ヘッダーの読み込み BOOL ReadHeader(CFile* infile); //MP3ファイルの書き込み(オーバーライド) virtual BOOL WriteFile(LPCTSTR lpszFileName); //MP3ストリームの書き込み BOOL StreamOut(CFile* outfile,HACMDRIVERID hadid=NULL,MPEGLAYER3WAVEFORMAT* pmp3wf=NULL); //基底クラスに読み込み用のバッファサイズを戻します。(オーバーライド) virtual UINT GetSizeOfLoadBuffer(); //基底クラスに書き込み用のバッファサイズを戻します。(オーバーライド) virtual UINT GetSizeOfSaveBuffer(); //メタデータを残したままで、ファイルを再度開き直します。(オーバーライド) virtual BOOL ResetStream(); public: CFile* m_infile; //Mp3ファイル読込みのためのCFileクラスへのポインタ enum{CBR,ABR,VBR}; //エンコードビットレート形式(CBR/ABR/VBR) protected: MPEGLAYER3WAVEFORMAT m_mp3wfEnc;//エンコード用MPEGLAYER3WAVEFORMAT MPEGLAYER3WAVEFORMAT m_mp3wfDec;//デコード用MPEGLAYER3WAVEFORMAT HACMDRIVERID m_hDriverIdEnc; //エンコード用ACMドライバーID HACMDRIVERID m_hDriverIdDec; //デコード用ACMドライバーID HACMDRIVER m_hDriver; //ACMドライバーハンドル HACMSTREAM m_hAcmStream; //ACMストリームハンドル ACMSTREAMHEADER m_AcmStreamHeader;//ACMSTREAMHEADER構造体 int m_iVersion; //MPEGバージョン番号 int m_iLayer; //MPEGレイヤー int m_iBitRate; //ビットレート int m_iAveBitRate; //平均ビットレート UINT m_nFrames; //フレーム数 DWORD m_dwStreamSize; //MP3ストリームサイズ UINT m_uFlagBitRate; //ビットレートフラグ(CBR/ABR/VBR) UINT m_vbrQuality; //VBR品質((高)0〜100(低)) BYTE m_vbrTOC[100]; //VBR TOCエントリー DWORD m_sizeFrame; //第一フレームのサイズ DWORD m_dwSkipOffset; //第一フレームヘッダの位置 DWORD m_sizeAveFrameDecoded; //デコード後のフレームデータサイズの平均値 CByteArray m_byteSrcBuf; //デコード時の転送元バッファ CByteArray m_byteDstBuf; //デコード時の転送先バッファ public: //MPEGバージョン番号の取得 int GetVersion(){return m_iVersion;}; //MPEGレイヤーの取得 int GetLayer(){return m_iLayer;}; //ビットレートの取得 int GetBitRate(){return m_iBitRate;}; //フレームサイズの取得 DWORD GetFrameSize(){return m_sizeFrame;}; //平均ビットレートの取得 int GetAveBitRate(){return m_iAveBitRate;}; //フレーム数の取得 UINT GetFrameCount(){return m_nFrames;}; //MP3ストリームサイズの取得 DWORD GetStreamSize(){return m_dwStreamSize;}; //ビットレートフラグの取得(0:CBR,1:ABR,2:VBR) UINT GetBitRateFlag(){return m_uFlagBitRate;}; //VBR品質の取得((高)0〜100(低)) UINT GetVBRQuality(){return m_vbrQuality;}; //VBR TOCエントリーの取得 BYTE GetVBRTOC(int index){return m_vbrTOC[index];}; CByteArray m_byteID3v1; //ID3v1タグの生データ CByteArray m_byteID3v22; //ID3v2.2タグの生データ CByteArray m_byteID3v23; //ID3v2.3タグの生データ CByteArray m_byteID3v24; //ID3v2.4タグの生データ DWORD m_ID3v1Version; //ID3v1バージョン番号 DWORD m_ID3v22Version; //ID3v2.2バージョン番号 DWORD m_ID3v23Version; //ID3v2.3バージョン番号 DWORD m_ID3v24Version; //ID3v2.4バージョン番号 }; //MPEGLAYER3WAVEFORMAT構造体の設定 inline void CMP3File::SetMpegLayer3WaveFormat(MPEGLAYER3WAVEFORMAT* pmp3wfEnc, MPEGLAYER3WAVEFORMAT* pmp3wfDec) { if (AfxIsValidAddress(pmp3wfEnc,sizeof(MPEGLAYER3WAVEFORMAT),TRUE)) ::CopyMemory(&m_mp3wfEnc,pmp3wfEnc,sizeof(MPEGLAYER3WAVEFORMAT)); if (AfxIsValidAddress(pmp3wfDec,sizeof(MPEGLAYER3WAVEFORMAT),TRUE)) ::CopyMemory(&m_mp3wfDec,pmp3wfDec,sizeof(MPEGLAYER3WAVEFORMAT)); } //ドライバーIDの設定 inline void CMP3File::SetDriverID(HACMDRIVERID hadidEnc,HACMDRIVERID hadidDec) { if (hadidEnc!=(HACMDRIVERID)-1) m_hDriverIdEnc=hadidEnc; if (hadidDec!=(HACMDRIVERID)-1) m_hDriverIdDec=hadidDec; }