打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
机制和策略相分离原则

这些天大刀阔斧修改了我们的alsa音频驱动,更深切理解了机制和策略分离的重要性。

说来惭愧,Linux Device Drivers一书翻来覆去查阅了无数遍,却忽视了绪论中的一句话:区分机制和策略是Unix设计背后隐含的最好思想之一。

“需要提供什么功能”即机制,“如何使用这些功能”即策略。一年多前,初接手音频驱动开发时,就混淆了机制和策略,主要表现在音频通道方面。

最典型的例如:当codec检测到有headset插入时,就关闭speaker,声音转向headset输出;而检测到headset拔下时,关闭headset通道,声音转向speaker输出。

这个做法,我当时就认为是正确的场景。可是却没有考虑到一些特殊的场景:如在headset插入的状态下,这时如果是闹钟铃声或电话铃声的话,声音还是必须要speaker出来的。

各种应用场景千奇百怪,作为底层的不能假设什么策略是正确的,更不应该擅自去实现这些策略。只需要提供相关的功能即可,上层根据需要来调用这些接口。

还是以上述的音频通道为例:

1、在codec驱动中会实现snd_kcontrol(mixer control)、dapm、audio_map等,如

  1. SOC_SINGLE("Headset Switch", xxx_HEADSET_REG, 0, 1, 0),  
  2. SOC_SINGLE("Headfree Switch", xxx_HEADFREE_REG, 0, 1, 0),  
上面两个mixer control可对headset和headfree这两个通道进行切换控制。

2、当Android系统跑起来后,可用tinymix命令(Android4.0版本,如果是之前版本的话,用alsa_amixer命令)可看到:

  1. 17      BOOL    1       Headset Switch                           Off  
  2. 18      BOOL    1       Headfree Switch                          Off  
因为目前没有声音需要输出,因此这两个通道都是关闭的。

3、在Android的音频抽象层audio_hw.c可这样定义:

  1. struct route_setting hf_output[] = {  
  2.     {  
  3.         .ctl_name = "Headfree Switch",  
  4.         .intval = 1,  
  5.     },  
  6.   
  7.     /* end of the route_setting */  
  8.     {  
  9.         .ctl_name = NULL,  
  10.     },  
  11. };  
  12.   
  13. struct route_setting hs_output[] = {  
  14.     {  
  15.         .ctl_name = "Headset Switch",  
  16.         .intval = 1,  
  17.     },  
  18.   
  19.     /* end of the route_setting */  
  20.     {  
  21.         .ctl_name = NULL,  
  22.     },      
  23. };  
这样程序可以根据AudioPolicyService提供的音频策略来控制底层的音频通路:

  1. headset_on = adev->devices & AUDIO_DEVICE_OUT_WIRED_HEADSET;  
  2. headphone_on = adev->devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE;  
  3. speaker_on = adev->devices & AUDIO_DEVICE_OUT_SPEAKER;  
  4. earpiece_on = adev->devices & AUDIO_DEVICE_OUT_EARPIECE;  
  5. bt_on = adev->devices & AUDIO_DEVICE_OUT_ALL_SCO;  
  6.   
  7. /* select output stage */  
  8. set_route_by_array(adev->mixer, hs_output, headset_on | headphone_on);  
  9. set_route_by_array(adev->mixer, hf_output, speaker_on);  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
第三篇:知其然,知其所以然-USB音频设备的开发过程
Qualcomm Audio HAL 音频通路设置
Android音频输出切换 | 学步园
Android HAL 层原理分析
Android源码分析:AudioPolicy
Android Audio System 之三: AudioPolicyService 和...
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服