forked from pool/alsa-utils
Takashi Iwai
13883f7a80
- 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
63 lines
2.1 KiB
Diff
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
|
|
|