私が作成した 1 つのアプリは、顧客のデバイスで大規模なログ スパムを引き起こします。
リアルタイム オーディオ生成のために、NDK 環境で OpenSL を使用しています。SLAndroidSimpleBufferQueueItf の Enqueue() 関数を使用するたびに、android はログ エントリを作成します。これは、その呼び出しがオーディオ インターフェイスで暗黙的に play() を呼び出すためです。
これは次のようになります。
........app start........
06-05 21:36:48.619: I/System.out(10081): Debugger has connected
06-05 21:36:48.619: I/System.out(10081): waiting for debugger to settle...
06-05 21:36:48.819: I/System.out(10081): waiting for debugger to settle...
06-05 21:36:50.419: I/System.out(10081): waiting for debugger to settle...
06-05 21:36:50.619: I/System.out(10081): waiting for debugger to settle...
06-05 21:36:50.829: I/System.out(10081): debugger has settled (1491)
// ....some other unimportant logging stuff was here ....
06-05 21:36:53.359: D/execute(10081): Creating audio output OpenSLES
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Creating the engine
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Realizing engine
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): retrieving engine interface
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Creating output mix
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Realizing output mix
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Configuring audio source
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Configuring audio sink
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Creating audio player
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): realizing the player
// Who is that? I assume Android itself....
06-05 21:36:53.379: D/AudioTrack(10081): Request AudioFlinger to create track
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): Retrieving play interface
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): get buffer queue interface
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): registering buffer queue callback
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): Retrieving effect send interface
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): getting volume interface
06-05 21:36:53.379: D/execute(10081): First process call...
06-05 21:36:53.379: D/execute(10081): Will start playback
06-05 21:36:53.379: D/play(10081): Starting playback
// And the show starts here: Every time I Enqueue audio data in my C++ code, this log entry appears.
06-05 21:36:53.379: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.389: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.409: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.609: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.629: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.679: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.739: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.759: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.819: D/AudioTrack(10081): start 0x1f7bf8
....... and so on
これは、新しいオーディオ バッファを OpenSLES にエンキューする方法です。
bool SE::AudioOutputOpenSLES::enqueueBuffer( void* _buffer, unsigned int _byteSize )
{
SLresult result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, _buffer, _byteSize );
return( result == SL_RESULT_SUCCESS );
}
OpenSLES はその呼び出しについて文句を言わず、SL_RESULT_SUCCESS を返します。
少しググったところ、ログ エントリが Android ソースの AudioTrack からのものであることがわかりました。
start() 関数の先頭にログがあります。
LOGV("start %p", this);
しかし、新しいバッファがキューに入れられるたびに OpenSL が暗黙のうちに play() を呼び出すようにしている理由は何でしょうか? ここで OpenSL の仕様を確認しました: http://www.khronos.org/registry/sles/specs/OpenSL_ES_Specification_1.0.1.pdf
174 ページで、「プレーヤーが SLPlayItf インターフェイス [セクション 8.32 を参照] によって制御される SL_PLAYSTATE_PLAYING 状態にある場合、バッファーを追加すると、暗黙的に再生が開始されます。キュー内のバッファーが不十分なために飢餓状態になった場合、再生はオーディオ データの停止. プレーヤーは SL_PLAYSTATE_PLAYING 状態のままです. 追加のバッファーをキューに入れると、オーディオ データの再生が再開されます. キューに入れられたバッファーが不足すると、オーディオ データ ストリームに可聴ギャップが生じることに注意してください.再生中の状態では、バッファを追加してもオーディオの再生は開始されません。」
電話はパチパチ音をたてていないので、オーディオはまだうまく再生されていると思います。ドキュメントのこの説明は、常に暗黙的に再生を開始するように聞こえます。これは、このログのスパムを防ぐ機会がないことを意味します.
何か案は?