Is someone looking into my report please?
I did include a compilable test case, so it shouldn't
be too hard to reproduce this :/
Myself, I am using a Creative SoundBlaster Live! value,
but I think this should give the same results with any
sound card.
Using kernel 2.5.74 here.
The previous post:
On Sun, Jul 13, 2003 at 05:59:19PM +0200, Carlo Wood wrote:
> On Sun, Jul 13, 2003 at 04:38:47AM +0200, Carlo Wood wrote:
> > I wrote a patch for sound/core/oss/pcm_oss.c, that fixes the ViaVoice
> > problem.
>
> Later I wrote a test case that still doesn't get fixed:
>
> >a.out
> Size of a fragment in bytes: 1024
> Allocated fragments for buffering: 2
> Successfully caused an xrun.
> non-blocking fragments: 2
> non-blocking bytes: 2048
> Stream is not restarted after xrun.
>
> now this is expected without my patch, but with
> the patch the stream *is* set back to a RUNNING state
> again successfully - nevertheless, snd_pcm_update_hw_ptr_interrupt
> is not called anymore.
>
> Is there anyone who can get the following test code to work
> (by patching the ALSA kernel module, not by changing the test code! ;).
>
> Test code:
>
>
> #include <stdio.h>
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <fcntl.h>
> #include <sys/ioctl.h>
> #include <unistd.h>
> #include <sys/soundcard.h>
> #include <time.h>
>
> int main(void)
> {
> int fd = open("/dev/dsp", O_RDONLY);
> if (fd == -1) { perror("open"); exit(127); }
> int res = AFMT_S16_LE;
> if (ioctl(fd, SNDCTL_DSP_SETFMT, &res) == -1) {
> perror("ioctl"); exit(127); }
> res = 0;
> if (ioctl(fd, SNDCTL_DSP_STEREO, &res) == -1) {
> perror("ioctl"); exit(127); }
> res = 22050;
> if (ioctl(fd, SOUND_PCM_READ_RATE, 0xbfffdcfc) == -1) {
> perror("ioctl"); exit(127); }
> res = 0x7fff000a;
> if (ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &res) == -1) {
> perror("ioctl"); exit(127); }
> audio_buf_info info;
> if (ioctl(fd, SNDCTL_DSP_GETISPACE, &info) == -1) {
> perror("read"); exit(127); }
> printf(" Size of a fragment in bytes: %d\n", info.fragsize);
> printf(" Allocated fragments for buffering: %d\n", info.fragstotal);
> char buf[1024];
> if (read(fd, buf, sizeof(buf)) < 0) { perror("read"); exit(127); }
> static struct timespec naptime = { 0, 100000000 };
> int count = 0;
> do {
> if (ioctl(fd, SNDCTL_DSP_GETISPACE, &info) == -1) {
> perror("read"); exit(127); }
> nanosleep(&naptime, 0);
> if (++count == 20) { printf("Failed to cause an xrun.\n"); exit(127); }
> } while(info.bytes < info.fragsize * info.fragstotal);
> printf(" Successfully caused an xrun.\n");
> printf(" non-blocking fragments: %d\n", info.fragments);
> printf(" non-blocking bytes: %d\n", info.bytes);
> ssize_t bufsize = info.bytes;
> ssize_t trlen = 0;
> int nf = 0;
> for (;;)
> {
> if (ioctl(fd, SNDCTL_DSP_GETISPACE, &info) == -1) {
> perror("ioctl"); exit(127); }
> if (info.fragments > 0) {
> ssize_t rlen;
> if ((rlen = read(fd, buf, sizeof(buf))) < 0)
> { perror("read"); exit(127); }
> trlen += rlen;
> if (trlen > bufsize) {
> printf(" Read %d bytes: stream successfully restarted.\n", trlen);
> exit(0);
> }
> nf = 0;
> }
> else if (++nf > 10) {
> printf(" Stream is not restarted after xrun.\n");
> exit(1);
> }
> }
> close(fd);
> return 0;
> }
>
>
> Here is some debug output that I generated with added printk's:
>
> Jul 13 17:22:27 ansset kernel: Entering snd_pcm_update_hw_ptr_interrupt
> Jul 13 17:22:27 ansset kernel: snd_pcm_update_hw_ptr_interrupt: status->hw_ptr set
> to 1536
> Jul 13 17:22:27 ansset kernel: snd_pcm_capture_avail: boundary = 1073741824,
> status->hw_ptr = 1536, control->appl_ptr = 512
> Jul 13 17:22:27 ansset kernel: Calling snd_pcm_stop, runtime->status->state =
> SNDRV_PCM_STATE_RUNNING
> Jul 13 17:22:27 ansset kernel: Returned from snd_pcm_stop, runtime->status->state =
> SNDRV_PCM_STATE_XRUN
> Jul 13 17:22:27 ansset kernel: Leaving snd_pcm_update_hw_ptr_interrupt with EPIPE
> ...
> Jul 13 17:22:27 ansset kernel: snd_pcm_oss_read3: calling snd_pcm_kernel_ioctl
> SNDRV_PCM_IOCTL_DRAIN
> Jul 13 17:22:27 ansset kernel: snd_pcm_capture_drain: state is SNDRV_PCM_STATE_XRUN.
> Calling snd_pcm_change_state.
> Jul 13 17:22:27 ansset kernel: snd_pcm_capture_avail: boundary = 1073741824,
> status->hw_ptr = 1536, control->appl_ptr = 512
> Jul 13 17:22:27 ansset kernel: snd_pcm_capture_drain: Returning from
> snd_pcm_change_state, state is now 5
> Jul 13 17:22:27 ansset kernel: Entering snd_pcm_lib_read1
> Jul 13 17:22:27 ansset kernel: state is SNDRV_PCM_STATE_DRAINING
> Jul 13 17:22:27 ansset kernel: size = 512
> Jul 13 17:22:27 ansset kernel: snd_pcm_capture_avail: boundary = 1073741824,
> status->hw_ptr = 1536, control->appl_ptr = 512
> Jul 13 17:22:27 ansset kernel: Leaving snd_pcm_lib_read1; xfer = 512, err = 0
> ...
> Jul 13 17:22:27 ansset kernel: Entering snd_pcm_lib_read1
> Jul 13 17:22:27 ansset kernel: state is SNDRV_PCM_STATE_DRAINING
> Jul 13 17:22:27 ansset kernel: size = 512
> Jul 13 17:22:27 ansset kernel: snd_pcm_capture_avail: boundary = 1073741824,
> status->hw_ptr = 1536, control->appl_ptr = 1024
> Jul 13 17:22:27 ansset kernel: Leaving snd_pcm_lib_read1; xfer = 512, err = 0
> Jul 13 17:22:27 ansset kernel: snd_pcm_status: status->hw_ptr copied to be 1536
> Jul 13 17:22:27 ansset kernel: Calling snd_pcm_capture_avail()
> Jul 13 17:22:27 ansset kernel: snd_pcm_capture_avail: boundary = 1073741824,
> status->hw_ptr = 1536, control->appl_ptr = 1536
> Jul 13 17:22:27 ansset kernel: snd_pcm_capture_avail returned status->avail = 0
> Jul 13 17:22:27 ansset kernel: snd_pcm_status_user: status.avail = 0
>
> [start of effect of my patch]
>
> Jul 13 17:22:27 ansset kernel: snd_pcm_oss_read3: calling
> snd_pcm_kernel_ioctl(SNDRV_PCM_IOCTL_PREPARE)
> Jul 13 17:22:27 ansset kernel: snd_pcm_lib_ioctl_reset: status->hw_ptr set to 0
> Jul 13 17:22:27 ansset kernel: snd_pcm_oss_read3: state now SNDRV_PCM_STATE_RUNNING
> Jul 13 17:22:27 ansset kernel: snd_pcm_update_hw_ptr: status->hw_ptr set to 0
> Jul 13 17:22:27 ansset kernel: snd_pcm_capture_avail: boundary = 1073741824,
> status->hw_ptr = 0, control->appl_ptr = 0
> Jul 13 17:22:27 ansset kernel: snd_pcm_status: status->hw_ptr copied to be 0
> Jul 13 17:22:27 ansset kernel: snd_pcm_capture_avail: boundary = 1073741824,
> status->hw_ptr = 0, control->appl_ptr = 0
> Jul 13 17:22:27 ansset kernel: snd_pcm_capture_avail returned status->avail = 0
> Jul 13 17:22:27 ansset kernel: snd_pcm_status_user: status.avail = 0
> Jul 13 17:22:27 ansset kernel: space: bytes = 0, periods = 0, fragstotal = 2,
> fragsize = 1024
>
> [end of patch effects]
>
> ...
>
> but snd_pcm_update_hw_ptr_interrupt is never called anymore,
> it only repeats
>
> Jul 13 17:22:27 ansset kernel: snd_pcm_update_hw_ptr: status->hw_ptr set to 0
> Jul 13 17:22:27 ansset kernel: snd_pcm_capture_avail: boundary = 1073741824,
> status->hw_ptr = 0, control->appl_ptr = 0
> Jul 13 17:22:27 ansset kernel: snd_pcm_status: status->hw_ptr copied to be 0
> Jul 13 17:22:27 ansset kernel: Calling snd_pcm_capture_avail()
> Jul 13 17:22:27 ansset kernel: snd_pcm_capture_avail: boundary = 1073741824,
> status->hw_ptr = 0, control->appl_ptr = 0
> Jul 13 17:22:27 ansset kernel: snd_pcm_capture_avail returned status->avail = 0
> Jul 13 17:22:27 ansset kernel: snd_pcm_status_user: status.avail = 0
> Jul 13 17:22:27 ansset kernel: space: bytes = 0, periods = 0, fragstotal = 2,
> fragsize = 1024
>
> after that.
>
> --
> Carlo Wood <[EMAIL PROTECTED]>
>
>
> -------------------------------------------------------
> This SF.Net email sponsored by: Parasoft
> Error proof Web apps, automate testing & more.
> Download & eval WebKing and get a free book.
> www.parasoft.com/bulletproofapps1
> _______________________________________________
> Alsa-devel mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/alsa-devel
--
Carlo Wood <[EMAIL PROTECTED]>
-------------------------------------------------------
This SF.Net email sponsored by: Parasoft
Error proof Web apps, automate testing & more.
Download & eval WebKing and get a free book.
www.parasoft.com/bulletproofapps1
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel