我们在分析声音播放杂音的时候,经常需要把音频解码出来的声音截取,以便判断声音出问题是在解码后,还是在AudioFlinger混音的时候,或者是Audio硬件设备的问题。
那么我们可以在以下2个地方,分别截取PCM数据:
services/audioflinger/Threads.cpp的如下函数
ssize_t AudioFlinger::PlaybackThread::threadLoop_write()
} else {
bytesWritten = framesWritten;
}
+
+
+ int tmpFd = open("/data/audio/AudioFlinger.pcm", O_WRONLY | O_APPEND);
+ if ( tmpFd < 0 ) {
+ ALOGE("Creat AF dump file failed!");
+ } else {
+ write(tmpFd, mSinkBuffer + offset, bytesWritten);
+ close(tmpFd);
+ }
+
这个地方是AudioFlinger往Audio输出设备写音频数据的地方,如果此处的音频数据不没有问题,那基本可以确定播放杂音是硬件的问题,与Frameworker关系不大。
解码后的音频数据,我们可以在在AudioTrack与AudioFlinger交换的地方截取,在如下函数地方
nsecs_t AudioTrack::processAudioBuffer(),音频数据保存方式可参考上面。
这2个地方只是个人觉得比较适合的地方,PCM数据的截取对于分析很多音频播放有很打帮助,PCM数据的播放可用coolEdit播放。