| From 306a4f3ca7f3c7dfa473ebd19d66e40e59d99734 Mon Sep 17 00:00:00 2001 |
| From: Robert Rosengren <robert.rosengren@axis.com> |
| Date: Mon, 26 Mar 2018 07:24:49 +0200 |
| Subject: ALSA: aloop: Mark paused device as inactive |
| |
| From: Robert Rosengren <robert.rosengren@axis.com> |
| |
| commit 306a4f3ca7f3c7dfa473ebd19d66e40e59d99734 upstream. |
| |
| Show paused ALSA aloop device as inactive, i.e. the control |
| "PCM Slave Active" set as false. Notification sent upon state change. |
| |
| This makes it possible for client capturing from aloop device to know if |
| data is expected. Without it the client expects data even if playback |
| is paused. |
| |
| Signed-off-by: Robert Rosengren <robert.rosengren@axis.com> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/drivers/aloop.c | 12 +++++++++--- |
| 1 file changed, 9 insertions(+), 3 deletions(-) |
| |
| --- a/sound/drivers/aloop.c |
| +++ b/sound/drivers/aloop.c |
| @@ -296,6 +296,8 @@ static int loopback_trigger(struct snd_p |
| cable->pause |= stream; |
| loopback_timer_stop(dpcm); |
| spin_unlock(&cable->lock); |
| + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| + loopback_active_notify(dpcm); |
| break; |
| case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: |
| case SNDRV_PCM_TRIGGER_RESUME: |
| @@ -304,6 +306,8 @@ static int loopback_trigger(struct snd_p |
| cable->pause &= ~stream; |
| loopback_timer_start(dpcm); |
| spin_unlock(&cable->lock); |
| + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| + loopback_active_notify(dpcm); |
| break; |
| default: |
| return -EINVAL; |
| @@ -893,9 +897,11 @@ static int loopback_active_get(struct sn |
| [kcontrol->id.subdevice][kcontrol->id.device ^ 1]; |
| unsigned int val = 0; |
| |
| - if (cable != NULL) |
| - val = (cable->running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) ? |
| - 1 : 0; |
| + if (cable != NULL) { |
| + unsigned int running = cable->running ^ cable->pause; |
| + |
| + val = (running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) ? 1 : 0; |
| + } |
| ucontrol->value.integer.value[0] = val; |
| return 0; |
| } |