音量调节调用setvoicevolume
status_t AudioFlinger::setVoiceVolume(float value)
{
AutoMutex lock(mHardwareLock);
audio_hw_device_t *dev = mPrimaryHardwareDev->hwDevice();
mHardwareStatus = AUDIO_HW_SET_VOICE_VOLUME;
ret = dev->set_voice_volume(dev, value);
mHardwareStatus = AUDIO_HW_IDLE;
return ret;
}
调用audio_hw.c set_voice_volume 函数指针指向adev_set_voice_volume
adev->device.set_voice_volume = adev_set_voice_volume;
static int adev_set_voice_volume(struct audio_hw_device *dev, float volume)
{
int ret;
struct audio_device *adev = (struct audio_device *)dev;
pthread_mutex_lock(&adev->lock);
/* cache volume */
ret = voice_set_volume(adev, volume);
pthread_mutex_unlock(&adev->lock);
return ret;
}
Voice.c
int voice_set_volume(struct audio_device *adev, float volume)
{
int vol, err = 0;
adev->voice.volume = volume;
if (adev->mode == AUDIO_MODE_IN_CALL) {
err = platform_set_voice_volume(adev->platform, vol);
}
if (adev->mode == AUDIO_MODE_IN_COMMUNICATION)
err = voice_extn_compress_voip_set_volume(adev, volume);
return err;
}
Platform.c //系统接口,无需关注如何与driver 交互,底层也只需要按接口实现即可
int platform_set_voice_volume(void *platform, int volume)
{
struct platform_data *my_data = (struct platform_data *)platform;
int ret = 0;
if (my_data->csd_client) {
if (my_data->csd_volume == NULL) {
ALOGE("%s: dlsym error for csd_volume", __func__);
} else {
ret = my_data->csd_volume(volume);
if (ret < 0) {
ALOGE("%s: csd_volume error %d", __func__, ret);
}
}
} else {
ALOGE("%s: No CSD Client present", __func__);
}
return ret;
}