--- swfdec-0.6.6/swfdec-gtk/swfdec_playback_oss.c.orig 2008-07-03 18:13:00.000000000 +0200 +++ swfdec-0.6.6/swfdec-gtk/swfdec_playback_oss.c 2008-07-03 18:27:38.000000000 +0200 @@ -59,6 +59,10 @@ /* Size of one of our audio samples, in bytes */ #define SAMPLESIZE 2 #define CHANNELS 2 +/* Fragment size selector for 4096 bytes */ +#define FRAGSIZE_SEL 12 +#define FRAGSIZE (1 << FRAGSIZE_SEL) +#define MAX_FRAGMENTS 4 /*** STREAMS ***/ @@ -113,9 +117,9 @@ GIOChannel *channel; Stream *stream; guint rate; - int dsp_fd, ret, format, channels, fragsize; + int dsp_fd, ret, format, channels, mmmmssss; - dsp_fd = open("/dev/dsp", O_WRONLY); + dsp_fd = open("/dev/dsp", O_WRONLY | O_NONBLOCK); if (dsp_fd == -1) { g_printerr ("Failed to open /dev/dsp\n"); return; @@ -145,9 +149,13 @@ return; } - ret = ioctl(dsp_fd, SNDCTL_DSP_GETBLKSIZE, &fragsize); + /* We used to query the fragment size by SNDCTL_DSP_GETBLKSIZE ioctl, + * but it added latency. + * See SNDCTL_DSP_SETFRAGMENT page in oss reference for details. */ + mmmmssss = (MAX_FRAGMENTS << 16) | (FRAGSIZE_SEL); + ret = ioctl(dsp_fd, SNDCTL_DSP_SETFRAGMENT, &mmmmssss); if (ret == -1) { - g_printerr ("Failed to get fragment size\n"); + g_printerr ("Failed to set fragment size\n"); close(dsp_fd); return; } @@ -156,7 +164,7 @@ stream->sound = sound; stream->audio = g_object_ref (audio); stream->dsp_fd = dsp_fd; - stream->fragsize = fragsize; + stream->fragsize = FRAGSIZE; sound->streams = g_list_prepend (sound->streams, stream); channel = g_io_channel_unix_new (stream->dsp_fd);