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 }
AudioHardwareALSA 与AudioHardwareInterface的继承关系如下:
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);
.......
}
}