audio: implement mute on hdmi multichannel
On direct output streams the audio HAL must implement
the volume function. In the case of HDMI the only function
required is to mute audio when volume is 0 as volume
is defined as fixed on digital output streams.
Bug 8541062
Change-Id: Ia1342f6ffb7b7c95c7c386e3e2ee5243fe65051b
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 3782c32..55ab055 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1380,6 +1380,12 @@
static int out_set_volume(struct audio_stream_out *stream, float left,
float right)
{
+ struct stream_out *out = (struct stream_out *)stream;
+ if (out->usecase == USECASE_AUDIO_PLAYBACK_MULTI_CH) {
+ /* only take left channel into account: the API is for stereo anyway */
+ out->muted = (left == 0.0f);
+ return 0;
+ }
return -ENOSYS;
}
@@ -1402,6 +1408,8 @@
}
if (out->pcm) {
+ if (out->muted)
+ memset((void *)buffer, 0, bytes);
//ALOGV("%s: writing buffer (%d bytes) to pcm device", __func__, bytes);
ret = pcm_write(out->pcm, (void *)buffer, bytes);
}
@@ -1712,6 +1720,7 @@
out->dev = adev;
out->standby = 1;
+ /* out->muted = false; by calloc() */
config->format = out->stream.common.get_format(&out->stream.common);
config->channel_mask = out->stream.common.get_channels(&out->stream.common);
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index 7bc2ecb..0ac03fa 100644
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -158,6 +158,7 @@
audio_usecase_t usecase;
/* Array of supported channel mask configurations. +1 so that the last entry is always 0 */
audio_channel_mask_t supported_channel_masks[MAX_SUPPORTED_CHANNEL_MASKS + 1];
+ bool muted;
struct audio_device *dev;
};