经常要搞音频调试,很麻烦,现在记录下。

常用数据结构

/system/media/audio/include/system/audio.h

定义了常用的stream类型,例如3就是音乐的stream。

/* Audio stream types */

typedef enum {

/* These values must kept in sync with

* frameworks/base/media/java/android/media/AudioSystem.java

*/

AUDIO_STREAM_DEFAULT = -1,

AUDIO_STREAM_MIN = 0,

AUDIO_STREAM_VOICE_CALL = 0,

AUDIO_STREAM_SYSTEM = 1,

AUDIO_STREAM_RING = 2,

AUDIO_STREAM_MUSIC = 3,

AUDIO_STREAM_ALARM = 4,

AUDIO_STREAM_NOTIFICATION = 5,

AUDIO_STREAM_BLUETOOTH_SCO = 6,

AUDIO_STREAM_ENFORCED_AUDIBLE = 7, /* Sounds that cannot be muted by user

* and must be routed to speaker

*/

AUDIO_STREAM_DTMF = 8,

AUDIO_STREAM_TTS = 9, /* Transmitted Through Speaker.

* Plays over speaker only, silent on other devices.

*/

AUDIO_STREAM_ACCESSIBILITY = 10, /* For accessibility talk back prompts */

AUDIO_STREAM_REROUTING = 11, /* For dynamic policy output mixes */

AUDIO_STREAM_PATCH = 12, /* For internal audio flinger tracks. Fixed volume */

AUDIO_STREAM_PUBLIC_CNT = AUDIO_STREAM_TTS + 1,

AUDIO_STREAM_CNT = AUDIO_STREAM_PATCH + 1,

} audio_stream_type_t;

定义了输出设备id,例如0x4对应设备就是有线耳机

/* output devices */

AUDIO_DEVICE_OUT_EARPIECE = 0x1,

AUDIO_DEVICE_OUT_SPEAKER = 0x2,

AUDIO_DEVICE_OUT_WIRED_HEADSET = 0x4,

AUDIO_DEVICE_OUT_WIRED_HEADPHONE = 0x8,

2.常用调试方法

1.查看音量的log

关键tag是AudioMTKGainController

插入耳机,调小音量,出现下面log

01-01 00:29:51.752251 499 906 D AudioMTKGainController: setNormalVolume(), stream 8, devices 0x8, index 8, mode 0x0

上面的log就是把设备耳机的stream 8(DTMF声)的音量设置为8。

拔出耳机,调小音量,出现下面log

AudioMTKGainController: setNormalVolume(), stream 1, devices 0x2, index 13, mode 0x0

AudioMTKGainController: getGainDevice(), input devices = 0x2, return gainDevice = 2

AudioMTKGainController: setSpeakerGain(), gain = 10, spkAnaType = 2, spkLMixerName = Audio_Speaker_PGA_gain, spkRMixerName = Audio_Speaker_PGA_gain

上面的log就是把设备扬声器的stream 1(系统声)的音量设置为13。这里的13只是上层表示的一个音量index,要转换成底层的gain,例如index=13时,gain就是10.

下面是设置speaker音量的流程

status_t AudioMTKGainController::setNormalVolume(int stream, int index, int devices, audio_mode_t mode)

{

ALOGD("setNormalVolume(), stream %d, devices 0x%x, index %d, mode 0x%x", stream, devices, index, mode);

// get gain device

GAIN_DEVICE gainDevice = getGainDevice(devices); //获取要设置增益的设备,2是speaker

if (isSpeakerCategory(gainDevice))

{

if (mSpec.spkAnaType >= 0 && mSpec.spkAnaType < NUM_GAIN_ANA_TYPE)

{

unsigned char gain = mGainTable.streamGain[stream][gainDevice][index].analog[mSpec.spkAnaType]; //把index转换成底层的gain增益

setSpeakerGain(gain); //设置speaker的增益

}

}

2.查看设置Parameter的log

在音频控制中,常常有一种比较粗暴的设置方法,就是直接设置参数Parameter,这个可以在java层直接设置,然后在hal层进行处理。例如在fm中,在java层设置参数

/packages/apps/FMRadio/src/com/android/fmradio/FmService.java

mAudioManager.setParameters("AudioFmPreStop=1");

status_t AudioSystem::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)

{

const sp& af = AudioSystem::get_audio_flinger();

if (af == 0) return PERMISSION_DENIED;

return af->setParameters(ioHandle, keyValuePairs);

}

String8 AudioSystem::getParameters(audio_io_handle_t ioHandle, const String8& keys)

{

const sp& af = AudioSystem::get_audio_flinger();

String8 result = String8("");

if (af == 0) return result;

result = af->getParameters(ioHandle, keys);

return result;

}

上面是原生的代码,是在AudioFlinger中处理,而在mtk中,往往是有AudioPolicy处理

aps->SetPolicyManagerParameters (POLICY_SET_FM_PRESTOP,value,0,0);

3.了解路由规则

下面的log表示路由到耳机

01-03 06:44:36.621514 570 1265 D AudioALSAStreamOut: +setParameters(): routing=8

/* Routing bits for the former setRouting/getRouting API */

/** @deprecated */

@Deprecated public static final int ROUTE_EARPIECE = (1 << 0);

/** @deprecated */

@Deprecated public static final int ROUTE_SPEAKER = (1 << 1);

/** @deprecated use {@link #ROUTE_BLUETOOTH_SCO} */

@Deprecated public static final int ROUTE_BLUETOOTH = (1 << 2);

/** @deprecated */

@Deprecated public static final int ROUTE_BLUETOOTH_SCO = (1 << 2);

/** @deprecated */

@Deprecated public static final int ROUTE_HEADSET = (1 << 3);

/** @deprecated */

@Deprecated public static final int ROUTE_BLUETOOTH_A2DP = (1 << 4);

/** @deprecated */

@Deprecated public static final int ROUTE_ALL = 0xFFFFFFFF;

3.了解Audio Patch

Audio Patch是一个通路,包含源source和目标sink。例如FM就是源,耳机就是目标sink。

4.了解Audio Mode

/* modes for setPhoneState, must match AudioSystem.h audio_mode */

public static final int MODE_INVALID = -2;

public static final int MODE_CURRENT = -1;

public static final int MODE_NORMAL = 0;

public static final int MODE_RINGTONE = 1;

public static final int MODE_IN_CALL = 2;

public static final int MODE_IN_COMMUNICATION = 3;

public static final int NUM_MODES = 4;

5.了解Audio Trace

看看下面的log

01-03 08:26:37.051925 5353 5353 V ToneGenerator: AudioTrack(0xf2f36700) created

01-03 08:26:37.051999 5353 5353 D AudioTrack: set(): 0xf2f36700, streamType 8, sampleRate 44100, format 0x1, channelMask 0x1, frameCount 882, flags #4, notificationFrames 0, sessionId 0, transferType 1, uid -1, pid -1

上面的log是点击拨号盘,发出声音打出来的。0xf2f36700是AudioTrack对象的ID。streamType 是按键音。

6.关于SessionId

抄自网上:

一个Session就是一个会话。每个会话都有一个独一无二的Id来标识。该Id的最终管理在AudioFlinger中。

一个会话可以被多个AudioTrack对象和MediaPlayer共用。

共用一个Session的AudioTrack和MediaPlayer共享相同的AudioEffect。

android fm 耳机,Android杂谈:音频调试小计相关推荐

  1. android fm 耳机,为什么现在安卓手机都没有FM功能了?其实都冤枉厂商了

    原标题:为什么现在安卓手机都没有FM功能了?其实都冤枉厂商了 相信在十多年前用过功能机的人,都知道一项名为FM调频收音机的功能,基本上大多数手机都内置了.比如诺基亚.索尼爱立信.三星等等.但为何处于& ...

  2. android 麦克风耳机,Android force AudioRecord使用耳机麦克风

    我使用AudioRecord来录制音乐,但是当我录制它时使用手机麦克风. 我该如何强迫他使用耳机的频道?Android force AudioRecord使用耳机麦克风 我用这个代码: int min ...

  3. 一篇读懂:Android/iOS手机如何通过音频接口(耳机孔)与外设通信

    一文读懂Android/iOS手机如何通过音频接口与外设通信 更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,一起学习探讨软硬件技术知识经验,关注就有海量学习资料免费领哦: 目录 一文读懂 ...

  4. Android Framework常用工具及LOG调试方法

    概述 Framework开发是一项非常繁琐复杂的工作,需要阅读大量的源代码,分析及其多的LOG信息来定位错误位置.这个时候如果使用一些工具或者知道如何定位重要LOG信息,就可以使一些复杂的工作变的简单 ...

  5. 修改Android手机内核,绕过反调试

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/57086486 0x1.手机设备环境 Model number: Nexus 5 O ...

  6. Android通过OpenSL ES播放音频套路详解

    我的视频课程(基础):<(NDK)FFmpeg打造Android万能音频播放器> 我的视频课程(进阶):<(NDK)FFmpeg打造Android视频播放器> 我的视频课程(编 ...

  7. Android FM 外部短天线支持(ez fm)

    Android FM 外部播放功能(EZ FM),使用外部短天线搜台,默认FM是不支持外部功放播放功能的,因为硬件上需要FM天线低噪放大器的支持. 硬件原理 原理图: 默认使用耳机当做天线. 如果硬件 ...

  8. android fm页面布局,荔枝FM Android客户端产品体验报告

    概览 手机:魅族MX3 操作系统:Flyme OS 3.5.2(A19220) 体验产品:荔枝FM Android客户端 软件版本:V2.0.2 需求分析 目标人群:喜欢听广播.音乐.脱口秀,爱尝试新 ...

  9. android hal 音频分析,实现车载音频 HAL  |  Android 开源项目  |  Android Open Source Project...

    车载音频实现依赖标准 Android 音频 HAL,其中包括以下内容: IDevice (hardware/interfaces/audio/2.0/IDevice.hal).负责创建输入流和输出流. ...

最新文章

  1. tiav15安装重启_西门子博途TIA Portal V15.1安装无限重启和.net3.5SP1错误处理
  2. Mysql学习之order by的工作原理
  3. 【Codeforces Round #507 (Div. 2, based on Olympiad of Metropolises) A】Palindrome Dance
  4. 2015/12/28 十六进制转八进制 八进制转十六进制 作业
  5. Step by Step WebMatrix网站开发之二:使用WebMatrix(2)
  6. c++经典书籍--c++ primer 第6版
  7. CV之IS:利用pixellib库基于mask_rcnn_coco模型对《庆余年》片段实现实例分割简单代码全实现
  8. winform进度条实现
  9. Educational Codeforces Round 112 E.Boring Segments-线段树+双指针
  10. C++——《算法分析》实验肆——单源最短路径问题
  11. 电脑屏幕变小了左右黑_95后关晓彤抗皱、张嘉倪宁静黑科技护肤,明星到底有多爱美容仪?...
  12. Log4j(1)--hellloworld
  13. .netframework游戏编程入门——模拟魔兽学院永远的羁绊
  14. OpenShift 4.3 - 基于虚拟机的BareMetal离线安装(5-6)
  15. 没有必要学完oldboy课程再找工作,现在就可以试试
  16. [转载] Python基于机器学习方法实现的电影推荐系统
  17. JS获取短信验证码60秒
  18. word文档如何设置多级标题
  19. shell遍历ip执行特定功能
  20. 单细胞测序数据挖掘与课题设计

热门文章

  1. 国内阿里Maven仓库镜像及自己收集镜像库
  2. Linux学习 Unit 4
  3. 使用fliter实现ie下css中rgba的效果
  4. [开源]C#二维码生成解析工具,可添加自定义Logo
  5. 2012 BI市场(一)
  6. 数学之美系列二 -- 谈谈中文分词
  7. linux centos7 xen虚拟机 安装方法
  8. password is not set 问题解决
  9. linux centos 修改主机名
  10. json-schema 简介