Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE
alsa.6583
0043-pcm-file-delegate-htimestamping-to-slave-i...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0043-pcm-file-delegate-htimestamping-to-slave-instead-of-.patch of Package alsa.6583
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, }; /**
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor