diff options
Diffstat (limited to 'hal/audio_hw.c')
-rw-r--r-- | hal/audio_hw.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/hal/audio_hw.c b/hal/audio_hw.c index 5bbd5956..7a2c2b95 100644 --- a/hal/audio_hw.c +++ b/hal/audio_hw.c @@ -2743,6 +2743,8 @@ int select_devices(struct audio_device *adev, audio_usecase_t uc_id) usecase->stream.out->sample_rate, &usecase->stream.out->app_type_cfg.sample_rate); } else if (((out_snd_device != SND_DEVICE_OUT_HEADPHONES_44_1 && + out_snd_device != SND_DEVICE_OUT_HEADPHONES && + out_snd_device != SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER && !audio_is_true_native_stream_active(adev)) && usecase->stream.out->sample_rate == OUTPUT_SAMPLING_RATE_44100) || (usecase->stream.out->sample_rate < OUTPUT_SAMPLING_RATE_44100)) { @@ -2799,6 +2801,7 @@ int select_devices(struct audio_device *adev, audio_usecase_t uc_id) !(usecase->stream.out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) && (usecase->type != TRANSCODE_LOOPBACK_TX) && (usecase->type != TRANSCODE_LOOPBACK_RX) && + (usecase->type != PCM_CAPTURE) && usecase->stream.out->started) { if (is_bt_soc_on(adev) == false) { ALOGD("BT SCO/A2dp disconnected while in connection"); @@ -3230,7 +3233,7 @@ static void *offload_thread_loop(void *context) int ret = 0; setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_AUDIO); - //set_sched_policy(0, SP_FOREGROUND); + set_sched_policy(0, SP_FOREGROUND); prctl(PR_SET_NAME, (unsigned long)"Offload Callback", 0, 0, 0); ALOGV("%s", __func__); @@ -5518,7 +5521,7 @@ static ssize_t out_write(struct audio_stream_out *stream, const void *buffer, out->send_new_metadata = 0; if (out->send_next_track_params && out->is_compr_metadata_avail) { ALOGD("copl(%p):send next track params in gapless", out); - // compress_set_next_track_param(out->compr, &(out->compr_config.codec->options)); + compress_set_next_track_param(out->compr, &(out->compr_config.codec->options)); out->send_next_track_params = false; out->is_compr_metadata_avail = false; } @@ -8130,7 +8133,6 @@ static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs) int status = 0; bool a2dp_reconfig = false; struct listnode *node; - struct audio_usecase *usecase = NULL; ALOGD("%s: enter: %s", __func__, kvpairs); parms = str_parms_create_str(kvpairs); @@ -8162,17 +8164,26 @@ static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs) if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0){ adev->bt_sco_on = true; } else { - ALOGD("sco is off, reset sco and route device to handset mic"); adev->bt_sco_on = false; audio_extn_sco_reset_configuration(); + } + } + + ret = str_parms_get_str(parms, "A2dpSuspended", value, sizeof(value)); + if (ret>=0) { + if (!strncmp(value, "false", 5) && + audio_extn_a2dp_source_is_suspended()) { + struct audio_usecase *usecase; + struct listnode *node; list_for_each(node, &adev->usecase_list) { usecase = node_to_item(node, struct audio_usecase, list); - if ((usecase->type == PCM_CAPTURE) && usecase->stream.in && - (usecase->stream.in->device & AUDIO_DEVICE_IN_ALL_SCO)) + if (usecase->stream.in && (usecase->type == PCM_CAPTURE) && + ((usecase->stream.in->device & ~AUDIO_DEVICE_BIT_IN) & + AUDIO_DEVICE_IN_ALL_SCO)) { + ALOGD("a2dp resumed, switch bt sco mic to handset mic"); usecase->stream.in->device = AUDIO_DEVICE_IN_BUILTIN_MIC; - else - continue; - select_devices(adev, usecase->id); + select_devices(adev, usecase->id); + } } } } @@ -9465,6 +9476,8 @@ static void adev_snd_mon_cb(void *cookie, struct str_parms *parms) platform_snd_card_update(adev->platform, status); audio_extn_fm_set_parameters(adev, parms); audio_extn_auto_hal_set_parameters(adev, parms); + if (status == CARD_STATUS_OFFLINE) + audio_extn_sco_reset_configuration(); } else if (is_ext_device_status) { platform_set_parameters(adev->platform, parms); } |