- Backport upstream fix patches, including the deadlock fix for aplay/arecord (boo#1031525): 0001-ucm-Add-ATTRIBUTE_UNUSED-for-unused-parameters-of-ex.patch 0002-ucm-parser-needs-limits.h.patch 0003-pcm-direct-allow-users-to-configure-different-period.patch 0004-pcm-dshare-enable-silence.patch 0005-pcm-rate-fix-the-hw_ptr-update-until-the-boundary-av.patch 0006-plugin-dynamically-update-avail_min-on-slave.patch 0007-rate-dynamic-update-avail_min-on-slave.patch 0008-topology-fix-unused-const-variable-warning.patch 0009-seq-improve-documentation-about-new-get-pid-card-fun.patch 0010-pcm-direct-returning-semop-error-code-for-semaphore-.patch 0011-pcm-direct-Fix-for-sync-issue-on-xrun-recover.patch 0012-pcm-direct-check-state-before-enter-poll-on-timer.patch 0013-pcm-direct-don-t-return-bogus-buffer-levels-in-xrun-.patch 0014-conf-ucm-broxton-add-broxton-rt298-conf-files.patch 0015-pcm-direct-Fix-deadlock-in-poll_descriptors.patch 0016-ucm-Assure-the-user-input-card-name-not-to-exceed-ma.patch 0017-ucm-Load-device-specific-configuration-file-based-on.patch 0018-ucm-Add-command-get-_file-to-get-the-config-file-nam.patch 0019-topology-Fix-incorrect-license-in-source-comments.patch 0020-conf-cards-add-support-for-pistachio-card.patch 0021-pcm-multi-Drop-the-fixed-slave_map-in-snd_pcm_multi_.patch 0022-conf-Add-card-config-for-Intel-HDMI-DP-LPE-audio.patch 0023-pcm-Avoid-lock-for-snd_pcm_nonblock.patch 0024-pcm-Disable-locking-in-async-mode.patch 0025-pcm-dmix-Allow-disabling-x86-optimizations.patch 0026-pcm-dmix_rewind-corrupts-application-pointer-fix.patch 0027-pcm-direct-fix-race-on-clearing-timer-events.patch 0028-pcm-file-Enable-file-writing-for-capture-path.patch OBS-URL: https://build.opensuse.org/request/show/483406 OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/alsa?expand=0&rev=210
109 lines
4.0 KiB
Diff
109 lines
4.0 KiB
Diff
From 01bc7475c3ee4dc0c1c321c781cfb26e6e5fcb34 Mon Sep 17 00:00:00 2001
|
|
From: Andreas Pape <apape@de.adit-jv.com>
|
|
Date: Thu, 23 Mar 2017 17:10:45 +0530
|
|
Subject: [PATCH 43/43] pcm:file: delegate htimestamping to slave instead of
|
|
always getting real_htimestamp
|
|
|
|
purpose of this fix, is to read most accurate timestamps.
|
|
|
|
From documentation of /src/pcm/pcm.c, we can see:
|
|
"""" \par Timestamp mode
|
|
|
|
The timestamp mode specifies, if timestamps are activated. Currently, only #SND_PCM_TSTAMP_NONE and #SND_PCM_TSTAMP_MMAP modes are known.
|
|
The mmap mode means that timestamp is taken on every period time boundary. Corresponding position in the ring buffer assigned to timestamp can be obtained using #snd_pcm_htimestamp() function. """"
|
|
|
|
As snd_pcm_generic_htimestamp() internally calls snd_pcm_htimestamp() to read time, so accurate timestamp can be read from snd_pcm_generic_htimestamp().
|
|
|
|
Also, in case of pcm_file, if the underlying slave is hardware, then we would wish to read elapsed hardware time, as it will be the most accurate, as opposed to the elapsed wall time.
|
|
This will provide pcm_file with the most accurate timestamps.
|
|
|
|
Following are the timesamps read with timestamp enabled, for with fix and without fix scenarios:
|
|
|
|
1> With fix:
|
|
:~#time aplay --enable-tstamp -Dhtstamp_test --period-time=5000 -v -fdat /dev/urandom
|
|
Playing raw data '/dev/urandom' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
|
|
File PCM (file=/tmp/swarate_out.wav)
|
|
Final file PCM (file=/tmp/swarate_out.wav)
|
|
..
|
|
|
|
Slave: Hardware PCM card 0 'imx6q-sabresd-wm8962' device 0 subdevice 0
|
|
Its setup is:
|
|
stream : PLAYBACK
|
|
access : RW_INTERLEAVED
|
|
format : S16_LE
|
|
subformat : STD
|
|
channels : 2
|
|
rate : 48000
|
|
exact rate : 48000 (48000/1)
|
|
msbits : 16
|
|
buffer_size : 24000
|
|
period_size : 240
|
|
period_time : 5000
|
|
tstamp_mode : ENABLE
|
|
.
|
|
.
|
|
Before sleep = 142:409.807623
|
|
After sleep = 142:409.807623
|
|
Before sleep = 142:414.806016 (calling snd_pcm_htimestamp(handle, &avail, &tstamp_before))
|
|
sleep of 2 milisec
|
|
After sleep = 142:414.806016 (calling snd_pcm_htimestamp(handle, &avail, &tstamp_after)
|
|
From the above timestamps, we can see that slave has returned the same timestamps, as --period-time choosen is 5msec.
|
|
|
|
2> Without this fix:
|
|
The timestamps are returned with realtime value.
|
|
|
|
:~# time aplay --enable-tstamp -Dhtstamp_test --period-time=5000 -v -fdat /dev/urandom
|
|
Playing raw data '/dev/urandom' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
|
|
File PCM (file=/tmp/swarate_out.wav)
|
|
Final file PCM (file=/tmp/swarate_out.wav)
|
|
.
|
|
.
|
|
Slave: Hardware PCM card 0 'imx6q-sabresd-wm8962' device 0 subdevice 0
|
|
Its setup is:
|
|
stream : PLAYBACK
|
|
access : RW_INTERLEAVED
|
|
format : S16_LE
|
|
subformat : STD
|
|
channels : 2
|
|
rate : 48000
|
|
exact rate : 48000 (48000/1)
|
|
msbits : 16
|
|
buffer_size : 24000
|
|
period_size : 240
|
|
period_time : 5000
|
|
tstamp_mode : ENABLE
|
|
.
|
|
.
|
|
Before sleep = 241:136.875845 (calling snd_pcm_htimestamp(handle, &avail, &tstamp_before))
|
|
sleep of 2 milisec
|
|
After sleep = 241:139.076376 (calling snd_pcm_htimestamp(handle, &avail, &tstamp_after)
|
|
|
|
We can observe here, the timestamps shows time diff of ~2ms, which is the time gap of sleep duration.
|
|
Before sleep = 241:139.617588
|
|
After sleep = 241:141.746845
|
|
Before sleep = 241:142.291618
|
|
After sleep = 241:144.406406
|
|
Before sleep = 241:144.951421
|
|
After sleep = 241:147.066118
|
|
Before sleep = 241:147.623421
|
|
After sleep = 241:149.740573
|
|
|
|
Signed-off-by: Andreas Pape <apape@de.adit-jv.com>
|
|
Signed-off-by: Mounesh Sutar <sutar.mounesh@gmail.com>
|
|
Signed-off-by: Takashi Iwai <tiwai@suse.de>
|
|
---
|
|
src/pcm/pcm_file.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
--- a/src/pcm/pcm_file.c
|
|
+++ b/src/pcm/pcm_file.c
|
|
@@ -728,7 +728,7 @@ static const snd_pcm_fast_ops_t snd_pcm_
|
|
.poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
|
|
.poll_descriptors = snd_pcm_generic_poll_descriptors,
|
|
.poll_revents = snd_pcm_generic_poll_revents,
|
|
- .htimestamp = snd_pcm_generic_real_htimestamp,
|
|
+ .htimestamp = snd_pcm_generic_htimestamp,
|
|
};
|
|
|
|
/**
|