android audioflinger 与alsa 驱动接口

A: audioflinger与alsa接口


1。 gingerbread/frameworks/base/services/audioflinger/AudioFlinger.cpp

AudioFlinger::AudioFlinger()     : BnAudioFlinger(),
 132         mAudioHardware(0), mMasterVolume(1.0f), mMasterMute(false), mNextUniqueId(1)
 133 {
 134     mHardwareStatus = AUDIO_HW_IDLE;
 135 
 136     mAudioHardware = AudioHardwareInterface::create();
 137 
 138     mHardwareStatus = AUDIO_HW_INIT;
 139     if (mAudioHardware->initCheck() == NO_ERROR) {
 140         // open 16-bit output stream for s/w mixer
 141         mMode = AudioSystem::MODE_NORMAL;
 142         setMode(mMode);
......
}

 136     mAudioHardware = AudioHardwareInterface::create();
2. AudioHardInterface 定义: gingerbread/hardware/libhardware_legacy/include/hardware_legacy/AudioHardwareInterface.h

3. create() 函数的具体实现:hardware/alsa_sound/AudioHardwareALSA.cpp

 75 AudioHardwareInterface *AudioHardwareALSA::create() {
 76     return new AudioHardwareALSA();  // AudioHardwareInterface 被创建
 77 } 

AudioHardwareALSAAudioHardwareInterface的继承关系如下:

1)hardware/libhardware_legacy/include/hardware_legacy/AudioHardwareBase.h:class AudioHardwareBase : public AudioHardwareInterface

2)gingerbread/hardware/alsa_sound/AudioHardwareALSA.h:  class AudioHardwareALSA : public AudioHardwareBase

4. flinger调用alsa

audioflinger ->mAudioHardware-> mMixer


5. mMixer: hardware/alsa_sound/ALSAMixer.cpp


B: alsa 与驱动接口:

1. 驱动接口static const struct snd_kcontrol_new dac3101_snd_controls[] = {

    SOC_DAC3101_DOUBLE_R("Playback Volume", 65, 66, 0, 0xAF, 0),

}

2. alsaMixer 接口:hardware/alsa_sound/ALSAMixer.cpp

#define ALSA_PROP(dev, name, out, in) \
    {\
       {dev, "alsa.mixer.playback." name, out, NULL},\
         {dev, "alsa.mixer.capture." name, in, NULL}\
    }

ALSAMixer::ALSAMixer(const char *sndcard){

 mixerMasterProp =       ALSA_PROP(AudioSystem::DEVICE_OUT_ALL, "master", "PCM", "Capture");

for (int i = 0; i <= SND_PCM_STREAM_LAST; i++) {  //历遍dac3101_snd_controls里的项,找到和mixerMasterProp的同名项并做初始化

         mixer_info_t *info = mixerMasterProp[i].mInfo = new mixer_info_t;

         property_get (mixerMasterProp[i].propName,
                       info->name,
                       mixerMasterProp[i].propDefault);

         for (snd_mixer_elem_t *elem = snd_mixer_first_elem(mMixer[i]);
              elem;
              elem = snd_mixer_elem_next(elem)) {

             if (!snd_mixer_selem_is_active(elem))
                 continue;

             snd_mixer_selem_get_id(elem, sid);

             // Find PCM playback volume control element.
             const char *elementName = snd_mixer_selem_id_get_name(sid);
           .......

          }

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值