关闭

机制和策略相分离原则

6525人阅读 评论(3) 收藏 举报
分类:

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

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

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

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

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

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

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

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

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

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

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

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

struct route_setting hf_output[] = {
    {
        .ctl_name = "Headfree Switch",
        .intval = 1,
    },

    /* end of the route_setting */
    {
        .ctl_name = NULL,
    },
};

struct route_setting hs_output[] = {
    {
        .ctl_name = "Headset Switch",
        .intval = 1,
    },

    /* end of the route_setting */
    {
        .ctl_name = NULL,
    },    
};
这样程序可以根据AudioPolicyService提供的音频策略来控制底层的音频通路:

    headset_on = adev->devices & AUDIO_DEVICE_OUT_WIRED_HEADSET;
    headphone_on = adev->devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE;
    speaker_on = adev->devices & AUDIO_DEVICE_OUT_SPEAKER;
    earpiece_on = adev->devices & AUDIO_DEVICE_OUT_EARPIECE;
    bt_on = adev->devices & AUDIO_DEVICE_OUT_ALL_SCO;

    /* select output stage */
    set_route_by_array(adev->mixer, hs_output, headset_on | headphone_on);
    set_route_by_array(adev->mixer, hf_output, speaker_on);

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

软件设计中的机制与策略分离实现

第一次看到这句话是在window内核情境分析这一书中,书中描述windows进程调度采用的是机制与策略分离这样一种方式,在windows多任务操作系统中,进程调度算法有轮询,时间片等,这可以看做是进程...
  • houzhiwei123456789
  • houzhiwei123456789
  • 2015-09-11 17:15
  • 1006

【Hystrix权威指南二】Hystrix隔离策略

微服务组件
  • klov001
  • klov001
  • 2016-12-14 18:15
  • 1645

SolrCloud分片流程

从两个方面将分片流程 1、创建文档入索引库的流程 2、从索引库中查询文档流程 1、创建索引流程 不考虑单机的情况,只考虑solr云情况 solr云基于CloudSolrServer的接口,(...
  • Rosen_Luo
  • Rosen_Luo
  • 2015-06-30 10:46
  • 1800

Elastic-Job作业分片策略

原文地址:http://dangdangdotcom.github.io/elastic-job/post/1.x/job_strategy/ 作业分片策略 框架提供的分片策略 Averag...
  • tanga842428
  • tanga842428
  • 2016-09-28 12:57
  • 4251

从头认识设计模式-策略模式-04-思考过程三:引入设计原则:分离变化与不变的部分

从头认识设计模式-策略模式-04-引入设计原则:分离变化与不变的部分
  • raylee2007
  • raylee2007
  • 2016-03-17 11:13
  • 1276

『C/C++』一个用C/C++分别实现接口与实现相分离的设计原则的例子

原文链接:一个用C/C++分别实现接口与实现相分离的设计原则的例子 良好的设计应该只暴露接口给用户,所有的实现细节对用户来说应该是隐藏的,也就是说用户只要给接口传递相应的参数就行了,不需要管内部是...
  • fallenink
  • fallenink
  • 2013-08-19 09:36
  • 1018

软件设计中的机制与策略分离实现

第一次看到这句话是在window内核情境分析这一书中,书中描述windows进程调度采用的是机制与策略分离这样一种方式,在windows多任务操作系统中,进程调度算法有轮询,时间片等,这可以看做是进程...
  • houzhiwei123456789
  • houzhiwei123456789
  • 2015-09-11 17:15
  • 1006

TD-SCDMA与GSM互操作的原则和策略分析.doc

  • 2008-12-03 11:25
  • 128KB
  • 下载

分离变与不变——软件设计的基本原则分析

分离变与不变                                         &#...
  • panrong_nust
  • panrong_nust
  • 2012-11-11 13:38
  • 638

”OCP“原则与模块分离思想、MVC模式

“OCP”原则:“开—闭原则”,表示对软件扩展能力开放,对源代码修改关闭。 MVC模式:模型—视图—控制器。   MVC设计模式并不是经典的GOF的23个设计模式之中,不过我们却可以将MVC设计模...
  • LvCaiping
  • LvCaiping
  • 2015-06-03 15:55
  • 292
    个人资料
    • 访问:555300次
    • 积分:5862
    • 等级:
    • 排名:第5083名
    • 原创:59篇
    • 转载:4篇
    • 译文:0篇
    • 评论:339条
    文章分类
    最新评论