hal: Add volume control for pcm playback
- LE needs volume control support for deep-buffer and low-latency usecases. Change-Id: I8fab52d051655c6502adf3585d49f0cd365ec0cf
This commit is contained in:
parent
28a0250b59
commit
97bdcfb78a
|
@ -90,6 +90,7 @@
|
|||
#define DIRECT_PCM_NUM_FRAGMENTS 2
|
||||
#define COMPRESS_PLAYBACK_VOLUME_MAX 0x2000
|
||||
#define VOIP_PLAYBACK_VOLUME_MAX 0x2000
|
||||
#define PCM_PLAYBACK_VOLUME_MAX 0x2000
|
||||
#define DSD_VOLUME_MIN_DB (-110)
|
||||
|
||||
#define PROXY_OPEN_RETRY_COUNT 100
|
||||
|
@ -443,6 +444,7 @@ static int last_known_cal_step = -1 ;
|
|||
static int check_a2dp_restore_l(struct audio_device *adev, struct stream_out *out, bool restore);
|
||||
static int out_set_compr_volume(struct audio_stream_out *stream, float left, float right);
|
||||
static int out_set_voip_volume(struct audio_stream_out *stream, float left, float right);
|
||||
static int out_set_pcm_volume(struct audio_stream_out *stream, float left, float right);
|
||||
|
||||
static bool may_use_noirq_mode(struct audio_device *adev, audio_usecase_t uc_id,
|
||||
int flags __unused)
|
||||
|
@ -3132,6 +3134,11 @@ int start_output_stream(struct stream_out *out)
|
|||
// apply volume for voip playback after path is set up
|
||||
if (out->usecase == USECASE_AUDIO_PLAYBACK_VOIP)
|
||||
out_set_voip_volume(&out->stream, out->volume_l, out->volume_r);
|
||||
else if ((out->usecase == USECASE_AUDIO_PLAYBACK_LOW_LATENCY || out->usecase == USECASE_AUDIO_PLAYBACK_DEEP_BUFFER) &&
|
||||
(out->apply_volume)) {
|
||||
out_set_pcm_volume(&out->stream, out->volume_l, out->volume_r);
|
||||
out->apply_volume = false;
|
||||
}
|
||||
} else {
|
||||
platform_set_stream_channel_map(adev->platform, out->channel_mask,
|
||||
out->pcm_device_id, &out->channel_map_param.channel_map[0]);
|
||||
|
@ -4217,6 +4224,38 @@ static int out_set_voip_volume(struct audio_stream_out *stream, float left,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int out_set_pcm_volume(struct audio_stream_out *stream, float left,
|
||||
float right)
|
||||
{
|
||||
struct stream_out *out = (struct stream_out *)stream;
|
||||
/* Volume control for pcm playback */
|
||||
if (left != right) {
|
||||
return -EINVAL;
|
||||
} else {
|
||||
char mixer_ctl_name[128];
|
||||
struct audio_device *adev = out->dev;
|
||||
struct mixer_ctl *ctl;
|
||||
int pcm_device_id = platform_get_pcm_device_id(out->usecase, PCM_PLAYBACK);
|
||||
snprintf(mixer_ctl_name, sizeof(mixer_ctl_name), "Playback %d Volume", pcm_device_id);
|
||||
ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
|
||||
if (!ctl) {
|
||||
ALOGE("%s : Could not get ctl for mixer cmd - %s", __func__, mixer_ctl_name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
int volume = (int) (left * PCM_PLAYBACK_VOLUME_MAX);
|
||||
int ret = mixer_ctl_set_value(ctl, 0, volume);
|
||||
if (ret < 0) {
|
||||
ALOGE("%s: Could not set ctl, error:%d ", __func__, ret);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ALOGV("%s : Pcm set volume value %d left %f", __func__, volume, left);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int out_set_volume(struct audio_stream_out *stream, float left,
|
||||
float right)
|
||||
{
|
||||
|
@ -4266,6 +4305,17 @@ static int out_set_volume(struct audio_stream_out *stream, float left,
|
|||
out->volume_l = left;
|
||||
out->volume_r = right;
|
||||
return ret;
|
||||
} else if (out->usecase == USECASE_AUDIO_PLAYBACK_LOW_LATENCY ||
|
||||
out->usecase == USECASE_AUDIO_PLAYBACK_DEEP_BUFFER) {
|
||||
/* Volume control for pcm playback */
|
||||
if (!out->standby)
|
||||
ret = out_set_pcm_volume(stream, left, right);
|
||||
else
|
||||
out->apply_volume = true;
|
||||
|
||||
out->volume_l = left;
|
||||
out->volume_r = right;
|
||||
return ret;
|
||||
}
|
||||
|
||||
return -ENOSYS;
|
||||
|
|
|
@ -350,6 +350,7 @@ struct stream_out {
|
|||
bool a2dp_compress_mute;
|
||||
float volume_l;
|
||||
float volume_r;
|
||||
bool apply_volume;
|
||||
|
||||
char pm_qos_mixer_path[MAX_MIXER_PATH_LEN];
|
||||
int hal_output_suspend_supported;
|
||||
|
|
Loading…
Reference in New Issue