Hello list,
I'm working on an application that requires a period time of 10ms. The hardware at the other end of the bus is a ulaw codec running at 8kHz. The application runs at 16kHz S16_LE and I was hoping to use the plughw device to do sample rate conversion and ulaw encode/decode. This way the application doesn't need to change to accommodate this ulaw codec. However, it's not working and I don't know how to go about debugging. I'm hoping I can get some pointers here.
The problem is best illustrated by this output, first using plughw: alsa_read: 10 alsa_read: 20 alsa_read: 0 alsa_read: 20 alsa_read: 0 alsa_read: 20 alsa_read: 0 alsa_read: 20 alsa_read: 0 alsa_read: 20
It would appear that plughw gives the correct period time on the first call, but then subsequently buffers 2 periods before returning. Using hw with matching sample rate, sample format, and number of samples: alsa_read: 10 alsa_read: 10 alsa_read: 10 alsa_read: 10 alsa_read: 10 alsa_r ead: 10 alsa_read: 10 alsa_read: 10 alsa_read: 10 alsa_read: 10
This code snippet generated the above output:
for (i = 0; i < 10; ++i) { gettimeofday(&time1, NULL); err = snd_pcm_readi (capture_handle, buf, NSMP); if (err != NSMP) { printf ("read from audio interface failed " " (%s)\n", snd_strerror (err)); exit (1); } gettimeofday(&time2, NULL); printf("alsa_read: %d\n", getTimeDiff(time1, time2)); }
I have tried using the patch from here (without the environment variable switch):
http://mailman.alsa-project.org/pipermail/alsa-devel/2008-October/01170 3.html
to print out the configuration of plughw's plugin chain, but it generates no output. I've verified the md5sum of the library after compilation and it matches the one I compiled. And I ran ldconfig after replacing libasound.so. So I don't know what's going on there. I definitely call snd_pcm_hw_params() when setting up the capture device. This is using alsa-lib-1.0.25.
Does anyone know why plughw might be acting the way it is and how I can get it to deliver 10ms periods? Equally appreciated would be any tips on how to debug this problem.
Thanks, Stef