+static int aaf_mclk_start_playback(snd_pcm_aaf_t *aaf)
+{
+ int res;
+ struct timespec now;
+ struct itimerspec itspec;
+ snd_pcm_ioplug_t *io = &aaf->io;
+
+ res = clock_gettime(CLOCK_REF, &now);
+ if (res < 0) {
+ SNDERR("Failed to get time from clock");
+ return -errno;
+ }
+
+ aaf->mclk_period = (NSEC_PER_SEC * aaf->frames_per_pkt) /
io->rate;
is this always an integer? If not, don't you have a systematic
arithmetic error?
NSEC_PER_SEC is 64-bit so I don't see an arithmetic error during
calculation (e.g. integer overflow). Not sure this was your concern,
though. Let me know otherwise.
No, I was talking about the fractional part, e.g with 256 frames with
44.1kHz you have a period of 5804988.662131519274376 - so your math adds
a truncation. same with 48khz, the fractional part is .333
I burned a number of my remaining neurons chasing a <100 ppb error which
led to underruns after 10 hours, so careful now with truncation...
+static int aaf_poll_revents(snd_pcm_ioplug_t *io, struct pollfd
*pfd,
+ unsigned int nfds, unsigned short
*revents)
+{
+ int res;
+ snd_pcm_aaf_t *aaf = io->private_data;
+
+ if (nfds != FD_COUNT_PLAYBACK)
+ return -EINVAL;
+
+ if (pfd[0].revents & POLLIN) {
+ res = aaf_mclk_timeout_playback(aaf);
+ if (res < 0)
+ return res;
+
+ *revents = POLLIN;
+ }
I couldn't figure out how you use playback events and your timer.
Every time aaf->timer_fd expires, the audio buffer is consumed by the
plugin, making some room available on the buffer. So here a POLLIN
event is returned so alsa-lib layer can copy more data into the audio
buffer.
When there are two audio clock sources or timers that's usually where
the fun begins.
Regarding scenarios with two audio clock sources or timers, the plugin
doesn't support them at the moment. This is something we should work on
once the basic functionality is pushed upstream.
I was talking about adjusting the relationship between your
CLOCK_REALTIME timer and the media/network clock. I don't quite get how
this happens, I vaguely recall there should be a daemon which tracks the
difference between local and media/network clock, and I don't see it here.
Thank you for your feedback.
Regards,
Andre
_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxx
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel