summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2014-10-01 08:29:01 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2014-10-01 08:29:01 -0700
commit1b390418e89f0ed95176cdb80c1538d66438294f (patch)
treeab7f1f3c5cd8d4c1a0c1e5446abd222c0982894a
parenta959cbd062bbf32d16837554dd7d3b55fd69b321 (diff)
parent71a8b971f373993826ad8ddf02e1814a14f2fec4 (diff)
downloadandroid_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.c30
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;