Merge "pal: Remove pbr and cps mixer cntls."
diff --git a/configs/anorak/resourcemanager_anorak_idp.xml b/configs/anorak/resourcemanager_anorak_idp.xml
index 96dba6b..8a33e42 100644
--- a/configs/anorak/resourcemanager_anorak_idp.xml
+++ b/configs/anorak/resourcemanager_anorak_idp.xml
@@ -793,6 +793,12 @@
<channels>2</channels>
<snd_device_name>display-port</snd_device_name>
<fractional_sr>1</fractional_sr>
+ <!--specify the supported bit format on DP end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for DP as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
@@ -805,6 +811,12 @@
<channels>2</channels>
<fractional_sr>1</fractional_sr>
<snd_device_name>display-port</snd_device_name>
+ <!--specify the supported bit format on DP end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for DP as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
@@ -841,6 +853,12 @@
<channels>2</channels>
<snd_device_name>display-port</snd_device_name>
<fractional_sr>1</fractional_sr>
+ <!--specify the supported bit format on DP end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for DP as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
diff --git a/configs/anorak/resourcemanager_anorak_qxr.xml b/configs/anorak/resourcemanager_anorak_qxr.xml
index e652b32..1886b39 100644
--- a/configs/anorak/resourcemanager_anorak_qxr.xml
+++ b/configs/anorak/resourcemanager_anorak_qxr.xml
@@ -793,6 +793,12 @@
<channels>2</channels>
<snd_device_name>display-port</snd_device_name>
<fractional_sr>1</fractional_sr>
+ <!--specify the supported bit format on DP end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for DP as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
@@ -805,6 +811,12 @@
<channels>2</channels>
<fractional_sr>1</fractional_sr>
<snd_device_name>display-port</snd_device_name>
+ <!--specify the supported bit format on DP end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for DP as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
@@ -841,6 +853,12 @@
<channels>2</channels>
<snd_device_name>display-port</snd_device_name>
<fractional_sr>1</fractional_sr>
+ <!--specify the supported bit format on DP end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for DP as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
diff --git a/configs/kalama/resourcemanager_kalama_cdp.xml b/configs/kalama/resourcemanager_kalama_cdp.xml
index 78e7309..55da509 100644
--- a/configs/kalama/resourcemanager_kalama_cdp.xml
+++ b/configs/kalama/resourcemanager_kalama_cdp.xml
@@ -898,6 +898,12 @@
<channels>2</channels>
<snd_device_name>display-port</snd_device_name>
<fractional_sr>1</fractional_sr>
+ <!--specify the supported bit format on DP end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for DP as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
@@ -910,6 +916,12 @@
<channels>2</channels>
<fractional_sr>1</fractional_sr>
<snd_device_name>display-port</snd_device_name>
+ <!--specify the supported bit format on HDMI end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for HDMI as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
@@ -946,6 +958,12 @@
<channels>2</channels>
<snd_device_name>display-port</snd_device_name>
<fractional_sr>1</fractional_sr>
+ <!--specify the supported bit format on DP end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for DP as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
diff --git a/configs/kalama/resourcemanager_kalama_grd.xml b/configs/kalama/resourcemanager_kalama_grd.xml
index 75eb458..693377a 100644
--- a/configs/kalama/resourcemanager_kalama_grd.xml
+++ b/configs/kalama/resourcemanager_kalama_grd.xml
@@ -893,6 +893,12 @@
<channels>2</channels>
<snd_device_name>display-port</snd_device_name>
<fractional_sr>1</fractional_sr>
+ <!--specify the supported bit format on DP end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for DP as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
@@ -905,6 +911,12 @@
<channels>2</channels>
<fractional_sr>1</fractional_sr>
<snd_device_name>display-port</snd_device_name>
+ <!--specify the supported bit format on HDMI end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for HDMI as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
@@ -941,6 +953,12 @@
<channels>2</channels>
<snd_device_name>display-port</snd_device_name>
<fractional_sr>1</fractional_sr>
+ <!--specify the supported bit format on DP end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for DP as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
diff --git a/configs/kalama/resourcemanager_kalama_mtp.xml b/configs/kalama/resourcemanager_kalama_mtp.xml
index ce7c34f..785d3e4 100644
--- a/configs/kalama/resourcemanager_kalama_mtp.xml
+++ b/configs/kalama/resourcemanager_kalama_mtp.xml
@@ -913,6 +913,12 @@
<channels>2</channels>
<snd_device_name>display-port</snd_device_name>
<fractional_sr>1</fractional_sr>
+ <!--specify the supported bit format on DP end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for DP as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
@@ -925,6 +931,12 @@
<channels>2</channels>
<fractional_sr>1</fractional_sr>
<snd_device_name>display-port</snd_device_name>
+ <!--specify the supported bit format on HDMI end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for HDMI as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
@@ -961,6 +973,12 @@
<channels>2</channels>
<snd_device_name>display-port</snd_device_name>
<fractional_sr>1</fractional_sr>
+ <!--specify the supported bit format on DP end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for DP as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
diff --git a/configs/kalama/resourcemanager_kalama_qrd.xml b/configs/kalama/resourcemanager_kalama_qrd.xml
index e5ae3f3..d65f246 100644
--- a/configs/kalama/resourcemanager_kalama_qrd.xml
+++ b/configs/kalama/resourcemanager_kalama_qrd.xml
@@ -914,6 +914,12 @@
<channels>2</channels>
<snd_device_name>display-port</snd_device_name>
<fractional_sr>1</fractional_sr>
+ <!--specify the supported bit format on DP end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for DP as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
@@ -926,6 +932,12 @@
<channels>2</channels>
<fractional_sr>1</fractional_sr>
<snd_device_name>display-port</snd_device_name>
+ <!--specify the supported bit format on HDMI end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for HDMI as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
@@ -962,6 +974,12 @@
<channels>2</channels>
<snd_device_name>display-port</snd_device_name>
<fractional_sr>1</fractional_sr>
+ <!--specify the supported bit format on DP end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for DP as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
<usecase>
<name>PAL_STREAM_VOICE_CALL</name>
<priority>1</priority>
diff --git a/inc/PalDefs.h b/inc/PalDefs.h
index 4f21e6b..e6abbc3 100644
--- a/inc/PalDefs.h
+++ b/inc/PalDefs.h
@@ -27,7 +27,7 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Changes from Qualcomm Innovation Center are provided under the following license:
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
* SPDX-License-Identifier: BSD-3-Clause-Clear
*/
@@ -968,6 +968,7 @@
PAL_PARAM_ID_SET_SINK_METADATA = 61,
PAL_PARAM_ID_ULTRASOUND_RAMPDOWN = 62,
PAL_PARAM_ID_VOLUME_CTRL_RAMP = 63,
+ PAL_PARAM_ID_ULTRASOUND_SET_GAIN = 64,
} pal_param_id_type_t;
/** HDMI/DP */
@@ -1203,6 +1204,13 @@
int intensity;
} pal_param_haptics_intensity_t;
+/* Type of Ultrasound Gain */
+typedef enum {
+ PAL_ULTRASOUND_GAIN_MUTE = 0,
+ PAL_ULTRASOUND_GAIN_LOW,
+ PAL_ULTRASOUND_GAIN_HIGH,
+} pal_ultrasound_gain_t;
+
/**< PAL device */
#define DEVICE_NAME_MAX_SIZE 128
struct pal_device {
diff --git a/resource_manager/inc/ResourceManager.h b/resource_manager/inc/ResourceManager.h
index 314adcf..77b75ae 100644
--- a/resource_manager/inc/ResourceManager.h
+++ b/resource_manager/inc/ResourceManager.h
@@ -28,36 +28,7 @@
*
* Changes from Qualcomm Innovation Center are provided under the following license:
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted (subject to the limitations in the
- * disclaimer below) provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- *
- * * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
- * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
- * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
- * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
*/
#ifndef RESOURCE_MANAGER_H
@@ -105,6 +76,7 @@
#define AUDIO_PARAMETER_KEY_HIFI_FILTER "hifi_filter"
#define AUDIO_PARAMETER_KEY_LPI_LOGGING "lpi_logging_enable"
#define AUDIO_PARAMETER_KEY_UPD_DEDICATED_BE "upd_dedicated_be"
+#define AUDIO_PARAMETER_KEY_UPD_SET_CUSTOM_GAIN "upd_set_custom_gain"
#define AUDIO_PARAMETER_KEY_DUAL_MONO "dual_mono"
#define AUDIO_PARAMETER_KEY_SIGNAL_HANDLER "signal_handler"
#define AUDIO_PARAMETER_KEY_DEVICE_MUX "device_mux_config"
@@ -496,6 +468,7 @@
void onChargingStateChange();
void onVUIStreamRegistered();
void onVUIStreamDeregistered();
+ int setUltrasoundGain(pal_ultrasound_gain_t gain, Stream *s);
protected:
std::list <Stream*> mActiveStreams;
std::list <StreamPCM*> active_streams_ll;
@@ -666,6 +639,8 @@
static bool isUpdDutyCycleEnabled;
/* Flag to indicate if virtual port is enabled for UPD */
static bool isUPDVirtualPortEnabled;
+ /* Flag to indicate whether to send custom gain commands to UPD modules or not? */
+ static bool isUpdSetCustomGainEnabled;
/* Variable to store max volume index for voice call */
static int max_voice_vol;
/*variable to store MSPP linear gain*/
@@ -806,7 +781,8 @@
int getActiveStream_l(std::vector<Stream*> &activestreams,std::shared_ptr<Device> d = nullptr);
int getOrphanStream(std::vector<Stream*> &orphanstreams, std::vector<Stream*> &retrystreams);
int getOrphanStream_l(std::vector<Stream*> &orphanstreams, std::vector<Stream*> &retrystreams);
- int getActiveDevices(std::vector<std::shared_ptr<Device>> &deviceList);
+ void getActiveDevices(std::vector<std::shared_ptr<Device>> &deviceList);
+ void getActiveDevices_l(std::vector<std::shared_ptr<Device>> &deviceList);
int getSndDeviceName(int deviceId, char *device_name);
int getDeviceEpName(int deviceId, std::string &epName);
int getBackendName(int deviceId, std::string &backendName);
@@ -848,6 +824,7 @@
bool IsDedicatedBEForUPDEnabled();
bool IsDutyCycleForUPDEnabled();
bool IsVirtualPortForUPDEnabled();
+ bool IsCustomGainEnabledForUPD();
void GetSoundTriggerConcurrencyCount(pal_stream_type_t type, int32_t *enable_count, int32_t *disable_count);
void GetSoundTriggerConcurrencyCount_l(pal_stream_type_t type, int32_t *enable_count, int32_t *disable_count);
bool GetChargingState() const { return charging_state_; }
@@ -932,6 +909,7 @@
static int setUpdDedicatedBeEnableParam(struct str_parms *parms,char *value, int len);
static int setUpdDutyCycleEnableParam(struct str_parms *parms,char *value, int len);
static int setUpdVirtualPortParam(struct str_parms *parms, char *value, int len);
+ static int setUpdCustomGainParam(struct str_parms *parms,char *value, int len);
static int setDualMonoEnableParam(struct str_parms *parms,char *value, int len);
static int setSignalHandlerEnableParam(struct str_parms *parms,char *value, int len);
static int setMuxconfigEnableParam(struct str_parms *parms,char *value, int len);
diff --git a/resource_manager/src/ResourceManager.cpp b/resource_manager/src/ResourceManager.cpp
index cd27f5d..9f554f8 100644
--- a/resource_manager/src/ResourceManager.cpp
+++ b/resource_manager/src/ResourceManager.cpp
@@ -509,6 +509,7 @@
bool ResourceManager::isDeviceMuxConfigEnabled = false;
bool ResourceManager::isUpdDutyCycleEnabled = false;
bool ResourceManager::isUPDVirtualPortEnabled = false;
+bool ResourceManager::isUpdSetCustomGainEnabled = false;
int ResourceManager::max_voice_vol = -1; /* Variable to store max volume index for voice call */
bool ResourceManager::isSignalHandlerEnabled = false;
@@ -2745,15 +2746,23 @@
else
deviceattr->config.bit_width = BITWIDTH_16;
}
- if (deviceattr->config.bit_width == 32) {
- deviceattr->config.aud_fmt_id = PAL_AUDIO_FMT_PCM_S32_LE;
- } else if (deviceattr->config.bit_width == 24) {
- if (sAttr->out_media_config.aud_fmt_id == PAL_AUDIO_FMT_PCM_S24_LE)
- deviceattr->config.aud_fmt_id = PAL_AUDIO_FMT_PCM_S24_LE;
- else
- deviceattr->config.aud_fmt_id = PAL_AUDIO_FMT_PCM_S24_3LE;
+ if ((deviceattr->config.bit_width == BITWIDTH_32) &&
+ (devinfo.bitFormatSupported != PAL_AUDIO_FMT_PCM_S32_LE)) {
+ PAL_DBG(LOG_TAG, "32 bit is not supported; update with supported bit format");
+ deviceattr->config.aud_fmt_id = devinfo.bitFormatSupported;
+ deviceattr->config.bit_width =
+ palFormatToBitwidthLookup(devinfo.bitFormatSupported);
} else {
- deviceattr->config.aud_fmt_id = PAL_AUDIO_FMT_PCM_S16_LE;
+ if (deviceattr->config.bit_width == 32) {
+ deviceattr->config.aud_fmt_id = PAL_AUDIO_FMT_PCM_S32_LE;
+ } else if (deviceattr->config.bit_width == 24) {
+ if (sAttr->out_media_config.aud_fmt_id == PAL_AUDIO_FMT_PCM_S24_LE)
+ deviceattr->config.aud_fmt_id = PAL_AUDIO_FMT_PCM_S24_LE;
+ else
+ deviceattr->config.aud_fmt_id = PAL_AUDIO_FMT_PCM_S24_3LE;
+ } else {
+ deviceattr->config.aud_fmt_id = PAL_AUDIO_FMT_PCM_S16_LE;
+ }
}
PAL_DBG(LOG_TAG, "devcie %d sample rate %d bitwidth %d",
@@ -3986,6 +3995,16 @@
} else {
checkandEnableEC_l(d, s, true);
}
+
+ if (IsCustomGainEnabledForUPD() &&
+ (1 == d->getDeviceCount())) {
+ /* Try to set Ultrasound Gain if needed */
+ if (PAL_DEVICE_OUT_SPEAKER == d->getSndDeviceId()) {
+ setUltrasoundGain(PAL_ULTRASOUND_GAIN_HIGH, s);
+ } else if (PAL_DEVICE_OUT_HANDSET == d->getSndDeviceId()) {
+ setUltrasoundGain(PAL_ULTRASOUND_GAIN_LOW, s);
+ }
+ }
mResourceManagerMutex.unlock();
PAL_DBG(LOG_TAG, "Exit.");
@@ -4021,6 +4040,14 @@
} else {
checkandEnableEC_l(d, s, false);
}
+
+ if (IsCustomGainEnabledForUPD() &&
+ (1 == d->getDeviceCount()) &&
+ ((PAL_DEVICE_OUT_SPEAKER == d->getSndDeviceId()) ||
+ (PAL_DEVICE_OUT_HANDSET == d->getSndDeviceId()))) {
+ setUltrasoundGain(PAL_ULTRASOUND_GAIN_MUTE, s);
+ }
+
mResourceManagerMutex.unlock();
PAL_DBG(LOG_TAG, "Exit.");
return 0;
@@ -4115,14 +4142,17 @@
return ret;
}
-int ResourceManager::getActiveDevices(std::vector<std::shared_ptr<Device>> &deviceList)
+void ResourceManager::getActiveDevices_l(std::vector<std::shared_ptr<Device>> &deviceList)
{
- int ret = 0;
- mResourceManagerMutex.lock();
for (int i = 0; i < active_devices.size(); i++)
deviceList.push_back(active_devices[i].first);
+}
+
+void ResourceManager::getActiveDevices(std::vector<std::shared_ptr<Device>> &deviceList)
+{
+ mResourceManagerMutex.lock();
+ getActiveDevices_l(deviceList);
mResourceManagerMutex.unlock();
- return ret;
}
int ResourceManager::getAudioRoute(struct audio_route** ar)
@@ -4228,6 +4258,11 @@
return ResourceManager::isUPDVirtualPortEnabled;
}
+bool ResourceManager::IsCustomGainEnabledForUPD()
+{
+ return ResourceManager::isUpdSetCustomGainEnabled;
+}
+
void ResourceManager::GetSoundTriggerConcurrencyCount(
pal_stream_type_t type,
int32_t *enable_count, int32_t *disable_count) {
@@ -5123,6 +5158,12 @@
mActiveStreamMutex.lock();
PAL_DBG(LOG_TAG, "Enter, stream type %d, direction %d, active %d", type, dir, active);
+ if (deferredSwitchState == DEFER_LPI_NLPI_SWITCH) {
+ use_lpi_temp = false;
+ } else if (deferredSwitchState == DEFER_NLPI_LPI_SWITCH) {
+ use_lpi_temp = true;
+ }
+
st_streams.push_back(PAL_STREAM_VOICE_UI);
st_streams.push_back(PAL_STREAM_ACD);
st_streams.push_back(PAL_STREAM_SENSOR_PCM_DATA);
@@ -7746,6 +7787,7 @@
ret = setContextManagerEnableParam(parms, value, len);
ret = setUpdDedicatedBeEnableParam(parms, value, len);
+ ret = setUpdCustomGainParam(parms, value, len);
ret = setDualMonoEnableParam(parms, value, len);
ret = setSignalHandlerEnableParam(parms, value, len);
ret = setMuxconfigEnableParam(parms, value, len);
@@ -7911,6 +7953,29 @@
return ret;
}
+int ResourceManager::setUpdCustomGainParam(struct str_parms *parms,
+ char *value, int len)
+{
+ int ret = -EINVAL;
+
+ if (!value || !parms)
+ return ret;
+
+ ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_UPD_SET_CUSTOM_GAIN,
+ value, len);
+ PAL_VERBOSE(LOG_TAG," value %s", value);
+
+ if (ret >= 0) {
+ if (value && !strncmp(value, "true", sizeof("true")))
+ ResourceManager::isUpdSetCustomGainEnabled = true;
+
+ str_parms_del(parms, AUDIO_PARAMETER_KEY_UPD_SET_CUSTOM_GAIN);
+ }
+
+ return ret;
+
+}
+
int ResourceManager::setDualMonoEnableParam(struct str_parms *parms,
char *value, int len)
{
@@ -9176,8 +9241,7 @@
}
dAttr.id = (pal_device_id_t)associatedDevices[i]->getSndDeviceId();
dev = Device::getInstance(&dAttr, rm);
- if (dev && (!isBtScoDevice(dAttr.id)) &&
- (dAttr.id != PAL_DEVICE_OUT_PROXY) &&
+ if (dev && (dAttr.id != PAL_DEVICE_OUT_PROXY) &&
isDeviceAvailable(PAL_DEVICE_OUT_BLUETOOTH_SCO)) {
rxDevices.push_back(dev);
}
@@ -9193,8 +9257,7 @@
}
dAttr.id = (pal_device_id_t)associatedDevices[i]->getSndDeviceId();
dev = Device::getInstance(&dAttr, rm);
- if (dev && (!isBtScoDevice(dAttr.id)) &&
- isDeviceAvailable(PAL_DEVICE_IN_BLUETOOTH_SCO_HEADSET)) {
+ if (dev && isDeviceAvailable(PAL_DEVICE_IN_BLUETOOTH_SCO_HEADSET)) {
txDevices.push_back(dev);
}
}
@@ -11917,3 +11980,127 @@
exit:
return ret;
}
+
+int ResourceManager::setUltrasoundGain(pal_ultrasound_gain_t gain, Stream *s)
+{
+ int32_t status = 0;
+
+ struct pal_device dAttr;
+ StreamUltraSound *updStream = NULL;
+ std::vector<Stream*> activeStreams;
+ struct pal_stream_attributes sAttr;
+ struct pal_stream_attributes sAttr1;
+ std::vector<std::shared_ptr<Device>> activeDeviceList;
+ pal_ultrasound_gain_t gain_2 = PAL_ULTRASOUND_GAIN_MUTE;
+
+ PAL_INFO(LOG_TAG, "Entered. Gain = %d", gain);
+
+ if (!IsCustomGainEnabledForUPD()) {
+ PAL_ERR(LOG_TAG,"Custom Gain not enabled for UPD, returning");
+ return status;
+ }
+
+ if (s) {
+ status = s->getStreamAttributes(&sAttr);
+ if (status != 0) {
+ PAL_ERR(LOG_TAG,"stream get attributes failed");
+ return -ENOENT;
+ }
+ }
+
+ if (PAL_STREAM_ULTRASOUND == sAttr.type) {
+ updStream = static_cast<StreamUltraSound *> (s);
+ } else {
+ status = getActiveStream_l(activeStreams, NULL);
+ if ((0 != status) || (activeStreams.size() == 0)) {
+ PAL_DBG(LOG_TAG, "No active stream available, status = %d, nStream = %d",
+ status, activeStreams.size());
+ return -ENOENT;
+ }
+
+ for (int i = 0; i < activeStreams.size(); i++) {
+ status = (static_cast<Stream *> (activeStreams[i]))->getStreamAttributes(&sAttr1);
+ if (0 != status) {
+ PAL_DBG(LOG_TAG, "Fail to get Stream Attributes, status = %d", status);
+ continue;
+ }
+
+ if (PAL_STREAM_ULTRASOUND == sAttr1.type) {
+ updStream = static_cast<StreamUltraSound *> (activeStreams[i]);
+ /* Found UPD stream, break here */
+ PAL_INFO(LOG_TAG, "Found UPD Stream = %p", updStream);
+ break;
+ }
+ }
+ }
+ /* Skip if we do not found upd stream or UPD stream is not active*/
+ if (!updStream || !updStream->isActive()) {
+ PAL_INFO(LOG_TAG, "Either UPD Stream not found or not active, returning");
+ return 0;
+ }
+
+
+ if (!isDeviceSwitch && (PAL_STREAM_ULTRASOUND != sAttr.type))
+ status = updStream->setUltraSoundGain(gain);
+ else
+ status = updStream->setUltraSoundGain_l(gain);
+
+ if (0 != status) {
+ PAL_ERR(LOG_TAG, "SetParameters failed, status = %d", status);
+ return status;
+ }
+
+ PAL_INFO(LOG_TAG, "Ultrasound gain(%d) set, status = %d", gain, status);
+
+ /* If provided gain is MUTE then in some cases we may need to set new gain LOW/HIGH based on
+ * concurrencies.
+ *
+ * Skip setting new gain if,
+ * - currently set gain is not Mute
+ * - or if device switch is active (new gain will be set once new device is active)
+ *
+ * This should avoid multiple set gain calls while stream is being closed/in middle of device switch
+ */
+
+ if ((PAL_ULTRASOUND_GAIN_MUTE != gain) || isDeviceSwitch) {
+ return 0;
+ }
+
+ /* Find new GAIN value based on currently active devices */
+ getActiveDevices_l(activeDeviceList);
+ for (int i = 0; i < activeDeviceList.size(); i++) {
+ status = activeDeviceList[i]->getDeviceAttributes(&dAttr);
+ if (0 != status) {
+ PAL_ERR(LOG_TAG, "Fail to get device attribute for device %p, status = %d",
+ &activeDeviceList[i], status);
+ continue;
+ }
+ if (PAL_DEVICE_OUT_SPEAKER == dAttr.id) {
+ gain_2 = PAL_ULTRASOUND_GAIN_HIGH;
+ /* Only breaking here as we want to give priority to speaker device */
+ break;
+ } else if ((PAL_DEVICE_OUT_ULTRASOUND == dAttr.id) ||
+ (PAL_DEVICE_OUT_HANDSET == dAttr.id)) {
+ gain_2 = PAL_ULTRASOUND_GAIN_LOW;
+ }
+ }
+
+ if (PAL_ULTRASOUND_GAIN_MUTE != gain_2) {
+ /* Currently configured value is 20ms which allows 3 to 4 process call
+ * to handle this value at ADSP side.
+ * Increase or decrease this dealy based on requirements */
+ usleep(20000);
+ if (PAL_STREAM_ULTRASOUND != sAttr.type)
+ status = updStream->setUltraSoundGain(gain_2);
+ else
+ status = updStream->setUltraSoundGain_l(gain_2);
+
+ if (0 != status) {
+ PAL_ERR(LOG_TAG, "SetParameters failed, status = %d", status);
+ return status;
+ }
+ PAL_INFO(LOG_TAG, "Ultrasound gain(%d) set, status = %d", gain_2, status);
+ }
+
+ return status;
+}
diff --git a/session/src/SessionAlsaCompress.cpp b/session/src/SessionAlsaCompress.cpp
index aebf3e2..25648a9 100644
--- a/session/src/SessionAlsaCompress.cpp
+++ b/session/src/SessionAlsaCompress.cpp
@@ -58,6 +58,11 @@
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ *
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
*/
#define LOG_TAG "PAL: SessionAlsaCompress"
@@ -1327,6 +1332,11 @@
switch (sAttr.direction) {
case PAL_AUDIO_OUTPUT:
+ if (!compressDevIds.size()) {
+ PAL_ERR(LOG_TAG, "frontendIDs are not available");
+ status = -EINVAL;
+ goto exit;
+ }
/** create an offload thread for posting callbacks */
worker_thread = std::make_unique<std::thread>(offloadThreadLoop, this);
@@ -1512,6 +1522,11 @@
}
break;
case PAL_AUDIO_INPUT:
+ if (!compressDevIds.size()) {
+ PAL_ERR(LOG_TAG, "frontendIDs are not available");
+ status = -EINVAL;
+ goto exit;
+ }
compress_cap_buf_size = in_buf_size;
compress_config.fragment_size = in_buf_size;
compress_config.fragments = in_buf_count;
@@ -1699,6 +1714,16 @@
event_cfg.event_id = EVENT_ID_SOFT_PAUSE_PAUSE_COMPLETE;
event_cfg.event_config_payload_size = 0;
event_cfg.is_register = 0;
+ if (!compressDevIds.size()) {
+ PAL_ERR(LOG_TAG, "frontendIDs are not available");
+ status = -EINVAL;
+ goto exit;
+ }
+ if (!rxAifBackEnds.size()) {
+ PAL_ERR(LOG_TAG, "rxAifBackEnds are not available");
+ status = -EINVAL;
+ goto exit;
+ }
status = SessionAlsaUtils::registerMixerEvent(mixer, compressDevIds.at(0),
rxAifBackEnds[0].second.data(), TAG_PAUSE, (void *)&event_cfg,
payload_size);
@@ -1730,6 +1755,7 @@
case PAL_AUDIO_INPUT_OUTPUT:
break;
}
+exit:
rm->voteSleepMonitor(s, false);
PAL_DBG(LOG_TAG, "Exit status: %d", status);
return status;
diff --git a/session/src/SessionAlsaPcm.cpp b/session/src/SessionAlsaPcm.cpp
index 5850b01..f3516e9 100644
--- a/session/src/SessionAlsaPcm.cpp
+++ b/session/src/SessionAlsaPcm.cpp
@@ -27,42 +27,7 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Changes from Qualcomm Innovation Center are provided under the following license:
- *
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted (subject to the limitations in the
- * disclaimer below) provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- *
- * * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
- * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
- * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
- * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Changes from Qualcomm Innovation Center are provided under the following license:
- *
- * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
* SPDX-License-Identifier: BSD-3-Clause-Clear
*/
@@ -1320,6 +1285,11 @@
PAL_ERR(LOG_TAG, "getAssociatedDevices Failed\n");
goto exit;
}
+ if (!rxAifBackEnds.size()) {
+ PAL_ERR(LOG_TAG, "rxAifBackEnds are not available");
+ status = -EINVAL;
+ goto exit;
+ }
for (int i = 0; i < associatedDevices.size();i++) {
status = associatedDevices[i]->getDeviceAttributes(&dAttr);
if (0 != status) {
@@ -1569,6 +1539,11 @@
}
break;
case PAL_AUDIO_INPUT | PAL_AUDIO_OUTPUT:
+ if (!rxAifBackEnds.size()) {
+ PAL_ERR(LOG_TAG, "rxAifBackEnds are not available");
+ status = -EINVAL;
+ goto exit;
+ }
status = s->getAssociatedDevices(associatedDevices);
if (0 != status) {
PAL_ERR(LOG_TAG, "getAssociatedDevices Failed");
@@ -1748,6 +1723,11 @@
status = -EINVAL;
goto exit;
}
+ if (!rxAifBackEnds.size()) {
+ PAL_ERR(LOG_TAG, "rxAifBackEnds are not available");
+ status = -EINVAL;
+ goto exit;
+ }
status = SessionAlsaUtils::registerMixerEvent(mixer, pcmDevIds.at(0),
rxAifBackEnds[0].second.data(), TAG_PAUSE, (void *)&event_cfg,
payload_size);
@@ -2134,6 +2114,7 @@
std::vector<std::pair<int32_t, std::string>> rxAifBackEndsToConnect;
std::vector<std::pair<int32_t, std::string>> txAifBackEndsToConnect;
int32_t status = 0;
+ struct pal_device dAttr1;
deviceList.push_back(deviceToConnect);
rm->getBackEndNames(deviceList, rxAifBackEndsToConnect,
@@ -2681,6 +2662,91 @@
}
return 0;
}
+ case PAL_PARAM_ID_ULTRASOUND_SET_GAIN:
+ {
+ std::vector <std::pair<int, int>> tkv;
+ const char *setParamTagControl = " setParamTag";
+ const char *streamPcm = "PCM";
+ struct mixer_ctl *ctl;
+ std::ostringstream tagCntrlName;
+ int sendToRx = 1;
+ struct agm_tag_config* tagConfig = NULL;
+ int tkv_size = 0;
+ pal_ultrasound_gain_t gain = PAL_ULTRASOUND_GAIN_MUTE;
+
+ if (!rm->IsCustomGainEnabledForUPD()) {
+ PAL_ERR(LOG_TAG, "Custom Gain not enabled for UPD, returning");
+ goto skip_ultrasound_gain;
+ }
+
+ /* Search for the tag in Rx path first */
+ device = pcmDevRxIds.at(0);
+ status = SessionAlsaUtils::getModuleInstanceId(mixer, device,
+ rxAifBackEnds[0].second.data(),
+ tagId, &miid);
+
+ /* Rx search failed, Check if we can find the tag in Tx path */
+ if ((0 != status) || (0 == miid)) {
+ PAL_DBG(LOG_TAG, "Fail to find module in Rx path status(%d), Now checking in Tx path", status);
+ device = pcmDevTxIds.at(0);
+ status = SessionAlsaUtils::getModuleInstanceId(mixer, device,
+ txAifBackEnds[0].second.data(),
+ tagId, &miid);
+ sendToRx = 0;
+ }
+ if (0 != status) {
+ PAL_ERR(LOG_TAG, "Failed to get tag info %x, status = %d", tagId, status);
+ goto skip_ultrasound_gain;
+ }
+
+ PAL_INFO(LOG_TAG, "Found module with TAG_ULTRASOUND_GAIN, miid = 0x%04x", miid);
+ gain = *((pal_ultrasound_gain_t *)payload);
+
+ tkv.clear();
+ tkv.push_back(std::make_pair(TAG_KEY_ULTRASOUND_GAIN, (uint32_t)gain));
+ PAL_INFO(LOG_TAG, "Setting TAG_KEY_ULTRASOUND_GAIN, Value %d\n", gain);
+
+ tagConfig = (struct agm_tag_config*)malloc(sizeof(struct agm_tag_config) +
+ (tkv.size() * sizeof(agm_key_value)));
+
+ if (!tagConfig) {
+ status = -EINVAL;
+ goto skip_ultrasound_gain;
+ }
+
+ status = SessionAlsaUtils::getTagMetadata(TAG_ULTRASOUND_GAIN, tkv, tagConfig);
+ if (0 != status)
+ goto skip_ultrasound_gain;
+
+ if (sendToRx) {
+ tagCntrlName<<streamPcm<<pcmDevRxIds.at(0)<<setParamTagControl;
+ ctl = mixer_get_ctl_by_name(mixer, tagCntrlName.str().data());
+ if (!ctl) {
+ PAL_ERR(LOG_TAG, "Invalid mixer control: %s\n", tagCntrlName.str().data());
+ status = -EINVAL;
+ goto skip_ultrasound_gain;
+ }
+ tkv_size = tkv.size()*sizeof(struct agm_key_value);
+ status = mixer_ctl_set_array(ctl, tagConfig, sizeof(struct agm_tag_config) + tkv_size);
+ } else {
+ tagCntrlName<<streamPcm<<pcmDevTxIds.at(0)<<setParamTagControl;
+ ctl = mixer_get_ctl_by_name(mixer, tagCntrlName.str().data());
+ if (!ctl) {
+ PAL_ERR(LOG_TAG, "Invalid mixer control: %s\n", tagCntrlName.str().data());
+ status = -EINVAL;
+ goto skip_ultrasound_gain;
+ }
+ tkv_size = tkv.size()*sizeof(struct agm_key_value);
+ status = mixer_ctl_set_array(ctl, tagConfig, sizeof(struct agm_tag_config) + tkv_size);
+ }
+
+skip_ultrasound_gain:
+ if (status)
+ PAL_ERR(LOG_TAG, "Failed to set Ultrasound Gain %d", status);
+ return 0;
+ }
+
+
default:
status = -EINVAL;
PAL_ERR(LOG_TAG, "Unsupported param id %u status %d", param_id, status);
diff --git a/stream/inc/StreamUltraSound.h b/stream/inc/StreamUltraSound.h
index 922bf3d..a9e193c 100644
--- a/stream/inc/StreamUltraSound.h
+++ b/stream/inc/StreamUltraSound.h
@@ -25,6 +25,10 @@
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
*/
#ifndef STREAMULTRASOUND_H_
@@ -44,8 +48,12 @@
~StreamUltraSound();
int32_t setVolume( struct pal_volume_data *volume __unused) {return 0;}
int32_t setParameters(uint32_t param_id, void *payload);
+ int32_t start();
int32_t stop();
+ int32_t setUltraSoundGain_l(pal_ultrasound_gain_t new_gain);
+ int32_t setUltraSoundGain(pal_ultrasound_gain_t new_gain);
private:
+ pal_ultrasound_gain_t gain;
static void HandleCallBack(uint64_t hdl, uint32_t event_id,
void *data, uint32_t event_size, uint32_t miid);
void HandleEvent(uint32_t event_id, void *data, uint32_t event_size);
diff --git a/stream/src/Stream.cpp b/stream/src/Stream.cpp
index 0cbbcd4..3a3e8a8 100644
--- a/stream/src/Stream.cpp
+++ b/stream/src/Stream.cpp
@@ -1646,6 +1646,43 @@
matchFound = false;
}
}
+ /*In case of SWB-->WB/NB SCO voip SHO, APM sends explicit routing separately
+ * for RX and TX path, it causes ar_osal timewait crash at the DSP to
+ * route just one RX/TX path with new GKV and add graph for feedback path
+ * since other TX/RX path still intact with SWB codec. Thus, forcedly route
+ * other path also to WB/NB if it's active on SCO device.
+ */
+ if (matchFound && ((strAttr.type == PAL_STREAM_VOIP_RX &&
+ newDeviceId == PAL_DEVICE_OUT_BLUETOOTH_SCO &&
+ rm->isDeviceActive(PAL_DEVICE_IN_BLUETOOTH_SCO_HEADSET)) ||
+ (strAttr.type == PAL_STREAM_VOIP_TX &&
+ newDeviceId == PAL_DEVICE_IN_BLUETOOTH_SCO_HEADSET &&
+ rm->isDeviceActive(PAL_DEVICE_OUT_BLUETOOTH_SCO)))) {
+ struct pal_device sco_Dattr = {};
+ std::shared_ptr<Device> scoDev = nullptr;
+ std::vector <Stream*> activeStreams;
+ if (newDeviceId == PAL_DEVICE_OUT_BLUETOOTH_SCO) {
+ sco_Dattr.id = PAL_DEVICE_IN_BLUETOOTH_SCO_HEADSET;
+ } else {
+ sco_Dattr.id = PAL_DEVICE_OUT_BLUETOOTH_SCO;
+ }
+ scoDev = Device::getInstance(&sco_Dattr, rm);
+ status = rm->getDeviceConfig(&sco_Dattr, NULL);
+ if (status) {
+ PAL_ERR(LOG_TAG, "getDeviceConfig for bt-sco failed");
+ mStreamMutex.unlock();
+ rm->unlockActiveStream();
+ return 0;
+ }
+
+ rm->getActiveStream_l(activeStreams, scoDev);
+ for (sIter = activeStreams.begin(); sIter != activeStreams.end(); sIter++) {
+ (*sIter)->lockStreamMutex();
+ streamDevDisconnect.push_back({ (*sIter), sco_Dattr.id });
+ StreamDevConnect.push_back({ (*sIter), &sco_Dattr });
+ (*sIter)->unlockStreamMutex();
+ }
+ }
} else {
rm->updateSndName(newDeviceId, deviceInfo.sndDevName);
matchFound = true;
diff --git a/stream/src/StreamUltraSound.cpp b/stream/src/StreamUltraSound.cpp
index bede3e0..63827f1 100644
--- a/stream/src/StreamUltraSound.cpp
+++ b/stream/src/StreamUltraSound.cpp
@@ -25,6 +25,10 @@
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
*/
#define LOG_TAG "PAL: StreamUltraSound"
@@ -42,6 +46,7 @@
const uint32_t no_of_modifiers __unused, const std::shared_ptr<ResourceManager> rm):
StreamCommon(sattr,dattr,no_of_devices,modifiers,no_of_modifiers,rm)
{
+ gain = PAL_ULTRASOUND_GAIN_MUTE;
session->registerCallBack((session_callback)HandleCallBack,((uint64_t) this));
rm->registerStream(this);
}
@@ -52,60 +57,88 @@
rm->deregisterStream(this);
}
-int32_t StreamUltraSound::stop()
+int32_t StreamUltraSound::start()
{
int32_t status = 0;
+ struct pal_device dAttr;
+ pal_ultrasound_gain_t gain = PAL_ULTRASOUND_GAIN_LOW;
+ std::vector<std::shared_ptr<Device>> activeDeviceList;
+
+ PAL_DBG(LOG_TAG, "Enter");
+
+ status = StreamCommon::start();
+ if (0 != status) {
+ PAL_ERR(LOG_TAG, "StreamCommon::start() failed, status = %d", status);
+ return status;
+ }
+
+ if (!rm->IsCustomGainEnabledForUPD())
+ goto skip_upd_set_gain;
+
+ /* Set Ultrasound Gain based on currently active devices */
+ rm->getActiveDevices(activeDeviceList);
+ if (0 == activeDeviceList.size()) {
+ PAL_DBG(LOG_TAG, "Did not find any active device, skip setting Ultrasound gain");
+ goto skip_upd_set_gain;
+ }
+
+ for (int i = 0; i < activeDeviceList.size(); i++) {
+ status = activeDeviceList[i]->getDeviceAttributes(&dAttr);
+ if (0 != status) {
+ PAL_ERR(LOG_TAG, "Fail to get device attribute for device %p, status = %d",
+ &activeDeviceList[i], status);
+ continue;
+ }
+ if (PAL_DEVICE_OUT_SPEAKER == dAttr.id) {
+ gain = PAL_ULTRASOUND_GAIN_HIGH;
+ }
+ }
mStreamMutex.lock();
- PAL_DBG(LOG_TAG, "Enter. session handle - %pK mStreamAttr->direction - %d state %d",
- session, mStreamAttr->direction, currentState);
-
- if (currentState == STREAM_STARTED || currentState == STREAM_PAUSED) {
-
- status = session->setParameters(this, DEVICE_POP_SUPPRESSOR,
- PAL_PARAM_ID_ULTRASOUND_RAMPDOWN, NULL);
- if (0 != status) {
- PAL_ERR(LOG_TAG, "SetParameters failed for Rampdown, status = %d", status);
- }
- /* Adjust the delay based on requirement */
- usleep(20000);
-
- for (int i = 0; i < mDevices.size(); i++) {
- rm->deregisterDevice(mDevices[i], this);
- }
- PAL_VERBOSE(LOG_TAG, "In %s, device count - %zu",
- GET_DIR_STR(mStreamAttr->direction), mDevices.size());
-
- rm->lockGraph();
- status = session->stop(this);
- if (0 != status) {
- PAL_ERR(LOG_TAG, "Error:%s session stop failed with status %d",
- GET_DIR_STR(mStreamAttr->direction), status);
- }
- PAL_VERBOSE(LOG_TAG, "session stop successful");
- for (int32_t i=0; i < mDevices.size(); i++) {
- status = mDevices[i]->stop();
- if (0 != status) {
- PAL_ERR(LOG_TAG, "Error:%s device stop failed with status %d",
- GET_DIR_STR(mStreamAttr->direction), status);
- }
- }
- rm->unlockGraph();
- PAL_VERBOSE(LOG_TAG, "devices stop successful");
- currentState = STREAM_STOPPED;
- } else if (currentState == STREAM_STOPPED || currentState == STREAM_IDLE) {
- PAL_INFO(LOG_TAG, "Stream is already in Stopped state %d", currentState);
- } else {
- PAL_ERR(LOG_TAG, "Error:Stream should be in start/pause state, %d", currentState);
- status = -EINVAL;
+ status = setUltraSoundGain_l(gain);
+ if (0 != status) {
+ mStreamMutex.unlock();
+ PAL_ERR(LOG_TAG, "Ultrasound set gain failed, status = %d", status);
+ goto skip_upd_set_gain;
}
- PAL_DBG(LOG_TAG, "Exit. status %d, state %d", status, currentState);
-
mStreamMutex.unlock();
+ PAL_INFO(LOG_TAG, "Ultrasound gain(%d) set sucessfully", gain);
+
+skip_upd_set_gain:
+ PAL_DBG(LOG_TAG, "Exit status: %d", status);
return status;
}
+int32_t StreamUltraSound::stop()
+{
+ int32_t status = 0;
+ pal_ultrasound_gain_t gain = PAL_ULTRASOUND_GAIN_MUTE;
+
+ PAL_DBG(LOG_TAG, "Enter");
+
+ if (rm->IsCustomGainEnabledForUPD()) {
+ mStreamMutex.lock();
+ if (currentState == STREAM_STARTED || currentState == STREAM_PAUSED) {
+
+ status = setUltraSoundGain_l(PAL_ULTRASOUND_GAIN_MUTE);
+ if (0 != status) {
+ PAL_ERR(LOG_TAG, "Ultrasound set gain failed, status = %d", status);
+ }
+ /* Currently configured value is 20ms which allows 3 to 4 process call
+ * to handle this value at ADSP side.
+ * Increase or decrease this dealy based on requirements */
+ usleep(20000);
+ }
+ mStreamMutex.unlock();
+ }
+
+ status = StreamCommon::stop();
+ if (0 != status)
+ PAL_ERR(LOG_TAG, "StreamCommon::stop() failed, status = %d", status);
+
+ return status;
+}
int32_t StreamUltraSound::setParameters(uint32_t param_id, void *payload)
{
@@ -174,3 +207,70 @@
}
PAL_DBG(LOG_TAG, "Exit");
}
+
+int32_t StreamUltraSound::setUltraSoundGain(pal_ultrasound_gain_t new_gain)
+{
+ int32_t status = 0;
+ PAL_INFO(LOG_TAG, "Entered, gain %d", new_gain);
+
+ if (!rm->IsCustomGainEnabledForUPD()) {
+ PAL_ERR(LOG_TAG,"Custom Gain not enabled for UPD, returning");
+ return status;
+ }
+
+ mStreamMutex.lock();
+ if (STREAM_STARTED == currentState)
+ status = setUltraSoundGain_l(new_gain);
+ else
+ status = -EINVAL;
+ mStreamMutex.unlock();
+
+ return status;
+}
+
+int32_t StreamUltraSound::setUltraSoundGain_l(pal_ultrasound_gain_t new_gain)
+{
+ int32_t status = 0;
+ pal_ultrasound_gain_t mute = PAL_ULTRASOUND_GAIN_MUTE;
+
+ if (!rm->IsCustomGainEnabledForUPD()) {
+ PAL_ERR(LOG_TAG,"Custom Gain not enabled for UPD, returning");
+ return status;
+ }
+
+ PAL_DBG(LOG_TAG, "Received request to set Ultrasound gain(%d)", new_gain);
+
+ if (gain != new_gain) {
+
+ if ((gain != PAL_ULTRASOUND_GAIN_MUTE) && (new_gain != PAL_ULTRASOUND_GAIN_MUTE)) {
+ /* For scanarios cases like, UPD followed by Music/Audio Playback,
+ * in order to avoid sending gain LOW follwed by HIGH directly,
+ * here we will send MUTE followed by some delay so module can rampdown
+ * previous gain first before applying new gain */
+ status = session->setParameters(this, TAG_ULTRASOUND_GAIN,
+ PAL_PARAM_ID_ULTRASOUND_SET_GAIN, &mute);
+ if (status) {
+ PAL_ERR(LOG_TAG, "Error:%d, Failed to setParam for Ultrasound set gain",
+ status);
+ }
+ gain = mute;
+ PAL_DBG(LOG_TAG, "Ultrasound gain(%d), configured successfully", gain);
+
+ /* Currently configured value is 20ms which allows 3 to 4 process call
+ * to handle this value at ADSP side.
+ * Increase or decrease this dealy based on requirements */
+ usleep(20000);
+ }
+
+ status = session->setParameters(this, TAG_ULTRASOUND_GAIN, PAL_PARAM_ID_ULTRASOUND_SET_GAIN, &new_gain);
+ if (status) {
+ PAL_ERR(LOG_TAG, "Error:%d, Failed to setParam for Ultrasound set gain",
+ status);
+ }
+ gain = new_gain;
+ PAL_DBG(LOG_TAG, "Ultrasound gain(%d), configured successfully", gain);
+ } else {
+ PAL_DBG(LOG_TAG, "Ultrasound gain(%d), already configured", gain);
+ }
+ return status;
+}