summaryrefslogtreecommitdiffstats
path: root/hal
diff options
context:
space:
mode:
authorWeiyin Jiang <wjiang@codeaurora.org>2016-11-23 15:30:29 +0800
committerGerrit - the friendly Code Review server <code-review@localhost>2016-12-20 22:15:54 -0800
commit6f4c8063ec889ae7d4a45881bce721c977388f08 (patch)
tree9b166c1dbc46c1a4c33b9264361481c8fab533a2 /hal
parenta8514360ba1e4bc66ff0f5fbe27b6356407f6326 (diff)
downloadhardware_qcom_audio-6f4c8063ec889ae7d4a45881bce721c977388f08.tar.gz
hardware_qcom_audio-6f4c8063ec889ae7d4a45881bce721c977388f08.tar.bz2
hardware_qcom_audio-6f4c8063ec889ae7d4a45881bce721c977388f08.zip
hal: add sample rate as a part of argument in gef callback
Add sample rate as a part of argument in gef callback, as client needs this information to determine what's the exact sample rate COPP is running and get calibration value accordingly. If there's gef APIs call in callback, device lock will be probed twice. Temproraily unlock device lock around GEF device change notification to solve deadlock. CRs-Fixed: 1094022 Change-Id: I47fdb1f88397e4340ba930113c64c140596bc62a
Diffstat (limited to 'hal')
-rw-r--r--hal/audio_extn/audio_extn.h4
-rw-r--r--hal/audio_extn/gef.c6
-rw-r--r--hal/audio_hw.c24
-rw-r--r--hal/msm8974/platform.c26
4 files changed, 55 insertions, 5 deletions
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 2bde664d..afc9a2e6 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -665,7 +665,7 @@ int audio_extn_keep_alive_set_parameters(struct audio_device *adev,
#define audio_extn_gef_init(adev) (0)
#define audio_extn_gef_deinit() (0)
-#define audio_extn_gef_notify_device_config(devices, cmask, acdb_id) (0)
+#define audio_extn_gef_notify_device_config(devices, cmask, sample_rate, acdb_id) (0)
#define audio_extn_gef_send_audio_cal(dev, acdb_dev_id, acdb_device_type,\
app_type, topology_id, sample_rate, module_id, param_id, data, length, persist) (0)
#define audio_extn_gef_get_audio_cal(adev, acdb_dev_id, acdb_device_type,\
@@ -681,7 +681,7 @@ void audio_extn_gef_init(struct audio_device *adev);
void audio_extn_gef_deinit();
void audio_extn_gef_notify_device_config(audio_devices_t audio_device,
- audio_channel_mask_t channel_mask, int acdb_id);
+ audio_channel_mask_t channel_mask, int sample_rate, int acdb_id);
int audio_extn_gef_send_audio_cal(void* adev, int acdb_dev_id, int acdb_device_type,
int app_type, int topology_id, int sample_rate, uint32_t module_id, uint32_t param_id,
void* data, int length, bool persist);
diff --git a/hal/audio_extn/gef.c b/hal/audio_extn/gef.c
index d0ccd8c1..dc5fbca6 100644
--- a/hal/audio_extn/gef.c
+++ b/hal/audio_extn/gef.c
@@ -53,7 +53,7 @@
typedef void* (*gef_init_t)(void*);
typedef void (*gef_device_config_cb_t)(void*, audio_devices_t,
- audio_channel_mask_t, int);
+ audio_channel_mask_t, int, int);
typedef struct {
void* handle;
@@ -259,14 +259,14 @@ int audio_extn_gef_retrieve_audio_cal(void* dev, int acdb_dev_id,
//this will be called from HAL to notify GEF of new device configuration
void audio_extn_gef_notify_device_config(audio_devices_t audio_device,
- audio_channel_mask_t channel_mask, int acdb_id)
+ audio_channel_mask_t channel_mask, int sample_rate, int acdb_id)
{
ALOGV("%s: Enter", __func__);
//call into GEF to share channel mask and device info
if (gef_hal_handle.handle && gef_hal_handle.device_config_cb) {
gef_hal_handle.device_config_cb(gef_hal_handle.gef_ptr, audio_device, channel_mask,
- acdb_id);
+ sample_rate, acdb_id);
}
ALOGV("%s: Exit", __func__);
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index d84515b4..134ddb14 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1599,11 +1599,35 @@ int select_devices(struct audio_device *adev, audio_usecase_t uc_id)
audio_extn_utils_update_stream_app_type_cfg_for_usecase(adev,
usecase);
if (usecase->type == PCM_PLAYBACK) {
+ if ((24 == usecase->stream.out->bit_width) &&
+ (usecase->stream.out->devices & AUDIO_DEVICE_OUT_SPEAKER)) {
+ usecase->stream.out->app_type_cfg.sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
+ } else if ((out_snd_device == SND_DEVICE_OUT_HDMI ||
+ out_snd_device == SND_DEVICE_OUT_USB_HEADSET ||
+ out_snd_device == SND_DEVICE_OUT_DISPLAY_PORT) &&
+ (usecase->stream.out->sample_rate >= OUTPUT_SAMPLING_RATE_44100)) {
+ /*
+ * To best utlize DSP, check if the stream sample rate is supported/multiple of
+ * configured device sample rate, if not update the COPP rate to be equal to the
+ * device sample rate, else open COPP at stream sample rate
+ */
+ platform_check_and_update_copp_sample_rate(adev->platform, out_snd_device,
+ usecase->stream.out->sample_rate,
+ &usecase->stream.out->app_type_cfg.sample_rate);
+ } else if ((out_snd_device != SND_DEVICE_OUT_HEADPHONES_44_1 &&
+ usecase->stream.out->sample_rate == OUTPUT_SAMPLING_RATE_44100) ||
+ (usecase->stream.out->sample_rate < OUTPUT_SAMPLING_RATE_44100)) {
+ usecase->stream.out->app_type_cfg.sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
+ }
+
/* Notify device change info to effect clients registered */
+ pthread_mutex_unlock(&adev->lock);
audio_extn_gef_notify_device_config(
usecase->stream.out->devices,
usecase->stream.out->channel_mask,
+ usecase->stream.out->app_type_cfg.sample_rate,
platform_get_snd_device_acdb_id(usecase->out_snd_device));
+ pthread_mutex_lock(&adev->lock);
}
enable_audio_route(adev, usecase);
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 462a18aa..55644d9d 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -832,6 +832,32 @@ static int msm_device_to_be_id [][NO_COLS] = {
{AUDIO_DEVICE_NONE , -1},
{AUDIO_DEVICE_OUT_DEFAULT , -1},
};
+#elif PLATFORM_MSM8998
+static int msm_device_to_be_id [][NO_COLS] = {
+ {AUDIO_DEVICE_OUT_EARPIECE , 2},
+ {AUDIO_DEVICE_OUT_SPEAKER , 2},
+ {AUDIO_DEVICE_OUT_WIRED_HEADSET , 41},
+ {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 41},
+ {AUDIO_DEVICE_OUT_BLUETOOTH_SCO , 11},
+ {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET , 11},
+ {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT , 11},
+ {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP , -1},
+ {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES , -1},
+ {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER , -1},
+ {AUDIO_DEVICE_OUT_AUX_DIGITAL , 4},
+ {AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET , 9},
+ {AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET , 9},
+ {AUDIO_DEVICE_OUT_USB_ACCESSORY , -1},
+ {AUDIO_DEVICE_OUT_USB_DEVICE , -1},
+ {AUDIO_DEVICE_OUT_REMOTE_SUBMIX , 9},
+ {AUDIO_DEVICE_OUT_PROXY , 9},
+/* Add the correct be ids */
+ {AUDIO_DEVICE_OUT_FM , 7},
+ {AUDIO_DEVICE_OUT_FM_TX , 8},
+ {AUDIO_DEVICE_OUT_ALL , -1},
+ {AUDIO_DEVICE_NONE , -1},
+ {AUDIO_DEVICE_OUT_DEFAULT , -1},
+};
#else
static int msm_device_to_be_id [][NO_COLS] = {
{AUDIO_DEVICE_NONE, -1},