alsa/0026-pcm-express-the-rewind-size-limitation-logic-better.patch
Takashi Iwai 84789a8f60 Accepting request 257835 from home:tiwai:branches:multimedia:libs
- Backport upstream fixes / enhancements: mostly small fixes
  spotted by coccinelle and oethers, the fixes for proper rewind
  support, a new DSD format support, hwdep definitions sync, and
  addition of PAZ00 UCM configs.
  0022-pcm-fix-snd_pcm_mmap_hw_avail-near-the-boundary.patch
  0023-pcm-fix-return-value-of-snd_pcm_share_slave_avail.patch
  0024-pcm-add-new-32-bit-DSD-sample-format.patch
  0025-dmix-actually-rewind-when-running-or-being-drained.patch
  0026-pcm-express-the-rewind-size-limitation-logic-better.patch
  0027-pcm-handle-negative-values-from-snd_pcm_mmap_hw_avai.patch
  0028-pcm-rate-use-the-snd_pcm_mmap_hw_avail-function.patch
  0029-pcm-null-use-the-snd_pcm_mmap_avail-function.patch
  0030-rate-handle-negative-values-from-snd_pcm_mmap_playba.patch
  0031-dsnoop-rewindable-and-forwardable-logic-was-swapped.patch
  0033-pcm-file-don-t-recurse-in-the-rewindable-and-forward.patch
  0034-pcm-route-Fix-the-bad-condition-always-false.patch
  0035-pcm-rate-hw_avail-must-not-be-negative-before-starti.patch
  0036-hwdep-add-missing-declaration-for-snd_hwdep_poll_des.patch
  0037-mixer-fixed-double-free.patch
  0038-pcm_file-fixed-missing-free.patch
  0039-sbase-fixed-missing-free.patch
  0040-rawmidi-close-handle-h.patch
  0041-pcm_share-fixing-missing-mutex-unlock.patch
  0042-simple_abst-null-check-for-lib.patch
  0043-socket-missing-socket-close.patch
  0044-pcm_hooks-null-check-for-h.patch
  0045-conf-return-negative-value-in-case-of-error.patch
  0046-control-return-negative-value-in-case-of-error.patch
  0047-pcm-return-negative-value-in-case-of-error.patch
  0048-mixer-Fix-missing-hctl-handle-free-in-snd_mixer_atta.patch

OBS-URL: https://build.opensuse.org/request/show/257835
OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/alsa?expand=0&rev=170
2014-10-21 07:48:48 +00:00

113 lines
4.0 KiB
Diff

From 9a43dc15b2979ed6d8850b033b594fbef829c991 Mon Sep 17 00:00:00 2001
From: "Alexander E. Patrakov" <patrakov@gmail.com>
Date: Sun, 14 Sep 2014 00:30:14 +0600
Subject: [PATCH] pcm: express the rewind size limitation logic better
There are a few places where the argument of the .rewind or .forward
callback is checked against the same value as returned by .rewindable or
.forwardable. Express this "don't rewind more than rewindable" logic
explicitly, so that the future fixes to the rewindable size can go to
one function instead of two.
While at it, take advantage of the fact that snd_pcm_mmap_avail() cannot
return negative values (except due to integer overflow, which is AFAICS
impossible given the current boundary choice).
Signed-off-by: Alexander E. Patrakov <patrakov@gmail.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_dmix.c | 4 +---
src/pcm/pcm_dshare.c | 6 ++----
src/pcm/pcm_dsnoop.c | 6 ++----
src/pcm/pcm_plugin.c | 4 ++--
4 files changed, 7 insertions(+), 13 deletions(-)
diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c
index 73cbe3f8d0b2..ffde12a1a46c 100644
--- a/src/pcm/pcm_dmix.c
+++ b/src/pcm/pcm_dmix.c
@@ -751,9 +751,7 @@ static snd_pcm_sframes_t snd_pcm_dmix_forward(snd_pcm_t *pcm, snd_pcm_uframes_t
{
snd_pcm_sframes_t avail;
- avail = snd_pcm_mmap_playback_avail(pcm);
- if (avail < 0)
- return 0;
+ avail = snd_pcm_dmix_forwardable(pcm);
if (frames > (snd_pcm_uframes_t)avail)
frames = avail;
snd_pcm_mmap_appl_forward(pcm, frames);
diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c
index b985172825e7..f1a1a1d75229 100644
--- a/src/pcm/pcm_dshare.c
+++ b/src/pcm/pcm_dshare.c
@@ -419,7 +419,7 @@ static snd_pcm_sframes_t snd_pcm_dshare_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t
{
snd_pcm_sframes_t avail;
- avail = snd_pcm_mmap_playback_hw_avail(pcm);
+ avail = snd_pcm_dshare_rewindable(pcm);
if (avail < 0)
return 0;
if (frames > (snd_pcm_uframes_t)avail)
@@ -437,9 +437,7 @@ static snd_pcm_sframes_t snd_pcm_dshare_forward(snd_pcm_t *pcm, snd_pcm_uframes_
{
snd_pcm_sframes_t avail;
- avail = snd_pcm_mmap_playback_avail(pcm);
- if (avail < 0)
- return 0;
+ avail = snd_pcm_dshare_forwardable(pcm);
if (frames > (snd_pcm_uframes_t)avail)
frames = avail;
snd_pcm_mmap_appl_forward(pcm, frames);
diff --git a/src/pcm/pcm_dsnoop.c b/src/pcm/pcm_dsnoop.c
index 0f9c9df481bc..e56e4022becf 100644
--- a/src/pcm/pcm_dsnoop.c
+++ b/src/pcm/pcm_dsnoop.c
@@ -342,9 +342,7 @@ static snd_pcm_sframes_t snd_pcm_dsnoop_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t
{
snd_pcm_sframes_t avail;
- avail = snd_pcm_mmap_capture_avail(pcm);
- if (avail < 0)
- return 0;
+ avail = snd_pcm_dsnoop_rewindable(pcm);
if (frames > (snd_pcm_uframes_t)avail)
frames = avail;
snd_pcm_mmap_appl_backward(pcm, frames);
@@ -360,7 +358,7 @@ static snd_pcm_sframes_t snd_pcm_dsnoop_forward(snd_pcm_t *pcm, snd_pcm_uframes_
{
snd_pcm_sframes_t avail;
- avail = snd_pcm_mmap_capture_hw_avail(pcm);
+ avail = snd_pcm_dsnoop_forwardable(pcm);
if (avail < 0)
return 0;
if (frames > (snd_pcm_uframes_t)avail)
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
index 4ddf10c1989e..a607ccfe27de 100644
--- a/src/pcm/pcm_plugin.c
+++ b/src/pcm/pcm_plugin.c
@@ -204,7 +204,7 @@ static snd_pcm_sframes_t snd_pcm_plugin_rewindable(snd_pcm_t *pcm)
snd_pcm_sframes_t snd_pcm_plugin_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
{
snd_pcm_plugin_t *plugin = pcm->private_data;
- snd_pcm_sframes_t n = snd_pcm_mmap_hw_avail(pcm);
+ snd_pcm_sframes_t n = snd_pcm_plugin_rewindable(pcm);
snd_pcm_sframes_t sframes;
if ((snd_pcm_uframes_t)n < frames)
@@ -232,7 +232,7 @@ static snd_pcm_sframes_t snd_pcm_plugin_forwardable(snd_pcm_t *pcm)
snd_pcm_sframes_t snd_pcm_plugin_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
{
snd_pcm_plugin_t *plugin = pcm->private_data;
- snd_pcm_sframes_t n = snd_pcm_mmap_avail(pcm);
+ snd_pcm_sframes_t n = snd_pcm_plugin_forwardable(pcm);
snd_pcm_sframes_t sframes;
if ((snd_pcm_uframes_t)n < frames)
--
2.1.2