SHA256
1
0
forked from pool/alsa-utils
alsa-utils/0001-alsaloop-reduce-cumulative-error-caused-by-non-atomi.patch
Takashi Iwai 13883f7a80 Accepting request 784659 from home:tiwai:branches:multimedia:libs
- Update to alsa-utils 1.2.2; including previous fixes
- Backport upstream fix: alsaloop improvement;
  0001-alsaloop-reduce-cumulative-error-caused-by-non-atomi.patch
- Drop obsoleted patches:
  0001-treewide-sys-poll-to-poll.patch
  0002-treewide-Fix-wrong-formats-on-32-bit.patch
  0003-treewide-Fix-printf-formats.patch
  0004-aplay-Adjust-buffer-sizes-to-fix-snprintf-warnings.patch
  0005-aplay-Limit-VUMeter-progress-bar-to-100-for-negative.patch
  0006-alsactl-sysfs-add-sys-kernel-uevent_seqnum-check-to-.patch
  0007-alsaucm-use-the-first-sound-card-use-case-name-hw-CA.patch
  0008-alsaucm-add-text-dump-command.patch
  0009-alsaucm-add-json-dump-command.patch
  0010-alsaucm-dump-fix-the-prefixed.patch
  0011-alsactl-fix-sched-idle-set-it-really-to-SCHED_IDLE.patch
  0012-configure-Fix-linking-of-alsatplg-with-the-older-lib.patch
  0013-alsatplg-add-n-normalize-option.patch
  0014-alsatplg-add-s-sort-and-fix-memory-leaks.patch
  0015-alsatplg-fix-another-small-leak-in-normalize_config.patch
  0016-alsa-info.sh-Consolidate-PCI-device-output.patch
  0017-alsa-info.sh-Read-from-proc-modules-and-sort-the-res.patch
  0018-alsa-info.sh-Simplify-iteration-over-cards-when-call.patch
  0019-alsa-info.sh-Use-existing-function-to-print-ALSA-con.patch
  0020-alsa-info.sh-Exit-script-after-writing-information-t.patch
  0021-alsa-info.sh-Replace-gauge-with-infobox-for-upload-d.patch
  0022-alsa-info.sh-Remove-progress-spinner-during-upload-w.patch
  0023-alsa-info.sh-Condense-nested-commands-for-file-uploa.patch
  0024-alsa-info.sh-Condense-nested-commands-for-formatting.patch
  0025-alsa-info.sh-Perform-test-for-wget-earlier.patch
  0026-alsa-info.sh-Warn-after-actual-upload-failure-do-not.patch

OBS-URL: https://build.opensuse.org/request/show/784659
OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/alsa-utils?expand=0&rev=169
2020-03-13 14:12:53 +00:00

63 lines
2.1 KiB
Diff

From ec8717d58891b18e27ac3f0e220a2a7060512870 Mon Sep 17 00:00:00 2001
From: Ruslan Bilovol <ruslan.bilovol@gmail.com>
Date: Mon, 9 Mar 2020 22:29:54 +0200
Subject: [PATCH] alsaloop: reduce cumulative error caused by non-atomic
samples calculation
When doing loopback between two audio card with
same sampling frequency, I noticed slow increase
of pitch_diff.
When I changed order of get_queued_playback_samples()
vs get_queued_capture_samples(), I noticed same drift
of pitch_diff but if was decreasing this time.
This seems to be caused by non-atomic consecutive
snd_pcm_delay() invocation for playback then for
capture. snd_pcm_delay() measures delay between
read/write call and actual ADC/DAC operation.
So while we get this value for playback path in
get_queued_playback_samples(), next call to
get_queued_capture_samples() will happen a little
bit later so snd_pcm_delay() may return incorrect
value.
Be interleaving get_queued_{playback,capture}_samples()
order, we divide this small error between playback
and capture paths. I do not see any issues anymore
with one-way drift of pitch_diff.
Signed-off-by: Ruslan Bilovol <ruslan.bilovol@gmail.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
alsaloop/pcmjob.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/alsaloop/pcmjob.c b/alsaloop/pcmjob.c
index b252486b2f6d..1b7925a205be 100644
--- a/alsaloop/pcmjob.c
+++ b/alsaloop/pcmjob.c
@@ -1951,8 +1951,16 @@ int pcmjob_pollfds_handle(struct loopback *loop, struct pollfd *fds)
}
if (loop->sync != SYNC_TYPE_NONE) {
snd_pcm_sframes_t pqueued, cqueued;
- pqueued = get_queued_playback_samples(loop);
- cqueued = get_queued_capture_samples(loop);
+
+ /* Reduce cumulative error by interleaving playback vs capture reading order */
+ if (loop->total_queued_count & 1) {
+ pqueued = get_queued_playback_samples(loop);
+ cqueued = get_queued_capture_samples(loop);
+ } else {
+ cqueued = get_queued_capture_samples(loop);
+ pqueued = get_queued_playback_samples(loop);
+ }
+
if (verbose > 4)
snd_output_printf(loop->output, "%s: queued %li/%li samples\n", loop->id, pqueued, cqueued);
if (pqueued > 0)
--
2.16.4