/* * CStreamSoundBufferクラスのインタフェースを記述するためのファイルです。 * Author: AKIYAMA Kouhei * Created: 2002-09-26 */ #ifndef SSLIB2_STREAM_SOUND_BUFFER_H_INCLUDED #define SSLIB2_STREAM_SOUND_BUFFER_H_INCLUDED /* * スレッドの作成に_beginthreadを使うなら1、CreateThreadを使うなら0を指定してください。 * 1のときはマルチスレッドライブラリを指定しないとコンパイルできないと思う。 */ #ifdef SSLIB2_STREAM_SOUND_BUFFER__USE_CRUNTIME # define SSLIB2_STREAM_SOUND_BUFFER__USE_CRUNTIME 1 #endif #ifndef DIRECTSOUND_VERSION # define DIRECTSOUND_VERSION 0x0300 //←変更したいならコンパイルオプション/Dで指定すること #endif #include #include #include #include "SoundBuffer.h" namespace sslib2 { class CWaveReader; /** * ストリーム再生方式のサウンドバッファクラスです。 * このクラスは割り当てられたCWaveReaderインタフェースを持つオブジェクトから * PCMデータを順次取りだしながら演奏します。 */ class CStreamSoundBuffer : public CSoundBuffer { //属性、関連 private: CRITICAL_SECTION m_cs; //↓Createメソッドでセットされる変数 boost::shared_ptr m_pReader; //データソース CComPtr m_pStreamBuffer;//DSストリームバッファ DWORD m_bufferSize; //バッファのバイト数 DWORD m_bufferNotifySize; //ブロックのバイト数(通知する間隔) HANDLE m_notifyEvent[2]; //通知用イベントオブジェクトのハンドル PCMWAVEFORMAT m_pcmwf; //演奏するwaveのフォーマット #if SSLIB2_STREAM_SOUND_BUFFER__USE_CRUNTIME DWORD m_threadHandle; //演奏監視用スレッドのハンドル #else HANDLE m_threadHandle; //演奏監視用スレッドのハンドル #endif //↓Playメソッドでセットされる変数 DWORD m_nextWrite; //m_pStreamBuffer上の書き込みオフセット(byte) DWORD m_nextRead; //読み込みオフセット(byte) DWORD m_loopIn; //ループインオフセット(byte) DWORD m_loopOut; //ループアウトオフセット(byte) DWORD m_total; //全データバイト数(byte) int m_loop; //残りループ数(-1のときは無限を意味する) int m_validBlocks; //有効なブロックの個数 //定数 enum{ NUM_PLAY_NOTIFICATIONS = 16};//ブロック数 enum{ BUFFER_TIME = 3};//ストリームバッファの秒数 //公開操作 public: CStreamSoundBuffer(); virtual ~CStreamSoundBuffer(); bool Create(const CComPtr &pds, boost::shared_ptr reader); //CSoundBufferインタフェース virtual bool Play(void); virtual bool Stop(void); virtual bool IsPlaying(void); virtual bool SetVolume(LONG vol); virtual bool GetVolume(LONG *vol); //非公開操作 private: #if SSLIB2_STREAM_SOUND_BUFFER__USE_CRUNTIME static void HandleNotificationsStatic(void *pThis); #else static DWORD WINAPI HandleNotificationsStatic(LPVOID pThis); #endif void HandleNotifications(void); bool FillBlock(void); }; } #endif