【Qualcomm高通音频】如何通过上层代码修改dump音频数据流进行问题分析呢?

如何通过上层代码修改dump音频数据流

我们在分析杂音等问题的时候, 只抓adb log是不够的, dump audio的数据能直观快速的判断是哪一块出了问题, 这里只针对高通平台

1. 如何在Frameworks层音频数据dump

 
  1. //代码路径:frameworks/av/services/audioflinger/Tracks.cpp#getNextBuffer

  2. status_t AudioFlinger::PlaybackThread::Track::getNextBuffer(

  3. AudioBufferProvider::Buffer* buffer){

  4. ServerProxy::Buffer buf;

  5. size_t desiredFrames = buffer->frameCount;

  6. buf.mFrameCount = desiredFrames;

  7. status_t status = mServerProxy->obtainBuffer(&buf);

  8. buffer->frameCount = buf.mFrameCount;

  9. buffer->raw = buf.mRaw;

  10. if (buf.mFrameCount == 0) {

  11. mAudioTrackServerProxy->tallyUnderrunFrames(desiredFrames);

  12. } else {

  13. mAudioTrackServerProxy->tallyUnderrunFrames(0);

  14. }

  15. int tmpFd = ::open("/data/misc/audio/dumpTrack.pcm", O_CREAT | O_WRONLY | O_APPEND, 0777);

  16. if ( tmpFd < 0 ) {

  17. ALOGE("Tracks.cpp Fail to open dumpTrack file");

  18. } else {

  19. ::write(tmpFd, buffer->raw, buffer->frameCount * TrackBase::mChannelCount * 2);

  20. ::close(tmpFd);

  21. }

  22. return status;

  23. }

2. 如何在HAL层音频数据dump

 
  1. //hardware/qcom/audio/hal/audio_hw.c#out_write

  2. static ssize_t out_write(struct audio_stream_out *stream, const void *buffer,size_t bytes){

  3. struct stream_out *out = (struct stream_out *)stream;

  4. struct audio_device *adev = out->dev;

  5. ssize_t ret = 0;

  6. ......

  7. } else {

  8. if (out->pcm) {

  9. if (out->muted)

  10. memset((void *)buffer, 0, bytes);

  11. ALOGVV("%s: writing buffer (%d bytes) to pcm device", __func__, bytes);

  12. int tmpFd = open("/data/misc/audio/dumpTrack_hal.pcm", O_CREAT | O_WRONLY | O_APPEND, 0777);

  13.  
  14. if ( tmpFd < 0 ) {

  15. ALOGE("Fail to open dumpTrack_hal file");

  16. } else {

  17. write(tmpFd, buffer, bytes);

  18. close(tmpFd);

  19. }

  20. if (adev->adm_request_focus)

  21. adev->adm_request_focus(adev->adm_data, out->handle);

  22. if (out->usecase == USECASE_AUDIO_PLAYBACK_AFE_PROXY) {

  23. ret = pcm_mmap_write(out->pcm, (void *)buffer, bytes);

  24. }

  25. else

  26. ret = pcm_write(out->pcm, (void *)buffer, bytes);

  27. if (ret == 0)

  28. out->written += bytes / (out->config.channels * sizeof(short));

  29. if (adev->adm_abandon_focus)

  30. adev->adm_abandon_focus(adev->adm_data, out->handle);

  31. }

  32. }

  33. exit:

  34. pthread_mutex_unlock(&out->lock);

  35. if (ret != 0) {

  36. if (out->pcm)

  37. ALOGE("%s: error %zu - %s", __func__, ret, pcm_get_error(out->pcm));

  38. out_standby(&out->stream.common);

  39. usleep(bytes * 1000000 / audio_stream_out_frame_size(stream) /

  40. out_get_sample_rate(&out->stream.common));

  41. }

  42. return bytes;

  43. }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值