hal: Support the audio amplifier hook
* Original legacy HAL commit:
Ib236598a5888b2af19bcfb81e285f644a0e84c0d
* Example: http://review.cyanogenmod.org/38221
(cyanogen: Refactored to be an audio_extn)
Change-Id: Ic944a9f7059c78b79322dae9c787cdd8bb029cff
audio: add amplifier stream start/standby operations
Change-Id: I5de7ad7a0467e7cf822c9c0870a755c03d05e884
hal: Convert libaudioamp to audio_amplifier HAL
Change-Id: I1d0f63a46989d1792d7a5e08d2bdb6344ebafa31
hal: Notify amplifier of device enable/disable
Change-Id: Ice808c9b55a9e3bc8bafe5ca3ff555377d38dd8f
hal: enable amplifier earlier
Change-Id: Id876e8f836e3ce1ee5f8186ca9c0e6ef5f37182c
hal: only open the amplifier once
Change-Id: Ie9bbff74123e90b71e95809a84dcb3bbe9ba82fe
hal: notify amplifier of parameter changes
Change-Id: Iecc020c0347ae7c43d27183186e06dcefef7a0dd
hal: Clean up audio amplifier usage
* Externalize it into an extension file similar to the rest.
Change-Id: I03de7efa9bab8870099028170fa471dfffe1ce84
audio: add amplifier hooks for stream parameter manipulation
hal: Use log/log.h instead of cutils/log.h
Change-Id: I6e52524cc650eea234fbcf64ed17104dd8a3f001
[Pig]: Clang-format
audio_amplifier: Add new hook for setting amp feedback
Change-Id: I6de5e9c9dbbb6214b166f30628734aeb406c8a2a
Change-Id: I16a76475cb58a710d229648d77024379bfc499d5
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 4516448..4f3af90 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -85,6 +85,8 @@
#include "sound/asound.h"
+#include "audio_amplifier.h"
+
#ifdef DYNAMIC_LOG_ENABLED
#include <log_xml_parser.h>
#define LOG_MASK HAL_MOD_FILE_AUDIO_HW
@@ -1403,6 +1405,7 @@
goto err;
}
audio_extn_dev_arbi_acquire(snd_device);
+ amplifier_enable_devices(snd_device, true);
if (audio_extn_spkr_prot_start_processing(snd_device)) {
ALOGE("%s: spkr_start_processing failed", __func__);
audio_extn_dev_arbi_release(snd_device);
@@ -1468,6 +1471,7 @@
}
audio_extn_dev_arbi_acquire(snd_device);
audio_route_apply_and_update_path(adev->audio_route, device_name);
+ amplifier_set_feedback(adev, snd_device, true);
if (SND_DEVICE_OUT_HEADPHONES == snd_device &&
!adev->native_playback_enabled &&
@@ -1539,6 +1543,7 @@
platform_set_speaker_gain_in_combo(adev, snd_device, false);
} else {
audio_route_reset_and_update_path(adev->audio_route, device_name);
+ amplifier_enable_devices(snd_device, false);
}
if (snd_device == SND_DEVICE_OUT_BT_A2DP) {
@@ -1569,6 +1574,7 @@
}
audio_extn_utils_release_snd_device(snd_device);
+ amplifier_set_feedback(adev, snd_device, false);
} else {
if (platform_split_snd_device(adev->platform,
snd_device,
@@ -2943,6 +2949,10 @@
disable_snd_device(adev, usecase->in_snd_device);
}
+ /* Rely on amplifier_set_devices to distinguish between in/out devices */
+ amplifier_set_input_devices(in_snd_device);
+ amplifier_set_output_devices(out_snd_device);
+
/* Applicable only on the targets that has external modem.
* New device information should be sent to modem before enabling
* the devices to reduce in-call device switch time.
@@ -4538,6 +4548,9 @@
}
pthread_mutex_lock(&adev->lock);
+
+ amplifier_output_stream_standby((struct audio_stream_out *) stream);
+
out->standby = true;
if (out->usecase == USECASE_COMPRESS_VOIP_CALL) {
voice_extn_compress_voip_close_output_stream(stream);
@@ -5040,6 +5053,8 @@
if (!parms)
goto error;
+ amplifier_out_set_parameters(parms);
+
err = platform_get_controller_stream_from_params(parms, &ext_controller,
&ext_stream);
if (err == 0) {
@@ -5888,6 +5903,11 @@
ret = voice_extn_compress_voip_start_output_stream(out);
else
ret = start_output_stream(out);
+
+ if (ret == 0)
+ amplifier_output_stream_start(stream,
+ is_offload_usecase(out->usecase));
+
/* ToDo: If use case is compress offload should return 0 */
if (ret != 0) {
out->standby = true;
@@ -6790,6 +6810,8 @@
adev->adm_deregister_stream(adev->adm_data, in->capture_handle);
pthread_mutex_lock(&adev->lock);
+ amplifier_input_stream_standby((struct audio_stream_in *) stream);
+
in->standby = true;
if (in->usecase == USECASE_COMPRESS_VOIP_CALL) {
do_stop = false;
@@ -6974,6 +6996,9 @@
if (!parms)
goto error;
+
+ amplifier_in_set_parameters(parms);
+
lock_input_stream(in);
pthread_mutex_lock(&adev->lock);
@@ -7122,6 +7147,10 @@
if (adev->num_va_sessions < UINT_MAX)
adev->num_va_sessions++;
}
+
+ if (ret == 0)
+ amplifier_input_stream_start(stream);
+
pthread_mutex_unlock(&adev->lock);
if (ret != 0) {
goto exit;
@@ -8981,6 +9010,7 @@
}
}
+ amplifier_set_parameters(parms);
audio_extn_set_parameters(adev, parms);
done:
str_parms_destroy(parms);
@@ -9109,6 +9139,8 @@
if (adev->mode != mode) {
ALOGD("%s: mode %d , prev_mode %d \n", __func__, mode , adev->mode);
adev->prev_mode = adev->mode; /* prev_mode is kept to handle voip concurrency*/
+ if (amplifier_set_mode(mode) != 0)
+ ALOGE("Failed setting amplifier mode");
adev->mode = mode;
if (mode == AUDIO_MODE_CALL_SCREEN) {
adev->current_call_output = adev->primary_output;
@@ -10262,6 +10294,8 @@
if ((--audio_device_ref_count) == 0) {
if (audio_extn_spkr_prot_is_enabled())
audio_extn_spkr_prot_deinit();
+ if (amplifier_close() != 0)
+ ALOGE("Amplifier close failed");
audio_extn_battery_properties_listener_deinit();
audio_extn_snd_mon_unregister_listener(adev);
audio_extn_sound_trigger_deinit(adev);
@@ -10677,6 +10711,10 @@
adev->vr_audio_mode_enabled = false;
audio_extn_ds2_enable(adev);
+
+ if (amplifier_open(adev) != 0)
+ ALOGE("Amplifier initialization failed");
+
*device = &adev->device.common;
if (k_enable_extended_precision)