Android2.3用OpenSL ESを使用するサウンドプログラミングの流れ

(2012 追記)以下の内容は読まずこちらを参考にしてください http://d.hatena.ne.jp/miujun/20120307


エンジンを作る

result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);

エンジンを実現する、リアライズってどう訳すのかわからないのだが。

result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);

ここが次に作る出力を作る(SLEngineItf)engineEngineをインターフェイスにセットするという感じだと思う

result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);

出力を作る。(SLEngineItf)engineEngineは出力やプレイヤーを作る

result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 1, ids, req);

出力を実現する

result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE);

オーディオ・プレイヤーを作る

result = (*engineEngine)->CreateAudioPlayer(engineEngine, &bqPlayerObject, &audioSrc, &audioSnk, 2, ids, req);

オーディオ・プレイヤーを実現する

result = (*bqPlayerObject)->Realize(bqPlayerObject, SL_BOOLEAN_FALSE);

プレイヤーのインターフェイスを取得し、そのインターフェイスにプレイヤーの再生状態を管理するインターフェイスをセットする感じか

result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_PLAY, &bqPlayerPlay);

バッファーのインターフェイスを取得する

result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_BUFFERQUEUE, &bqPlayerBufferQueue);

バッファにコールバック関数を登録する。再帰的に関数bqPlayerCallbackが呼ばれるのでこの中でサウンドを生成する。

result = (*bqPlayerBufferQueue)->RegisterCallback(bqPlayerBufferQueue, bqPlayerCallback, NULL);

プレイヤーの状態を再生中にする。

result = (*bqPlayerPlay)->SetPlayState(bqPlayerPlay, SL_PLAYSTATE_PLAYING);

バッファにデータを追加、nextBufferに波形を渡す。

result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, nextBuffer, nextSize);

関数bqPlayerCallbackの中で波形を生成する関数を実行すれば良い

void bqPlayerCallback(SLAndroidSimpleBufferQueueItf bq, void *context)
{
    SLresult result;
    result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, nextBuffer, nextSize);
}