Android 2.3.4,OpenSL ES和巨大的日志垃圾邮件,原因不明

时间:2013-06-05 19:59:17

标签: android android-ndk android-2.3-gingerbread opensl

我创建的一个应用程序会在客户的设备上导致大量的日志垃圾邮件:

我在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。

我google了一下,发现日志条目来自Android源AudioTrack,我在这里找到:

https://android.googlesource.com/platform/frameworks/base/+/android-2.2.3_r2.1/media/libmedia/AudioTrack.cpp

在start()函数的开头是日志记录:

LOGV("start %p", this);

但是每次新的缓冲区入队时,OpenSL是否会隐式调用play()?我在这里查看了OpenSL的规范:http://www.khronos.org/registry/sles/specs/OpenSL_ES_Specification_1.0.1.pdf

在页面174上,他们说“当播放器处于由SLPlayItf接口控制的SL_PLAYSTATE_PLAYING状态[参见第8.32节]时,添加缓冲区将隐式开始播放。如果由于队列中的缓冲区不足而导致饥饿播放音频数据停止。播放器保持SL_PLAYSTATE_PLAYING状态。排队其他缓冲区后,音频数据的播放恢复。请注意,排队缓冲区的饥饿会导致音频数据流中出现可听见的间隙。如果没有处于播放状态,添加缓冲区不会启动音频播放。“

由于手机没有噼里啪啦,我认为音频仍然播放得很好,文档中的描述听起来好像他们总是隐含地开始播放,这实际上意味着我没有机会阻止这个日志垃圾邮件。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

恕我直言,取决于很多,并且从Android的版本到版本,从制造商到制造商......

我不确定为什么最终客户会对日志感到困扰,但我只是在logcat中使用过滤器来忽略它。简单的解决方案可能是最好的,特别是当垃圾邮件的源代码来自android:s时

答案 1 :(得分:0)

主要取决于设备的供应商。请尝试不同的设备,可能你不会看到这些日志,但你可以体验不同的日志。除了向LogCat添加过滤器之外,您无法执行任何操作。