- Backport upstream fixes: fix bogus assert() in hw_params, a few PCM dmix/dshare/dsnoop fixes, enhacement of amixer, etc: 0017-test-pcm-Fix-generated-values-with-float-PCM-format.patch 0018-test-pcm_min-Fix-error-messages.patch 0019-pcm-Don-t-assert-in-_snd_pcm_hw_params_internal.patch 0020-pcm-Fix-snd_pcm_status-for-dmix-co.patch 0021-control-Allow-cset-ing-specific-values-in-the-multi-.patch 0022-PCM-snd_pcm_xxxx_drain-maybe-blocked-after-suspend-a.patch OBS-URL: https://build.opensuse.org/request/show/312533 OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/alsa?expand=0&rev=183
79 lines
2.8 KiB
Diff
79 lines
2.8 KiB
Diff
From 18ce3ec9caa266086c5f364a2bdbab27a8db9d77 Mon Sep 17 00:00:00 2001
|
|
From: Takashi Iwai <tiwai@suse.de>
|
|
Date: Tue, 2 Jun 2015 16:47:50 +0200
|
|
Subject: [PATCH] pcm: Fix snd_pcm_status() for dmix & co
|
|
|
|
Fetch the timestamp and other status fields by issuing
|
|
snd_pcm_status() for the slave PCM. Also, fill the delay field
|
|
properly. This should fix longstanding PA's complaints.
|
|
|
|
Reported-by: Dan Hordern <danhordern@gmail.com>
|
|
Signed-off-by: Takashi Iwai <tiwai@suse.de>
|
|
---
|
|
src/pcm/pcm_dmix.c | 3 ++-
|
|
src/pcm/pcm_dshare.c | 3 ++-
|
|
src/pcm/pcm_dsnoop.c | 3 ++-
|
|
3 files changed, 6 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c
|
|
index babde6a15efe..4acbaf0e0265 100644
|
|
--- a/src/pcm/pcm_dmix.c
|
|
+++ b/src/pcm/pcm_dmix.c
|
|
@@ -475,12 +475,13 @@ static int snd_pcm_dmix_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
|
|
break;
|
|
}
|
|
memset(status, 0, sizeof(*status));
|
|
+ snd_pcm_status(dmix->spcm, status);
|
|
status->state = snd_pcm_dmix_state(pcm);
|
|
status->trigger_tstamp = dmix->trigger_tstamp;
|
|
- gettimestamp(&status->tstamp, pcm->tstamp_type);
|
|
status->avail = snd_pcm_mmap_playback_avail(pcm);
|
|
status->avail_max = status->avail > dmix->avail_max ? status->avail : dmix->avail_max;
|
|
dmix->avail_max = 0;
|
|
+ status->delay = snd_pcm_mmap_playback_delay(pcm);
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c
|
|
index 020e6f7d9307..b51758fb22a2 100644
|
|
--- a/src/pcm/pcm_dshare.c
|
|
+++ b/src/pcm/pcm_dshare.c
|
|
@@ -224,12 +224,13 @@ static int snd_pcm_dshare_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
|
|
break;
|
|
}
|
|
memset(status, 0, sizeof(*status));
|
|
+ snd_pcm_status(dshare->spcm, status);
|
|
status->state = snd_pcm_state(dshare->spcm);
|
|
status->trigger_tstamp = dshare->trigger_tstamp;
|
|
- gettimestamp(&status->tstamp, pcm->tstamp_type);
|
|
status->avail = snd_pcm_mmap_playback_avail(pcm);
|
|
status->avail_max = status->avail > dshare->avail_max ? status->avail : dshare->avail_max;
|
|
dshare->avail_max = 0;
|
|
+ status->delay = snd_pcm_mmap_playback_delay(pcm);
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/src/pcm/pcm_dsnoop.c b/src/pcm/pcm_dsnoop.c
|
|
index 8333eefdaf4c..8a2e87ad0ae1 100644
|
|
--- a/src/pcm/pcm_dsnoop.c
|
|
+++ b/src/pcm/pcm_dsnoop.c
|
|
@@ -187,13 +187,14 @@ static int snd_pcm_dsnoop_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
|
|
break;
|
|
}
|
|
memset(status, 0, sizeof(*status));
|
|
+ snd_pcm_status(dsnoop->spcm, status);
|
|
state = snd_pcm_state(dsnoop->spcm);
|
|
status->state = state == SND_PCM_STATE_RUNNING ? dsnoop->state : state;
|
|
status->trigger_tstamp = dsnoop->trigger_tstamp;
|
|
- status->tstamp = dsnoop->update_tstamp;
|
|
status->avail = snd_pcm_mmap_capture_avail(pcm);
|
|
status->avail_max = status->avail > dsnoop->avail_max ? status->avail : dsnoop->avail_max;
|
|
dsnoop->avail_max = 0;
|
|
+ status->delay = snd_pcm_mmap_capture_delay(pcm);
|
|
return 0;
|
|
}
|
|
|
|
--
|
|
2.4.3
|
|
|