summaryrefslogtreecommitdiffstats
path: root/audio
diff options
context:
space:
mode:
Diffstat (limited to 'audio')
-rw-r--r--audio/audio_hw.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/audio/audio_hw.c b/audio/audio_hw.c
index c5f1867..6f14e1e 100644
--- a/audio/audio_hw.c
+++ b/audio/audio_hw.c
@@ -691,6 +691,7 @@ struct tuna_stream_out {
/* FIXME: workaround for HDMI multi channel channel swap on first playback after opening
* the output stream: force reopening the pcm driver after writing a few periods. */
int restart_periods_cnt;
+ bool muted;
struct tuna_audio_device *dev;
};
@@ -1918,6 +1919,16 @@ static int out_set_volume(struct audio_stream_out *stream, float left,
return -ENOSYS;
}
+static int out_set_volume_hdmi(struct audio_stream_out *stream, float left,
+ float right)
+{
+ struct tuna_stream_out *out = (struct tuna_stream_out *)stream;
+
+ /* only take left channel into account: the API is for stereo anyway */
+ out->muted = (left == 0.0f);
+ return 0;
+}
+
static ssize_t out_write_low_latency(struct audio_stream_out *stream, const void* buffer,
size_t bytes)
{
@@ -2127,6 +2138,9 @@ static ssize_t out_write_hdmi(struct audio_stream_out *stream, const void* buffe
}
pthread_mutex_unlock(&adev->lock);
+ if (out->muted)
+ memset((void *)buffer, 0, bytes);
+
ret = pcm_write(out->pcm[PCM_HDMI],
buffer,
pcm_frames_to_bytes(out->pcm[PCM_HDMI], in_frames));
@@ -3248,6 +3262,7 @@ static int adev_open_output_stream(struct audio_hw_device *dev,
out->stream.common.get_sample_rate = out_get_sample_rate_hdmi;
out->stream.get_latency = out_get_latency_hdmi;
out->stream.write = out_write_hdmi;
+ out->stream.set_volume = out_set_volume_hdmi;
out->config[PCM_HDMI] = pcm_config_hdmi_multi;
out->config[PCM_HDMI].rate = config->sample_rate;
out->config[PCM_HDMI].channels = popcount(config->channel_mask);
@@ -3265,6 +3280,7 @@ static int adev_open_output_stream(struct audio_hw_device *dev,
out->stream.common.get_sample_rate = out_get_sample_rate;
out->stream.get_latency = out_get_latency_deep_buffer;
out->stream.write = out_write_deep_buffer;
+ out->stream.set_volume = out_set_volume;
} else {
ALOGV("adev_open_output_stream() normal buffer");
if (ladev->outputs[OUTPUT_LOW_LATENCY] != NULL) {
@@ -3276,6 +3292,7 @@ static int adev_open_output_stream(struct audio_hw_device *dev,
out->stream.common.get_sample_rate = out_get_sample_rate;
out->stream.get_latency = out_get_latency_low_latency;
out->stream.write = out_write_low_latency;
+ out->stream.set_volume = out_set_volume;
}
ret = create_resampler(DEFAULT_OUT_SAMPLING_RATE,
@@ -3297,11 +3314,11 @@ static int adev_open_output_stream(struct audio_hw_device *dev,
out->stream.common.get_parameters = out_get_parameters;
out->stream.common.add_audio_effect = out_add_audio_effect;
out->stream.common.remove_audio_effect = out_remove_audio_effect;
- out->stream.set_volume = out_set_volume;
out->stream.get_render_position = out_get_render_position;
out->dev = ladev;
out->standby = 1;
+ /* out->muted = false; by calloc() */
/* FIXME: when we support multiple output devices, we will want to
* do the following: