diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2014-10-01 08:29:01 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2014-10-01 08:29:01 -0700 |
commit | 1b390418e89f0ed95176cdb80c1538d66438294f (patch) | |
tree | ab7f1f3c5cd8d4c1a0c1e5446abd222c0982894a | |
parent | a959cbd062bbf32d16837554dd7d3b55fd69b321 (diff) | |
parent | 71a8b971f373993826ad8ddf02e1814a14f2fec4 (diff) | |
download | android_hardware_qcom_audio-1b390418e89f0ed95176cdb80c1538d66438294f.tar.gz android_hardware_qcom_audio-1b390418e89f0ed95176cdb80c1538d66438294f.tar.bz2 android_hardware_qcom_audio-1b390418e89f0ed95176cdb80c1538d66438294f.zip |
Merge "hal: Send voice cal data before routing voice usecases"
-rw-r--r-- | hal/audio_hw.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/hal/audio_hw.c b/hal/audio_hw.c index c5736fc2..6daa1d16 100644 --- a/hal/audio_hw.c +++ b/hal/audio_hw.c @@ -268,6 +268,26 @@ static int set_snd_card_state(struct audio_device *adev, int snd_scard_state) return 0; } +static int enable_audio_route_for_voice_usecases(struct audio_device *adev, + struct audio_usecase *uc_info) +{ + struct listnode *node; + struct audio_usecase *usecase; + + if (uc_info == NULL) + return -EINVAL; + + /* Re-route all voice usecases on the shared backend other than the + specified usecase to new snd devices */ + list_for_each(node, &adev->usecase_list) { + usecase = node_to_item(node, struct audio_usecase, list); + if ((usecase->type == VOICE_CALL || usecase->type == VOIP_CALL) && + (usecase != uc_info)) + enable_audio_route(adev, usecase); + } + return 0; +} + int enable_audio_route(struct audio_device *adev, struct audio_usecase *usecase) { @@ -518,7 +538,8 @@ static void check_usecases_codec_backend(struct audio_device *adev, /* Update the out_snd_device only before enabling the audio route */ if (switch_device[usecase->id] ) { usecase->out_snd_device = snd_device; - enable_audio_route(adev, usecase); + if (usecase->type != VOICE_CALL && usecase->type != VOIP_CALL) + enable_audio_route(adev, usecase); } } } @@ -586,7 +607,8 @@ static void check_and_route_capture_usecases(struct audio_device *adev, /* Update the in_snd_device only before enabling the audio route */ if (switch_device[usecase->id] ) { usecase->in_snd_device = snd_device; - enable_audio_route(adev, usecase); + if (usecase->type != VOICE_CALL && usecase->type != VOIP_CALL) + enable_audio_route(adev, usecase); } } } @@ -789,10 +811,12 @@ int select_devices(struct audio_device *adev, audio_usecase_t uc_id) enable_snd_device(adev, in_snd_device); } - if (usecase->type == VOICE_CALL || usecase->type == VOIP_CALL) + if (usecase->type == VOICE_CALL || usecase->type == VOIP_CALL) { status = platform_switch_voice_call_device_post(adev->platform, out_snd_device, in_snd_device); + enable_audio_route_for_voice_usecases(adev, usecase); + } usecase->in_snd_device = in_snd_device; usecase->out_snd_device = out_snd_device; |