Android7.1 Audio Debug相关方法
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相关方法相关推荐
- android7.1开机监听广播,Android7.1 Audio Debug相关方法
1. Audio的FW和HAL层dump PCM数据(非offload的场景,对应offload,dump出来的还是原数据) 1.抓取Systrace <1>怎么加参考:framework ...
- Android Audio Debug相关方法
Audio的FW和HAL层dump PCM数据(非offload的场景,对应offload,dump出来的还是原数据) 1.抓取Systrace<1>怎么加参考:frameworks/av ...
- Android7.1 audio 播放流程(三十五)
android audio 生产者与消费者 简介 全面接触生产者/消费者问题是在操作系统原理中,并发性原理讨论的问题 生产者/消费者问题.最近的工作偏向音频,接着上一篇文章,用生产者,消费者模型来理解 ...
- Android7.1 Audio的FW和HAL层dump PCM数据(三十七)
android audio 生产者与消费者 简介 全面接触生产者/消费者问题是在操作系统原理中,并发性原理讨论的问题 生产者/消费者问题.最近的工作偏向音频,接着上一篇文章,用生产者,消费者模型来理解 ...
- [RK3399][Android7.1] Audio中的Ducking模式
Platform: rk3399 OS: Android 7.1 Kernel: v4.4.83 概念: Ducking就是当其他应用在使用音频时降低自身音量的过程. 举例: 当你开车在边听车载音乐边 ...
- [RK3399][Android7.1] Audio中的MCLK时钟小结
Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 引用: I2S有3个主要信号: 1.串行时钟SCLK,也叫位时钟BCLK,即对应数字音频的每一位数据, ...
- android modem开发(16)---MTK语音测试
场地测试:语音测试 一.Speech 测试 1.测试机与固定电话进行拨打,二者处于不同空间,避免二者的Uplink&DL声音都是一样; 2.对比机与测试机处于同一个环境,之间建议相隔几米,同时 ...
- unity手游之聊天SDK集成与使用二
unity手游之聊天SDK集成与使用二 集成思路 如果是自己的小游戏的话,可以把好友等信息直接保存在亲加服务器上,通过调用api来操作. 我们游戏只使用sdk的通信功能,好友等信息保存在自己的服务器上 ...
- Qualcomm 音频学习一
前言 最近在学习高通的音频驱动,在学习了高通音频 bring up 和 Audio overview 文档后,并在网上寻找到一篇比较重要的 blog进行学习后,将这部分学习笔记记录于此. 四个重要部分 ...
- chromedriver中的浏览器选项
chromedriver中的浏览器选项 There are lots of command lines which can be used with the Google Chrome browser ...
最新文章
- Ubuntu 12.10 拨号上网及停用方法
- SAP MM 明明有需求,为啥MRP RUN后没有PR单据产生?
- 国二c语言操作题评分标准,全国计算机二级C语言操作题题库.doc
- 17.立体匹配——匹配问题,好区域匹配 测验,窗口大小的影响,遮蔽(Occlusion),顺序约束_2
- 私有网络解决方案Start9 Labs完成120万美元融资,以推动其硬件Embassy后续发展
- BUS HOUND调试USB驱动遇到的错误代码解析
- 苹果又发布一个机器学习框架,帮自家生态里的开发者降低AI门槛
- jvm 解释器和编译器
- SimpleDateFormat 格式化日期
- Alienbrain-数字资源在团队三维动画制作行业中的应用
- 聚焦四个重组,构建基于IPD的卓越研发体系(3.0版)
- 动易html在线编辑器 漏洞,动易网站漏洞总结
- JSP程序设计之(1)Tomcat安装及环境变量配置
- 深入浅出mysql第二,mysql-深入浅出MySQL(第2版)-ITBook分享(pdf mongodb java javascript node )...
- 支持HomeKit、NFC:智汀智能门锁SL1仅需要149元
- 困扰?什么是面向对象什么是面向过程
- 适用于超小规模数据集的分类器
- 基于STM32F103HAL库的声音定位系统
- 编译出现 warn_unused_result -Wunused-result 如何解决
- 使用python登陆Yahoo邮箱