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

BREW C++ プログラミング 逆引きコード集 : サウンド

C++ で作成されたBREW アプリで、サウンドを扱う方法です。
SophiaFramework を用いています。

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

qcp 形式のサウンドを再生する

qcp 形式のサウンドを再生するには、以下の手順を行います。

// クラスのメンバ変数として宣言する
SFBMediaSmp         _media;
AEEMediaData        _mdata;
SFXAnsiString       _filename;

// IMediaQCP インターフェースを取得して、メディアデータを設定する
if ((_media = SFBMediaQCP::NewInstance()) != null) {

    // AEEMediaData 構造体にメディアデータを設定する
    _mdata.clsData  = MMD_FILE_NAME;
    _mdata.pData    = const_cast(_filename.GetCString());
    _mdata.dwSize   = 0;

    // メディアデータを設定する
    error = _media->SetMediaData(&_mdata);

   if (error == SFERR_NO_ERROR) {
       error = _media->Play();    // サウンドを再生する
   }

}else {
    error = SFERR_NO_MEMORY;
}

if (error != SFERR_NO_ERROR) {
    // エラー処理
}

MIF ファイルの特権レベル 「ファイル」 にチェックを入れてください。
正常に動作しない可能性があります。

      

SMAF ファイル (音声ファイル) をリソースからロードして再生する

SMAF ファイル (音声ファイル) をリソースからロードして再生するには、以下の手順を行います。

1. リソースファイルからバイナリデータ読み込み

SFBMediaMMFSmp media;
AEEMediaData data;
SFXAnsiString file;
VoidPtr res_data;

if ((res_data = SFBShell::GetInstance()->LoadResData(
    "MyResource.bar", 1000, RESTYPE_BINARY)) != null) {
    // 取得成功
}

2. メモリブロックの再生

data.clsData = MMD_BUFFER;
data.pData = res_data;
data.dwSize = 0;

if (media->SetMediaData(&data) == SFERR_NO_ERROR) {
    media->Play();
}

3. リソースデータの解放

media->Stop();
SFBShell::GetInstance()->FreeResData(res_data);

再生中はリソースから取得したメモリブロックは解放してはいけません。

SMAF ファイルを実際に再生できるかどうかは機種に依存します。

参照 SFBShell::LoadResData | SFBMediaMMF::SetMediaData |
SFBMediaMMF::Play | SFBMediaMMF::Stop | SFBShell::FreeResData