기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
망고210 보드를 사용하고 있습니다.
1. ALSA library와 Android Audio HAL부분에 대해서 보고 있는데 아래의 내용에 대한 원인을 알고 계시는 분 있나요?
2. /system/etc/asound.conf 파일은 어떻게 설정 되는 것인가요?
어플에서 Speaker 볼륨을 조절하기 위해서 AudioFlinger를 조절하기 위해서 setMasterVolume을 사용을 하려고 합니다. AudioSystem 서비스에서 setStreamVolume -> setMasterVolume으로 조절을 하였습니다.
HAL부분(./external/libaudio/AudioHardwareALSA.cpp)에 있는 setMasterVolume()에서 alsa-api를 사용하지 못합니다.
----------------------------------------------------------------------------
status_t ALSAMixer::setMasterVolume(float volume)
{
mixer_info_t *info = mixerMasterProp[SND_PCM_STREAM_PLAYBACK].mInfo;
if (!info || !info->elem) return INVALID_OPERATION;
long minVol = info->min;
long maxVol = info->max;
// Make sure volume is between bounds.
long vol = minVol + volume * (maxVol - minVol);
if (vol > maxVol) vol = maxVol;
if (vol < minVol) vol = minVol;
info->volume = vol;
snd_mixer_selem_set_playback_volume_all (info->elem, vol);
return NO_ERROR;
}
----------------------------------------------------------------------------
원인을 알수가 없어서 아래 부분의 PCM->Playback으로 변경을 하여 alsa-api를 사용할 수 있습니다.
static alsa_properties_t
mixerMasterProp[SND_PCM_STREAM_LAST+1] = {
{ ROUTE_ALL, "alsa.mixer.playback.master", "PCM", NULL},
{ ROUTE_ALL, "alsa.mixer.capture.master", "Capture", NULL}
};
아래 log는 PCM으로 설정된 경우 입니다.
D/AudioHardwareALSA( 2000): Mixer: element name: 'Headphone'
D/AudioHardwareALSA( 2000): Mixer: element name: 'Playback'
D/AudioHardwareALSA( 2000): Mixer: element name: '3D'
D/AudioHardwareALSA( 2000): Mixer: element name: 'ALC Attack'
D/AudioHardwareALSA( 2000): Mixer: element name: 'ALC Decay'
D/AudioHardwareALSA( 2000): Mixer: element name: 'ALC Hold Time'
D/AudioHardwareALSA( 2000): Mixer: element name: 'ALC Max Gain'
D/AudioHardwareALSA( 2000): Mixer: element name: 'ALC Min Gain'
D/AudioHardwareALSA( 2000): Mixer: element name: 'ALC Target'
D/AudioHardwareALSA( 2000): Mixer: element name: 'Left Output Mixer Boost Bypass'
D/AudioHardwareALSA( 2000): Mixer: element name: 'Left Output Mixer LINPUT3'
D/AudioHardwareALSA( 2000): Mixer: element name: 'Noise Gate Threshold'
D/AudioHardwareALSA( 2000): Mixer: element name: 'Right Output Mixer Boost Bypass'
D/AudioHardwareALSA( 2000): Mixer: element name: 'Right Output Mixer RINPUT3'
D/AudioHardwareALSA( 2000): Mixer: element name: 'Speaker'
D/AudioHardwareALSA( 2000): Mixer: element name: 'Speaker AC'
D/AudioHardwareALSA( 2000): Mixer: element name: 'Speaker DC'
D/AudioHardwareALSA( 2000): Mixer: master 'PCM' not found.
D/AudioHardwareALSA( 2000): Mixer: route 'Earpiece' not found.
D/AudioHardwareALSA( 2000): Mixer: route 'Speaker' found.
D/AudioHardwareALSA( 2000): Mixer: route 'Bluetooth' not found.
D/AudioHardwareALSA( 2000): Mixer: route 'Headphone' found.
D/AudioHardwareALSA( 2000): Mixer: route 'Bluetooth A2DP' not found.
D/AudioHardwareALSA( 2000): Mixer: element name: 'Playback'
D/AudioHardwareALSA( 2000): Mixer: element name: 'Capture'
D/AudioHardwareALSA( 2000): Mixer: master 'Capture' found.
D/AudioHardwareALSA( 2000): Mixer: route 'Capture' found.
D/AudioHardwareALSA( 2000): Mixer: route '' not found.
D/AudioHardwareALSA( 2000): Mixer: route 'Bluetooth Capture' not found.
D/AudioHardwareALSA( 2000): Mixer: route 'Capture' found.
D/AudioHardwareALSA( 2000): Mixer: route 'Bluetooth A2DP Capture' not found.
D/AudioHardwareALSA( 2000): mixer initialized.
D/AudioHardwareInterface( 2000): setMode(NORMAL)
음.....저도 일일이 소스를 보면서 비교해봐야 답을 할 수 있을 듯 합니다만(현재......집입니다...ㅠ.ㅠ)
1. asound.conf 는 주로 audio 경로 설정 혹은 시나리오를 지정할 때 사용합니다. mixer 세팅 부분이 있는지는 다시 함 봐야겠네요.
2. static alsa_properties_t
mixerMasterProp[SND_PCM_STREAM_LAST+1] = {
{ ROUTE_ALL, "alsa.mixer.playback.master", "PCM", NULL},
{ ROUTE_ALL, "alsa.mixer.capture.master", "Capture", NULL}
};
의 내용을 이용해서 alsa mixer를 제어하게 되어 있는데, PCM이 동작하지 않고, Playback이 동작한다는 얘기는 alsa driver,의 구성이 alsa hal과 맞지 않는다는 것입니다.
3. alsa driver와 alsa hal과의 관계는 alsa hal이 alsa driver를 이용하는 구조입니다.
4. 해서 android에서는 alsa hal에 맞춰서 alsa driver를 구현해 주는게 걱정을 더는 방법 중 하나입니다.