alsa/0043-pcm-file-delegate-htimestamping-to-slave-instead-of-.patch
OBS User mrdocs 6977966888 Accepting request 483406 from home:tiwai:branches:multimedia:libs
- 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
2017-03-29 22:55:12 +00:00

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,
};
/**