/* * COggFileReaderクラスのインタフェースを記述するためのファイルです。 * Author: AKIYAMA Kouhei * Created: 2002-09-28 */ #ifndef SSLIB2_OGG_FILE_READER_H_INCLUDED #define SSLIB2_OGG_FILE_READER_H_INCLUDED #include #include "WaveReader.h" namespace sslib2 { /** * ov_open_callbacks用のファイル識別子クラスです。 * ov_open_callbacksにはFILE*の代わりにこのオブジェクトへのポインタを引き渡します。 */ class COggWin32File { private: HANDLE m_fileHandle; DWORD m_offset; DWORD m_size; public: /** * 開いていないファイル識別子を構築します。 */ COggWin32File() : m_fileHandle(INVALID_HANDLE_VALUE) , m_offset(0) , m_size(0) {} /** * fileHandle内のoffsetとsizeで表される領域をアクセスするファイル識別子を構築します。 */ COggWin32File(HANDLE fileHandle, DWORD offset, DWORD size) : m_fileHandle(fileHandle) , m_offset(offset) , m_size(size) {} inline HANDLE GetHandle(void) const { return m_fileHandle;} inline DWORD GetOffset(void) const { return m_offset;} inline DWORD GetSize(void) const { return m_size;} bool IsOpen(void) const { return (m_fileHandle != INVALID_HANDLE_VALUE);} bool Open(const char *name); void Close(void) { CallbackClose(this);} public: static ov_callbacks oggCallbacks; static size_t CallbackRead (void *ptr, size_t size, size_t nmemb, void *datasource); static int CallbackSeek (void *datasource, ogg_int64_t offset, int whence); static int CallbackClose (void *datasource); static long CallbackTell (void *datasource); }; /** * oggファイルからwaveデータを取り出すためのクラスです。 */ class COggFileReader : public CWaveReader { private: COggWin32File m_file; OggVorbis_File m_vf; PCMWAVEFORMAT m_pcmwf; DWORD m_totalSamples; bool m_terminated; public: COggFileReader(); virtual ~COggFileReader(); bool Open(const char *filename); 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; bool Open(const COggWin32File &file); }; } #endif