ホーム > デベロッパ > SophiaFramework > BREW C++ 逆引きコード集

BREW C++ プログラミング : SophiaFramework 逆引き FAQ・コード集

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;
}