I pinpointed the problem and wrote a small program to illustrate the problem.
When compiling the program given below with: gcc -DUSE_DSP_SETFMT=0 troep.c it runs fine. But, when compiling it with: gcc -DUSE_DSP_SETFMT=1 troep.c It stops rather quickly with reading data. Example output of the latter: ~>a.out Fragment size: 1024 Number of fragments: 32767 Number of channels: 1 Sample rate: 22050 Read 1024 bytes. Number of full fragments that can be read or written without blocking: 0 Total number of fragments allocated for buffering: 2 Size of a fragment in bytes: 1024 Number of bytes that can be read or written immediately without blocking: 0 #fragments, #bytes: 0, 0 #fragments, #bytes: 1, 1632 Read 1024 bytes. #fragments, #bytes: 2, 2048 Read 1024 bytes. #fragments, #bytes: 1, 1024 Read 1024 bytes. #fragments, #bytes: 0, 0 #fragments, #bytes: 0, 0 #fragments, #bytes: 0, 0 ...etc -- Carlo Wood <[EMAIL PROTECTED]> The program: #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <unistd.h> #include <linux/soundcard.h> #include <time.h> int main(void) { int res; char buf[1024]; int fd = open("/dev/dsp", O_RDONLY); if (fd == -1) { perror("open"); exit(1); } res = 0x7fff000a; if (ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &res) == -1) { perror("ioctl"); exit(1); } printf("Fragment size: %d\n", 1 << (res & 0xffff)); printf("Number of fragments: %d\n", res >> 16); #if USE_DSP_SETFMT res = AFMT_S16_LE; if (ioctl(fd, SNDCTL_DSP_SETFMT, &res) == -1) { perror("ioctl"); exit(1); } #endif res = 0; // Not stereo (1 channel). if (ioctl(fd, SNDCTL_DSP_STEREO, &res) == -1) { perror("ioctl"); exit(1); } printf("Number of channels: %d\n", res ? 2 : 1); res = 22050; if (ioctl(fd, SOUND_PCM_READ_RATE, 0xbfffdcfc) == -1) { perror("ioctl"); exit(1); } printf("Sample rate: %d\n", res); ssize_t rlen = read(fd, buf, sizeof(buf)); if (rlen <= 0) { perror("read"); exit(1); } printf("Read %d bytes.\n", rlen); audio_buf_info info; if (ioctl(fd, SNDCTL_DSP_GETISPACE, &info) == -1) { perror("read"); exit(1); } printf("Number of full fragments that can be read or written without blocking: %d\n", info.fragments); printf("Total number of fragments allocated for buffering: %d\n", info.fragstotal); printf("Size of a fragment in bytes: %d\n", info.fragsize); printf("Number of bytes that can be read or written immediately without blocking: %d\n", info.bytes); int i; for (i = 0; i < 100; ++i) { if (ioctl(fd, SNDCTL_DSP_GETISPACE, &info) == -1) { perror("read"); exit(1); } printf("#fragments, #bytes: %d, %d\n", info.fragments, info.bytes); if (info.fragments > 0) { ssize_t rlen = read(fd, buf, sizeof(buf)); if (rlen <= 0) { perror("read"); exit(1); } printf("Read %d bytes.\n", rlen); } static struct timespec naptime = { 0, 100000000 }; nanosleep(&naptime, 0); } close(fd); return 0; } ------------------------------------------------------- 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/bulletproofapps _______________________________________________ Alsa-devel mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-devel