/* * CAcmWavFileReaderクラスのインタフェースを記述するためのファイルです。 * Author: AKIYAMA Kouhei * Created: 2002-09-27 */ #ifndef SSLIB2_ACM_WAV_FILE_READER_H_INCLUDED #define SSLIB2_ACM_WAV_FILE_READER_H_INCLUDED #include #include #include #include "WaveReader.h" namespace sslib2 { /** * ACMを使ってWAVファイルからデータを読み込みためのクラスです。 */ class CAcmWavFileReader : public CWaveReader { private: HANDLE m_fileHandle; DWORD m_topPtr;//dataチャンク先頭のファイル内での位置 DWORD m_totalSize;//dataチャンクのサイズ DWORD m_remainSize;//ファイルの残り DWORD m_totalSamples;//変換後のサンプル数(概算) DWORD m_tellPtr;//Readメソッドで次に読める全サンプル中のバイト位置 bool m_terminated;//これ以上Readメソッドを呼んでも何も出ないことを示す。(Seek時にリセット) bool m_acmHandleValid; HACMSTREAM m_acmHandle; //変換元バッファ std::vector m_srcFmt; inline WAVEFORMATEX *GetSrcFormat(void) { return m_srcFmt.empty() ? NULL : ((WAVEFORMATEX*)&m_srcFmt[0]); } std::vector m_srcBuffer; DWORD m_srcBufferSize; //m_srcBuffer.size()と同じなはず DWORD m_srcBufferValidSize; //m_srcBuffer[0]〜m_srcBuffer[m_srcBufferValidSize-1]まで有効であることを示す //変換先バッファ WAVEFORMATEX m_dstFmt; inline WAVEFORMATEX *GetDstFormat(void) { return &m_dstFmt; } std::vector m_dstBuffer; DWORD m_dstBufferSize; //m_dstBuffer.size()と同じはず DWORD m_dstBufferPtr; //m_dstBuffer[m_dstBufferPtr]から↓ DWORD m_dstBufferValidSize; //m_dstBuffer[m_dstBufferPtr+m_dstBufferValidSize-1]まで有効であることを示す //公開操作 public: CAcmWavFileReader(); virtual ~CAcmWavFileReader(); bool Open(const char *filename); bool Open(HANDLE fileHandle, const BYTE *fmt, DWORD fmtSize, DWORD dataOffset, DWORD dataSize); virtual void Close(void); virtual bool IsOpen(void) const; virtual bool Read(void *dst, unsigned long size, unsigned long *read); virtual bool Seek(unsigned long sample); virtual unsigned long Tell(void) const; virtual bool IsTerminated(void) const; virtual PCMWAVEFORMAT GetFormat(void) const; virtual unsigned long GetTotal(void) const; virtual unsigned long GetLoopIn(void) const; virtual unsigned long GetLoopOut(void) const; virtual int GetLoopCount(void) const; virtual bool GetStreamFlag(void) const; //非公開操作 private: void CloseFileHandle(void); void CloseAcmHandle(void); void FillSrcBuffer(void); void EraseSrcBuffer(DWORD size); bool Convert(void); }; } #endif