Loading hal/audio_extn/a2dp.c +1 −0 Original line number Diff line number Diff line Loading @@ -1424,6 +1424,7 @@ int audio_extn_a2dp_start_playback() if (ret != 0 ) { ALOGE("%s: Bluetooth controller start failed", __func__); a2dp.a2dp_started = false; ret = -ETIMEDOUT; } else { if (configure_a2dp_encoder_format() == true) { a2dp.a2dp_started = true; Loading hal/audio_hw.c +31 −22 Original line number Diff line number Diff line Loading @@ -803,10 +803,13 @@ int enable_snd_device(struct audio_device *adev, ALOGD("%s: snd_device(%d: %s)", __func__, snd_device, device_name); if (is_a2dp_device(snd_device) && (audio_extn_a2dp_start_playback() < 0)) { if (is_a2dp_device(snd_device)) { if (audio_extn_a2dp_start_playback() < 0) { ALOGE("%s: failed to configure A2DP control path", __func__); goto on_error; } else { adev->a2dp_started = true; } } audio_route_apply_and_update_path(adev->audio_route, device_name); Loading Loading @@ -839,9 +842,10 @@ int disable_snd_device(struct audio_device *adev, if (adev->snd_dev_ref_cnt[snd_device] == 0) { audio_extn_dsm_feedback_enable(adev, snd_device, false); if (is_a2dp_device(snd_device)) if (is_a2dp_device(snd_device)) { audio_extn_a2dp_stop_playback(); adev->a2dp_started = false; } if ((snd_device == SND_DEVICE_OUT_SPEAKER || snd_device == SND_DEVICE_OUT_SPEAKER_SAFE || snd_device == SND_DEVICE_OUT_SPEAKER_REVERSE || Loading Loading @@ -2463,18 +2467,15 @@ int start_output_stream(struct stream_out *out) } if (out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) { if (!audio_extn_a2dp_is_ready()) { if (out->devices & (AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_SPEAKER_SAFE)) { a2dp_combo = true; } else { if (!(out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)) { } else if (!audio_extn_a2dp_is_ready() && !(out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)) { ALOGE("%s: A2DP profile is not ready, return error", __func__); ret = -EAGAIN; goto error_config; } } } } out->pcm_device_id = platform_get_pcm_device_id(out->usecase, PCM_PLAYBACK); if (out->pcm_device_id < 0) { ALOGE("%s: Invalid PCM device id(%d) for the usecase(%d)", Loading Loading @@ -2505,11 +2506,14 @@ int start_output_stream(struct stream_out *out) audio_streaming_hint_start(); audio_extn_perf_lock_acquire(); if (!(out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) || audio_extn_a2dp_is_ready()) { select_devices(adev, out->usecase); } if ((out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) && (!audio_extn_a2dp_is_ready())) { if (!a2dp_combo) { check_a2dp_restore_l(adev, out, false); } else { (!audio_extn_a2dp_is_ready() || !adev->a2dp_started)) { if (a2dp_combo) { audio_devices_t dev = out->devices; if (dev & AUDIO_DEVICE_OUT_SPEAKER_SAFE) out->devices = AUDIO_DEVICE_OUT_SPEAKER_SAFE; Loading @@ -2517,9 +2521,13 @@ int start_output_stream(struct stream_out *out) out->devices = AUDIO_DEVICE_OUT_SPEAKER; select_devices(adev, out->usecase); out->devices = dev; } } else if (!audio_extn_a2dp_is_ready()) { check_a2dp_restore_l(adev, out, false); } else { select_devices(adev, out->usecase); ALOGE("%s: A2DP is not started, return error", __func__); ret = -EINVAL; goto error_open; } } audio_extn_extspk_update(adev->extspk); Loading Loading @@ -6606,6 +6614,7 @@ static int adev_open(const hw_module_t *module, const char *name, adev->primary_output = NULL; adev->bluetooth_nrec = true; adev->acdb_settings = TTY_MODE_OFF; adev->a2dp_started = false; /* adev->cur_hdmi_channels = 0; by calloc() */ adev->snd_dev_ref_cnt = calloc(SND_DEVICE_MAX, sizeof(int)); voice_init(adev); Loading hal/audio_hw.h +1 −0 Original line number Diff line number Diff line Loading @@ -431,6 +431,7 @@ struct audio_device { snd_device_t last_logged_snd_device[AUDIO_USECASE_MAX][2]; /* [out, in] */ int camera_orientation; /* CAMERA_BACK_LANDSCAPE ... CAMERA_FRONT_PORTRAIT */ bool bt_sco_on; bool a2dp_started; }; int select_devices(struct audio_device *adev, Loading Loading
hal/audio_extn/a2dp.c +1 −0 Original line number Diff line number Diff line Loading @@ -1424,6 +1424,7 @@ int audio_extn_a2dp_start_playback() if (ret != 0 ) { ALOGE("%s: Bluetooth controller start failed", __func__); a2dp.a2dp_started = false; ret = -ETIMEDOUT; } else { if (configure_a2dp_encoder_format() == true) { a2dp.a2dp_started = true; Loading
hal/audio_hw.c +31 −22 Original line number Diff line number Diff line Loading @@ -803,10 +803,13 @@ int enable_snd_device(struct audio_device *adev, ALOGD("%s: snd_device(%d: %s)", __func__, snd_device, device_name); if (is_a2dp_device(snd_device) && (audio_extn_a2dp_start_playback() < 0)) { if (is_a2dp_device(snd_device)) { if (audio_extn_a2dp_start_playback() < 0) { ALOGE("%s: failed to configure A2DP control path", __func__); goto on_error; } else { adev->a2dp_started = true; } } audio_route_apply_and_update_path(adev->audio_route, device_name); Loading Loading @@ -839,9 +842,10 @@ int disable_snd_device(struct audio_device *adev, if (adev->snd_dev_ref_cnt[snd_device] == 0) { audio_extn_dsm_feedback_enable(adev, snd_device, false); if (is_a2dp_device(snd_device)) if (is_a2dp_device(snd_device)) { audio_extn_a2dp_stop_playback(); adev->a2dp_started = false; } if ((snd_device == SND_DEVICE_OUT_SPEAKER || snd_device == SND_DEVICE_OUT_SPEAKER_SAFE || snd_device == SND_DEVICE_OUT_SPEAKER_REVERSE || Loading Loading @@ -2463,18 +2467,15 @@ int start_output_stream(struct stream_out *out) } if (out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) { if (!audio_extn_a2dp_is_ready()) { if (out->devices & (AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_SPEAKER_SAFE)) { a2dp_combo = true; } else { if (!(out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)) { } else if (!audio_extn_a2dp_is_ready() && !(out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)) { ALOGE("%s: A2DP profile is not ready, return error", __func__); ret = -EAGAIN; goto error_config; } } } } out->pcm_device_id = platform_get_pcm_device_id(out->usecase, PCM_PLAYBACK); if (out->pcm_device_id < 0) { ALOGE("%s: Invalid PCM device id(%d) for the usecase(%d)", Loading Loading @@ -2505,11 +2506,14 @@ int start_output_stream(struct stream_out *out) audio_streaming_hint_start(); audio_extn_perf_lock_acquire(); if (!(out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) || audio_extn_a2dp_is_ready()) { select_devices(adev, out->usecase); } if ((out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) && (!audio_extn_a2dp_is_ready())) { if (!a2dp_combo) { check_a2dp_restore_l(adev, out, false); } else { (!audio_extn_a2dp_is_ready() || !adev->a2dp_started)) { if (a2dp_combo) { audio_devices_t dev = out->devices; if (dev & AUDIO_DEVICE_OUT_SPEAKER_SAFE) out->devices = AUDIO_DEVICE_OUT_SPEAKER_SAFE; Loading @@ -2517,9 +2521,13 @@ int start_output_stream(struct stream_out *out) out->devices = AUDIO_DEVICE_OUT_SPEAKER; select_devices(adev, out->usecase); out->devices = dev; } } else if (!audio_extn_a2dp_is_ready()) { check_a2dp_restore_l(adev, out, false); } else { select_devices(adev, out->usecase); ALOGE("%s: A2DP is not started, return error", __func__); ret = -EINVAL; goto error_open; } } audio_extn_extspk_update(adev->extspk); Loading Loading @@ -6606,6 +6614,7 @@ static int adev_open(const hw_module_t *module, const char *name, adev->primary_output = NULL; adev->bluetooth_nrec = true; adev->acdb_settings = TTY_MODE_OFF; adev->a2dp_started = false; /* adev->cur_hdmi_channels = 0; by calloc() */ adev->snd_dev_ref_cnt = calloc(SND_DEVICE_MAX, sizeof(int)); voice_init(adev); Loading
hal/audio_hw.h +1 −0 Original line number Diff line number Diff line Loading @@ -431,6 +431,7 @@ struct audio_device { snd_device_t last_logged_snd_device[AUDIO_USECASE_MAX][2]; /* [out, in] */ int camera_orientation; /* CAMERA_BACK_LANDSCAPE ... CAMERA_FRONT_PORTRAIT */ bool bt_sco_on; bool a2dp_started; }; int select_devices(struct audio_device *adev, Loading