You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
5.2 KiB
182 lines
5.2 KiB
/*
|
|
* Copyright (c) Hisilicon Technologies Co., Ltd. 2020-2020. All rights reserved.
|
|
* Description: audio hal customized source file.
|
|
* Author: Hisilicon
|
|
* Create: 2020-05-11
|
|
* Notes: NA
|
|
* History: 2020-05-11 yinyingcai for CodingStyle
|
|
*/
|
|
#define LOG_TAG "audio_hal_custom"
|
|
#define LOG_NDEBUG 0
|
|
|
|
#include "audio_custom.h"
|
|
#include <log/log.h>
|
|
#include <tinyalsa/asoundlib.h>
|
|
#include <securec.h>
|
|
#include "audio_hw.h"
|
|
|
|
struct custom_device {
|
|
int reserved;
|
|
};
|
|
|
|
#define EXTDEV_PATCHSRC_VOL_STEP 6
|
|
#define AO_PORT_VOL_MIN (-81)
|
|
// use to Convert index to DB
|
|
#define INTEGER_DENOMINATOR 2
|
|
#define DECIMAL_MULTIPLIER 500
|
|
#define AEF_VOLUME_COMPENSATE 0
|
|
#define MAX_VOLUME_INDEX 100
|
|
|
|
static void init_nano(void)
|
|
{
|
|
ALOGD("nano_init not support");
|
|
}
|
|
|
|
int custom_init(struct audio_device *adev)
|
|
{
|
|
int ret;
|
|
struct custom_device *custom_dev;
|
|
|
|
custom_dev = malloc(sizeof(struct custom_device));
|
|
if (custom_dev == NULL) {
|
|
return -ENOMEM;
|
|
}
|
|
|
|
ret = memset_s(custom_dev, sizeof(struct custom_device), 0, sizeof(struct custom_device));
|
|
if (ret != EOK) {
|
|
ALOGD("memset_s custom_dev failed(0x%x)", ret);
|
|
}
|
|
adev->custom_private_data = custom_dev;
|
|
|
|
init_nano();
|
|
|
|
return 0;
|
|
}
|
|
|
|
void custom_deinit(struct audio_device *adev)
|
|
{
|
|
if (adev->custom_private_data != NULL) {
|
|
free(adev->custom_private_data);
|
|
adev->custom_private_data = NULL;
|
|
}
|
|
}
|
|
|
|
void custom_open_nano(struct audio_config *config __unused, struct audio_stream_in **streamin __unused)
|
|
{
|
|
ALOGD("%s not support", __func__);
|
|
}
|
|
|
|
void custom_close_nano(struct audio_stream_in *stream __unused)
|
|
{
|
|
ALOGD("%s not support", __func__);
|
|
}
|
|
|
|
void custom_adev_set_parameters(struct audio_device *dev __unused, struct str_parms *parms __unused)
|
|
{
|
|
ALOGD("%s called", __func__);
|
|
}
|
|
|
|
void custom_adev_get_parameters(const struct audio_device *dev __unused,
|
|
struct str_parms *query __unused, struct str_parms *result __unused)
|
|
{
|
|
ALOGD("%s called", __func__);
|
|
}
|
|
|
|
bool custom_in_implement_needed(audio_devices_t devices __unused, audio_input_flags_t flags __unused,
|
|
audio_source_t source __unused)
|
|
{
|
|
ALOGD("%s called", __func__);
|
|
return false;
|
|
}
|
|
|
|
int custom_open_input_stream(audio_devices_t devices __unused,
|
|
const struct audio_config *config __unused,
|
|
audio_input_flags_t flags __unused,
|
|
audio_source_t source __unused,
|
|
struct stream_in *in __unused)
|
|
{
|
|
ALOGD("%s called", __func__);
|
|
return 0;
|
|
}
|
|
void custom_close_input_stream(struct stream_in *in __unused)
|
|
{
|
|
ALOGD("%s called", __func__);
|
|
}
|
|
|
|
|
|
bool custom_out_implement_needed(audio_devices_t devices __unused,
|
|
audio_output_flags_t flags __unused,
|
|
struct audio_config *config __unused,
|
|
const char *address __unused)
|
|
{
|
|
ALOGD("%s called", __func__);
|
|
return false;
|
|
}
|
|
|
|
int custom_open_output_stream(audio_devices_t devices __unused,
|
|
audio_output_flags_t flags __unused,
|
|
struct audio_config *config __unused,
|
|
const char *address __unused,
|
|
struct stream_out *out __unused)
|
|
{
|
|
ALOGD("%s called", __func__);
|
|
return 0;
|
|
}
|
|
|
|
void custom_close_output_stream(struct stream_out *out __unused)
|
|
{
|
|
ALOGD("%s called", __func__);
|
|
}
|
|
|
|
// used in tv product
|
|
void custom_calc_extdev_patchsrc_volume(int32_t index, int *integer_gain, int *decimal_gain)
|
|
{
|
|
double precision_vol = 0.0;
|
|
int32_t volume[EXTDEV_PATCHSRC_VOL_STEP] = { 0, 10, 25, 50, 75, 100}; /* volume curve index */
|
|
double volume_gain[EXTDEV_PATCHSRC_VOL_STEP] = {
|
|
-54.000, -38.000, -30.125, -16.375, -6.125, 0}; /* index's gain in db */
|
|
|
|
ALOGD("%s called", __func__);
|
|
if (integer_gain == NULL || decimal_gain == NULL) {
|
|
return;
|
|
}
|
|
|
|
if (index < volume[EXTDEV_PATCHSRC_VOL_STEP - 1] && index >= volume[0]) {
|
|
for (int i = 0; i < EXTDEV_PATCHSRC_VOL_STEP - 1; i++) {
|
|
if (index >= volume[i] && index < volume[i + 1]) {
|
|
precision_vol = (volume_gain[i + 1] - volume_gain[i]) / (volume[i + 1] - volume[i]) *
|
|
(index - volume[i]) + volume_gain[i];
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
if (index < volume[0]) {
|
|
precision_vol = volume_gain[0];
|
|
} else {
|
|
precision_vol = volume_gain[EXTDEV_PATCHSRC_VOL_STEP - 1];
|
|
}
|
|
}
|
|
|
|
precision_vol = precision_vol + (double)AEF_VOLUME_COMPENSATE;
|
|
*integer_gain = (int32_t)precision_vol;
|
|
*decimal_gain = (int32_t)((precision_vol - (double)(*integer_gain)) * 1000); /* one int is 1000 decimal */
|
|
*decimal_gain -= (*decimal_gain) % 125; /* 125 is the accuracy */
|
|
}
|
|
|
|
// used in stb product
|
|
void custom_calc_ao_port_volume(int32_t index, int *integer_gain, int *decimal_gain)
|
|
{
|
|
ALOGD("%s called", __func__);
|
|
int32_t index_cur = index;
|
|
if (integer_gain == NULL || decimal_gain == NULL) {
|
|
return;
|
|
}
|
|
|
|
if (index_cur > MAX_VOLUME_INDEX) {
|
|
index_cur = MAX_VOLUME_INDEX;
|
|
}
|
|
index_cur = index_cur + AO_PORT_VOL_MIN;
|
|
*integer_gain = index_cur / INTEGER_DENOMINATOR;
|
|
*decimal_gain = DECIMAL_MULTIPLIER * (index_cur % INTEGER_DENOMINATOR);
|
|
}
|