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