Android潜在的发展耳机插头连接到音频频道切换的例子

因为使用的是耳机 麦克分离式的耳机,所以要分别上报事件。在Android系统层耳机插孔的检測是基于/sys/class/switch/h2w/state的值来推断的(以4.4.4_r2为样例位于WiredAccessoryManager.java)。

仅仅要在内核中实现一个「或真或假」的基于switch类的h2w开关。Android系统就能够监听到插拔信息。

在播放音乐的时候插入耳机,使用tinymix(參考:Android音频底层调试-基于tinyalsa)命令能够查找到Playback Path的值从SPK变为HP_NO_MIC,就能够说明耳机插拔软件检測正常了。

# tinymix 

Mixer name: 'RK_RK616_TINY'

Number of controls: 7

ctl type num name                                     value

0 ENUM 1 Playback Path                            HP_NO_MIC

1 ENUM 1 Capture MIC Path                         MIC OFF

2 ENUM 1 Voice Call Path                          OFF

3 ENUM 1 Voip Path                                 OFF

4 INT 2 Speaker Playback Volume                  24 24

5 INT 2 Headphone Playback Volume                24 24

6 ENUM 1 Modem Input Enable                       ON

可是喇叭还在响,说明没有被关闭。查查原理图「功放上的控制脚」是在哪个GPIO上接着呢。

依据手冊得出仅仅要GPIO2_D7能够输出低电平就能实现喇叭的关闭,使用万用表測得在插入耳机后该管脚仍然为高电平。查看代码改动记录在上一个版本号同事是直接在rk_headset.c耳机插拔程序中改动将其拉低的,这样能够实现可是认为不妥。Android上层应该也是有音频通道切换的。依据上层来控制比較好。

这样插入耳机的时候也能够强制开启喇叭。把「使用哪个音频通信的决定权」交给给用户。

这个应该是在内核中实现的,由于Alsa已经正常切换了,就说明上层已经调用对应的接口了。从驱动中来分析。

设备资源:能够看到Speak和handphone的使能GPIO都给的是RK30_PIN2_PD7。

static struct rk616_platform_data rk616_pdata = {

.power_init = rk616_power_on_init,

.power_deinit = rk616_power_deinit,

.scl_rate   = RK616_SCL_RATE,

.lcd0_func = INPUT,             //port lcd0 as input

.lcd1_func = INPUT,             //port lcd1 as input

.lvds_ch_nr = 1,                //the number of used lvds channel

.hdmi_irq = RK30_PIN2_PD6,

.spk_ctl_gpio = RK30_PIN2_PD7,

.hp_ctl_gpio = RK30_PIN2_PD7,

};

设备驱动中控制音频输出通道的函数:

static int rk616_playback_path_put(struct snd_kcontrol *kcontrol,

struct snd_ctl_elem_value *ucontrol)

{

......

case HP_PATH:

case HP_NO_MIC:

case RING_HP:

case RING_HP_NO_MIC:

rk616_set_gpio(RK616_CODEC_SET_SPK, GPIO_LOW);

if (pre_path == OFF)

rk616_codec_power_up(RK616_CODEC_PLAYBACK);

snd_soc_update_bits(codec, RK616_SPKL_CTL,

RK616_VOL_MASK, HPOUT_VOLUME); //, volume (bit 0-4)

snd_soc_update_bits(codec, RK616_SPKR_CTL,

RK616_VOL_MASK, HPOUT_VOLUME);

rk616_set_gpio(RK616_CODEC_SET_HP, GPIO_HIGH);

break;

......

}

可见在输出到耳机通道时,禁用 SPEAKER和使能HP都是设置的GPIO_HIGH,最后RK30_PIN2_PD7仍然为高电平,没有禁用SPEAKER。原理图并没有单独的耳机的使能管脚。在资源中将hp_ctl_gpio设置为INVALID_GPIO。问题得以解决。

额外收获:原理耳机那里一直都是有音频输出的,不管插入不插入耳机;插入耳机时不过将SPEAKER禁止了。

误入的歧途:

1.误以为要去看Android上层代码在各种类中追寻了非常久。真是浪费时间,假设使用tinymix查看音频通道切换正常,说明内核以上的都没有问题了,出问题也是出在了内核以及硬件上。

总结:庞大的Android系统容不得你每一块都了解的非常仔细,可是假设会非常好的划分层次。问题就会非常好解决。记录的重点不在于详细的型号版本号等等比較虚拟方面,但是,在这样的问题善于分析的头脑面对。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

Android底层音频声道耳机插头和开关壳体的发展的更多相关文章

  1. Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值

    Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值 题外话:一个问题研究到最后,那边记录文档的前半部分基本上都是没用的,甚至是错误的. 重点在最后,前边不过一些假想猜測. ht ...

  2. 【转】Android 底层开发的几点

    我干了3年Android sdk开发,觉得到了瓶劲没法更进一步,于是花了一年多点时间,大概摸到点门径.根据前辈的经验,Android底层完全入门需要两年. 先说下我的入门过程:第零步,下载源码,我下的 ...

  3. 如何穿越到android底层

    对于android开发,实际上大部分工作都是在应用层,但为了体现"技术含量",以及"知其所以然",以便在遇到问题是不至于束手无策.因此有必要了解底层的工作机制. ...

  4. 搭建Android底层开发环境

    为了开发linux驱动方便些,我们一般将linux作为Android的开发环境,那么就需要搭建Android的开发环境,下面是一些搭建Android底层时的心得: (1)安装JDK:除了普遍使用的下载 ...

  5. 【转】Android底层库和程序

    原文网址:http://blog.csdn.net/louiswangbing/article/details/6616202 Android底层库和程序 1.     本地实现的基本结构 Andro ...

  6. 写给Android App开发人员看的Android底层知识(1)

    这个系列的文章一共8篇,我酝酿了很多年,参考了很多资源,查看了很多源码,直到今天把它写出来,也是战战兢兢,生怕什么地方写错了,贻笑大方. (一)引言 早在我还是Android菜鸟的时候,有很多技术我都 ...

  7. 写给Android App开发人员看的Android底层知识(2)

    (五)AMS 如果站在四大组件的角度来看,AMS就是Binder中的Server. AMS全称是ActivityManagerService,看字面意思是管理Activity的,但其实四大组件都归它管 ...

  8. iOS底层音频处理技术(带源代码)

    本文由论坛会员artgolff分享 前几天搜索资料时发现一个网站: iPhone Core Audio Development ,里面有iOS底层 音频 技术的几个源 代码 ,如果你要实现VoIP电话 ...

  9. cocos打包到ios与android上音频推荐

    首先贴一张官方对于ios与android上音频格式的推荐: 这里只给出了推荐格式,一般我们在实际运用中会使用如下方式: 一.IOS与安卓各一套:音乐:都使用MP3    音效:ios用caf Andr ...

随机推荐

  1. Java 理论与实践: 正确使用 Volatile 变量(转)

    Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”:与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少, ...

  2. 接口设计ie常见的问题

    问题叙述性说明: 当围绕一个简单的页面布局设计.我发现了一个奇怪的相对布局问题. 同的方式围绕布局接口.它是利用左div浮动.对div设定 margin-left这样达到的效果.实现了chrome浏览 ...

  3. 解决因特网和xshell考虑到问题

    首先需要解释.我们学校的网络是免费的.无论是实验室或宿舍.因此,互联网是基于Mac地址分配IP的,所以我VirtualBox安装了centos之后,话.就须要将VirtualBox的mac地址改成和我 ...

  4. MVC — 初步理解IIS工作流程

    声明:本文只是自己的总结和积累.IIS7.x 目录 IIS流程及组成部分 ASP.NET流程及组成部分 IIS与ASP.NET  MVC 一.IIS流程及组成部分 1.Http.SYS:负责监听HTT ...

  5. 理解Android虚拟机体系结构(转)

    1 什么是Dalvik虚拟机 Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的 ...

  6. 坑爹BUG,没有详细的看还真看不出问题

    Queue queue = new LinkedList<String> (); for(int i = 0; i<20; i++) { queue.add("坑爹&quo ...

  7. Java魔法堂:注解用法详解——@SuppressWarnings(转)

    一.前言 编码时我们总会发现如下变量未被使用的警告提示: 上述代码编译通过且可以运行,但每行前面的“感叹号”就严重阻碍了我们判断该行是否设置的断点了.这时我们可以在方法前添加 @SuppressWar ...

  8. 【BZOJ3627】【JLOI2014】路径规划 分层图

    意甲冠军:要查找.有门户网站:http://www.lydsy.com/JudgeOnline/problem.php? id=3627 注意:点的等待时长示意图为: 非常清晰了吧?没事,不清晰就不清 ...

  9. 【剑指offer】最大和连续子阵列

    个開始,到第3个为止).你会不会被他忽悠住? 输入: 输入有多组数据,每组測试数据包括两行. 第一行为一个整数n(0<=n<=100000),当n=0时,输入结束.接下去的一行包括n个整数 ...

  10. C++11实现模板手柄:委托构造函数、defaultkeyword分析

    C++11.使用委托构造函数.和高速变量初始化,defaultkeyword重新声明默认构造函数,回答pod状态. 分析与推荐的方法. 到目前为止,VS2012和2013异常声明兼容还是停留在通信代码 ...