一、涉及的概念


1. 概念output
(1) 一个output对应一个或多个设备节点,比如/dev/snd/pcmC0D0p。为了避免麻烦,一个设备节点只由一个Thread(线程)操作。
(2) 一个putput是多个device的组合(比如声卡上有喇叭(dev1)和耳机(dev2)),这些device(喇叭、耳机)属于同一个硬件上不同的端口。这些device需支持同样的参数,如采样率和通道。
(3) 一个output对一个Thread,
(4) 一个output对应一个或多个track(音轨),播放时来自多个App.
(5) 一个track对应一个AudioTrack


2. 使用Hardware Module(也称为module)来操作硬件
Hardware Module的名字是什么?这决定加载哪些动态库。Hardware Module支持哪些output?output支持哪些device,参数是什么?
以上这些在配置文件 /system/etc/audio_policy.conf 中指定


3. 概念
module: 硬件操作库,用于操作硬件
output: 一组有相同参数的来自同一硬件的device.
device: 喇叭,耳机等
这些也与配置文件 /system/etc/audio_policy.conf 有关。

4. profile和output的区别
profile: 配置,用来描述output,比如可以支持哪些设备,和参数,比如采样率,通道等信息。
output: 用于描述现在实际上可以支持哪些设备。
比如一个具有喇叭和耳机孔的声卡的profile为可以支持喇叭和耳机,但是output是接上耳机时才支持耳机。


5. App在播放音乐的时候有那么多的路径(比如播放到喇叭,耳机,蓝牙...),App怎么选择?
答:App不管这些,这是由音频系统决定的。当App要显示指定类型的声音时,它只需要使用宏表明stream type(声音类型)即可。
Java API和Native API使用的是不同的宏来指明stream type,但是它们是一一对应的,比如表示电话语音,Java中是STREAM_VOICE_CALL,Native中是AUDIO_STREAM_VOICE_CALL.
这些宏在system/core/include/system/audio.h中定义。
其中宏 AUDIO_STREAM_ENFORCED_AUDIBLE 表示强制发出声音,App不能mute它,必须发出来。比如有些国家要求拍照必须要有声音,以防止偷拍。

6. 既然有多种stream type,不方便管理,于是对他们分了组,组使用strategy表示,具有相同行为的stream被放
在同一个组中。这里的相同行为表示播放的device相同。
分组信息可以参考hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp中的getStrategy()

AudioPolicyManagerBase::routing_strategy AudioPolicyManagerBase::getStrategy(
        AudioSystem::stream_type stream) {
    // stream to strategy mapping
    switch (stream) {
    case AudioSystem::VOICE_CALL:
    case AudioSystem::BLUETOOTH_SCO:
        return STRATEGY_PHONE;
    case AudioSystem::RING:
    case AudioSystem::ALARM:
        return STRATEGY_SONIFICATION;
    case AudioSystem::NOTIFICATION:
        return STRATEGY_SONIFICATION_RESPECTFUL;
    case AudioSystem::DTMF:
        return STRATEGY_DTMF;
    default:
        ALOGE("unknown stream type");
    case AudioSystem::SYSTEM:
        // NOTE: SYSTEM stream uses MEDIA strategy because muting music and switching outputs
        // while key clicks are played produces a poor result
    case AudioSystem::TTS:
    case AudioSystem::MUSIC:
        return STRATEGY_MEDIA;
    case AudioSystem::ENFORCED_AUDIBLE:
        return STRATEGY_ENFORCED_AUDIBLE;
    }
}
View Code

相关文章:

  • 2022-12-23
  • 2021-10-02
  • 2022-03-06
  • 2022-12-23
  • 2022-12-23
  • 2021-03-29
  • 2022-01-08
猜你喜欢
  • 2021-08-18
  • 2022-01-09
  • 2022-12-23
  • 2021-08-03
  • 2022-12-23
  • 2021-12-31
  • 2021-04-07
相关资源
相似解决方案