qcp 形式のサウンド( 音声 )を連続再生する
qcp 形式のサウンド( 音声 )を連続再生するとき、SFBMediaQCP::RegisterNotify 関数で登録されたコールバック関数内では SFBMediaQCP クラスのインスタンスを解放できません。
SFBMediaQCP クラスのインスタンスを解放するには、 SFXTask クラスを使って以下のように記述します。
SFMTYPEDEFCLASS(SoundSample) class SoundSample : public SFCApplication { SFMSEALCOPY(SoundSample) public: // コールバック関数 static Void OnMediaSHP(VoidPtr reference, AEEMediaCmdNotify* notify); // 実際のコールバック関数 Void OnMedia(AEEMediaCmdNotify* notify); // コールバック関数( SFXTask クラス ) CALLBACK_DECLARE_SFXTASK(OnTask) private: // アプリ開始 Void SoundStart(Void); ... SFBMediaQCPSmp _media; AEEMediaData _mdata; SFXAnsiString _filename; VoidPtr _reference; SFXTask _task; }; Void SoundSample::SoundStart(Void) { SFCError error; // SFBMediaQCP クラスのインスタンスの生成 if ((_media = SFBMediaQCP::NewInstance()) != null) { // メディアデータの設定 _filename = "alert.qcp"; _mdata.clsData = MMD_FILE_NAME; _mdata.pData = const_cast<ACharPtr>(_filename.GetCString()); _mdata.dwSize = 0; error = _media->SetMediaData(&_mdata); if (error == SFERR_NO_ERROR) { // コールバックを登録する error = _media->RegisterNotify(OnMediaSHP, this); if (error == SFERR_NO_ERROR) { // 再生する error = _media->Play(); } } } return; } // コールバック関数 Void SoundSample::OnMediaSHP(VoidPtr reference, AEEMediaCmdNotify* notify) { // 実際のコールバック関数を呼び出す static_cast<SoundSamplePtr>(reference)->OnMedia(notify); return; } // 実際のコールバック関数 Void SoundSample::OnMedia(AEEMediaCmdNotify* notify) { // 通知ステータスのチェック switch (notify->nStatus) { case MM_STATUS_START: // 開始 // 何か処理を記述する break; case MM_STATUS_DONE: // 正常終了時 // タスクの登録に必要な情報を設定する _task.Set(CALLBACK_FUNCTION(OnTask)); // タスクを登録する _task.Schedule(); break; case MM_STATUS_ABORT: // 異常終了時 // 何か処理を記述する break; } return; } // コールバック関数( SFXTask クラス ) CALLBACK_IMPLEMENT_SFXTASK(SoundSample, OnTask) { // メディアの再生を停止する _media->Stop(); // メディアを解放する _media.Release(); // 連続再生を行う SoundStart(); return; }