1. Audio的FW和HAL层dump PCM数据(非offload的场景,对应offload,dump出来的还是原数据)

1.抓取Systrace<1>怎么加参考:frameworks/av/services/audioflinger/Threads.cpp#define ATRACE_TAG ATRACE_TAG_AUDIOATRACE_BEGIN("write");//代码。。。ATRACE_END();<2>怎么使用Systrace参考:https://maoao530.github.io/2017/02/06/systrace/
2.混音之前dump PCM数据frameworks/av/media/libmedia/AudioTrack.cpp#include <fcntl.h>nsecs_t AudioTrack::processAudioBuffer(){{//add beginint tmpFd =::open("/data/local/test/dumpAudioTrack.pcm", O_CREAT | O_WRONLY | O_APPEND , 0777);if(tmpFd < 0){ALOGE("Fail to open dumpTrack file");}else{::write(tmpFd, audioBuffer.raw, audioBuffer.frameCount * 2/* ChannelCount*/ * 2); //第1个2:双声道 1:单声道::close(tmpFd);}}//add endreleaseBuffer(&audioBuffer);}
3、混音之后dump PCM数据frameworks/av/services/audioflinger/Tracks.cpp#include <fcntl.h>status_t AudioFlinger::PlaybackThread::Track::getNextBuffer(AudioBufferProvider::Buffer* buffer, int64_t pts __unused){{//add beginint tmpFd =::open("/data/local/test/dumpTracks.pcm", O_CREAT | O_WRONLY | O_APPEND , 0777);if(tmpFd < 0){ALOGE("Fail to open dumpTrack file");}else{::write(tmpFd, audioBuffer.raw, audioBuffer.size); }}//add endreturn status;}
注意:以上只是抓的AudioTrack播放的,AudioRecord录音的也是在nsecs_t AudioRecord::processAudioBuffer()里抓pcm录音数据。4、HAL层dump数据hardware/xxx平台/audio/tinyalsa_hal/audio_hw.c//dump PCM数据函数
<1>static void dump_out_data(const void* buffer,size_t bytes, int *size){ALOGD("dump pcm file.");static FILE* fd;static int offset = 0;if(fd == NULL) {fd=fopen("/data/local/test/dumpaudio_hw.pcm","wb+");if(fd == NULL) {ALOGD("DEBUG open /data/debug.pcm error =%d ,errno = %d",fd,errno);offset = 0;}}fwrite(buffer,bytes,1,fd);offset += bytes;fflush(fd);if(offset >= (500*1024*1024))/*大于500M停止写入*/ {*size = 0;fclose(fd);offset = 0;system("setprop media.audio.record 0");ALOGD("TEST playback pcmfile end");}}
<2>添加位置
static ssize_t out_write(struct audio_stream_out *stream, const void* buffer, size_t bytes){//add begindump_out_data(buffer, bytes, &prop_pcm);//add endchar value[PROPERTY_VALUE_MAX];property_get("media.audio.debug",value, NULL);
}

2. 如何获取当前GenericSource选中的媒体抽取器的类型(mp3,aac等)

dumpsys media.extractor

Recent extractors, most recent first:MP3Extractor for mime NULL, source TinyCacheSource(CallbackDataSource(RemoteDataSource(FileSource(fd(/data/app/com.sunmi.audio-1/base.apk), 1186524, 9423124)))), pid 750: deletedtrack {srte: (int32_t) 44100, mime: (char*) audio/mpeg, encp: (int32_t) 1236, encd: (int32_t) 576, dura: (int64_t) 235546122, brte: (int32_t) 320000, #chn: (int32_t) 2} : active<unspecified> for mime NULL, source TinyCacheSource(CallbackDataSource(RemoteDataSource(FileSource(fd(/system/media/audio/ui/KeypressInvalid.ogg), 0, 9847)))), pid 1556: activetrack {vinf: (unknown type 0, size 30), vdat: (unknown type 0, size 114), vboo: (unknown type 0, size 4038), srte: (int32_t) 44100, mxBr: (int32_t) 0, mime: (char*) audio/vorbis, lang: (char*) , inpS: (int32_t) 65307, ffmt: (char*) application/ogg, dura: (int64_t) 182000, brte: (int32_t) 239920, #chn: (int32_t) 1} : active<unspecified> for mime NULL, source TinyCacheSource(CallbackDataSource(RemoteDataSource(FileSource(fd(/system/media/audio/ui/KeypressReturn.ogg), 0, 6246)))), pid 1556: deletedtrack {vinf: (unknown type 0, size 30), vdat: (unknown type 0, size 45), vboo: (unknown type 0, size 3920), srte: (int32_t) 48000, mxBr: (int32_t) -1, mime: (char*) audio/vorbis, lang: (char*) , inpS: (int32_t) 65307, ffmt: (char*) application/ogg, dura: (int64_t) 108000, brte: (int32_t) 140000, #chn: (int32_t) 1} : deleted<unspecified> for mime NULL, source TinyCacheSource(CallbackDataSource(RemoteDataSource(FileSource(fd(/system/media/audio/ui/KeypressDelete.ogg), 0, 5832)))), pid 1556: deletedtrack {vinf: (unknown type 0, size 30), vdat: (unknown type 0, size 45), vboo: (unknown type 0, size 3920), srte: (int32_t) 48000, mxBr: (int32_t) -1, mime: (char*) audio/vorbis, lang: (char*) , inpS: (int32_t) 65307, ffmt: (char*) application/ogg, dura: (int64_t) 108000, brte: (int32_t) 140000, #chn: (int32_t) 1} : deleted<unspecified> for mime NULL, source TinyCacheSource(CallbackDataSource(RemoteDataSource(FileSource(fd(/system/media/audio/ui/Trusted.ogg), 0, 5713)))), pid 1881: activetrack {vinf: (unknown type 0, size 30), vdat: (unknown type 0, size 45), vboo: (unknown type 0, size 4225), srte: (int32_t) 48000, mxBr: (int32_t) 0, mime: (char*) audio/vorbis, lang: (char*) , inpS: (int32_t) 65307, ffmt: (char*) application/ogg, dura: (int64_t) 80000, brte: (int32_t) 160000, #chn: (int32_t) 2} : active<unspecified> for mime NULL, source TinyCacheSource(CallbackDataSource(RemoteDataSource(FileSource(fd(/system/media/audio/ui/KeypressSpacebar.ogg), 0, 5952)))), pid 1556: deletedtrack {vinf: (unknown type 0, size 30), vdat: (unknown type 0, size 45), vboo: (unknown type 0, size 3920), srte: (int32_t) 48000, mxBr: (int32_t) -1, mime: (char*) audio/vorbis, lang: (char*) , inpS: (int32_t) 65307, ffmt: (char*) application/ogg, dura: (int64_t) 108000, brte: (int32_t) 140000, #chn: (int32_t) 1} : deleted<unspecified> for mime NULL, source TinyCacheSource(CallbackDataSource(RemoteDataSource(FileSource(fd(/system/media/audio/ui/Unlock.ogg), 0, 7853)))), pid 1881: deletedtrack {vinf: (unknown type 0, size 30), vdat: (unknown type 0, size 45), vboo: (unknown type 0, size 4225), srte: (int32_t) 44100, mxBr: (int32_t) -1, mime: (char*) audio/vorbis, lang: (char*) , inpS: (int32_t) 65307, ffmt: (char*) application/ogg, dura: (int64_t) 188000, brte: (int32_t) 160000, #chn: (int32_t) 2} : deleted<unspecified> for mime NULL, source TinyCacheSource(CallbackDataSource(RemoteDataSource(FileSource(fd(/system/media/audio/ui/KeypressStandard.ogg), 0, 5837)))), pid 1556: deletedtrack {vinf: (unknown type 0, size 30), vdat: (unknown type 0, size 45), vboo: (unknown type 0, size 3920), srte: (int32_t) 48000, mxBr: (int32_t) -1, mime: (char*) audio/vorbis, lang: (char*) , inpS: (int32_t) 65307, ffmt: (char*) application/ogg, dura: (int64_t) 108000, brte: (int32_t) 140000, #chn: (int32_t) 1} : deleted<unspecified> for mime NULL, source TinyCacheSource(CallbackDataSource(RemoteDataSource(FileSource(fd(/system/media/audio/ui/Lock.ogg), 0, 8308)))), pid 1881: deletedtrack {vinf: (unknown type 0, size 30), vdat: (unknown type 0, size 45), vboo: (unknown type 0, size 4225), srte: (int32_t) 44100, mxBr: (int32_t) -1, mime: (char*) audio/vorbis, lang: (char*) , inpS: (int32_t) 65307, ffmt: (char*) application/ogg, dura: (int64_t) 226000, brte: (int32_t) 160000, #chn: (int32_t) 2} : deleted<unspecified> for mime NULL, source TinyCacheSource(CallbackDataSource(RemoteDataSource(FileSource(fd(/system/media/audio/ui/Effect_Tick.ogg), 0, 5136)))), pid 1556: deletedtrack {vinf: (unknown type 0, size 30), vdat: (unknown type 0, size 45), vboo: (unknown type 0, size 3796), srte: (int32_t) 48000, mxBr: (int32_t) 0, mime: (char*) audio/vorbis, lang: (char*) , inpS: (int32_t) 65307, ffmt: (char*) application/ogg, dura: (int64_t) 94000, brte: (int32_t) 96000, #chn: (int32_t) 2} : deleted

Android7.1 Audio Debug相关方法相关推荐

  1. android7.1开机监听广播,Android7.1 Audio Debug相关方法

    1. Audio的FW和HAL层dump PCM数据(非offload的场景,对应offload,dump出来的还是原数据) 1.抓取Systrace <1>怎么加参考:framework ...

  2. Android Audio Debug相关方法

    Audio的FW和HAL层dump PCM数据(非offload的场景,对应offload,dump出来的还是原数据) 1.抓取Systrace<1>怎么加参考:frameworks/av ...

  3. Android7.1 audio 播放流程(三十五)

    android audio 生产者与消费者 简介 全面接触生产者/消费者问题是在操作系统原理中,并发性原理讨论的问题 生产者/消费者问题.最近的工作偏向音频,接着上一篇文章,用生产者,消费者模型来理解 ...

  4. Android7.1 Audio的FW和HAL层dump PCM数据(三十七)

    android audio 生产者与消费者 简介 全面接触生产者/消费者问题是在操作系统原理中,并发性原理讨论的问题 生产者/消费者问题.最近的工作偏向音频,接着上一篇文章,用生产者,消费者模型来理解 ...

  5. [RK3399][Android7.1] Audio中的Ducking模式

    Platform: rk3399 OS: Android 7.1 Kernel: v4.4.83 概念: Ducking就是当其他应用在使用音频时降低自身音量的过程. 举例: 当你开车在边听车载音乐边 ...

  6. [RK3399][Android7.1] Audio中的MCLK时钟小结

    Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 引用: I2S有3个主要信号: 1.串行时钟SCLK,也叫位时钟BCLK,即对应数字音频的每一位数据, ...

  7. android modem开发(16)---MTK语音测试

    场地测试:语音测试 一.Speech 测试 1.测试机与固定电话进行拨打,二者处于不同空间,避免二者的Uplink&DL声音都是一样; 2.对比机与测试机处于同一个环境,之间建议相隔几米,同时 ...

  8. unity手游之聊天SDK集成与使用二

    unity手游之聊天SDK集成与使用二 集成思路 如果是自己的小游戏的话,可以把好友等信息直接保存在亲加服务器上,通过调用api来操作. 我们游戏只使用sdk的通信功能,好友等信息保存在自己的服务器上 ...

  9. Qualcomm 音频学习一

    前言 最近在学习高通的音频驱动,在学习了高通音频 bring up 和 Audio overview 文档后,并在网上寻找到一篇比较重要的 blog进行学习后,将这部分学习笔记记录于此. 四个重要部分 ...

  10. chromedriver中的浏览器选项

    chromedriver中的浏览器选项 There are lots of command lines which can be used with the Google Chrome browser ...

最新文章

  1. Ubuntu 12.10 拨号上网及停用方法
  2. SAP MM 明明有需求,为啥MRP RUN后没有PR单据产生?
  3. 国二c语言操作题评分标准,全国计算机二级C语言操作题题库.doc
  4. 17.立体匹配——匹配问题,好区域匹配 测验,窗口大小的影响,遮蔽(Occlusion),顺序约束_2
  5. 私有网络解决方案Start9 Labs完成120万美元融资,以推动其硬件Embassy后续发展
  6. BUS HOUND调试USB驱动遇到的错误代码解析
  7. 苹果又发布一个机器学习框架,帮自家生态里的开发者降低AI门槛
  8. jvm 解释器和编译器
  9. SimpleDateFormat 格式化日期
  10. Alienbrain-数字资源在团队三维动画制作行业中的应用
  11. 聚焦四个重组,构建基于IPD的卓越研发体系(3.0版)
  12. 动易html在线编辑器 漏洞,动易网站漏洞总结
  13. JSP程序设计之(1)Tomcat安装及环境变量配置
  14. 深入浅出mysql第二,mysql-深入浅出MySQL(第2版)-ITBook分享(pdf mongodb java javascript node )...
  15. 支持HomeKit、NFC:智汀智能门锁SL1仅需要149元
  16. 困扰?什么是面向对象什么是面向过程
  17. 适用于超小规模数据集的分类器
  18. 基于STM32F103HAL库的声音定位系统
  19. 编译出现 warn_unused_result -Wunused-result 如何解决
  20. 使用python登陆Yahoo邮箱

热门文章

  1. 实现日志文件直接导入数据库
  2. 系统调用服务号 linux 2.6.32
  3. Linux sort命令浅析
  4. 全国省市县无刷新级联菜单
  5. Lync 2010迁移Lync 2013 PART5:支持旧版Lync
  6. 【Java】Java日志框架Logback的简单例子
  7. 《Python数据挖掘:概念、方法与实践》一1.3 在数据挖掘中使用哪些技术
  8. 第一章 Shell基础知识
  9. 使用Cargo入门rust语言
  10. 数据迁移其实是很难的