Backported from: http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c1622c2c6e0e15a38fef723086ca8bf75a75b46b --- modules/audio_output/oss.c.orig +++ modules/audio_output/oss.c @@ -37,6 +37,7 @@ #else # include #endif +#include #ifndef SNDCTL_DSP_HALT # define SNDCTL_DSP_HALT SNDCTL_DSP_RESET @@ -209,6 +210,22 @@ static int Start (audio_output_t *aout, } aout_FormatPrepare (fmt); + /* Select timing */ + unsigned bytes; + char buf[1024]; + + if (spdif) + bytes = AOUT_SPDIF_SIZE; + else + bytes = fmt->i_rate / (CLOCK_FREQ / AOUT_MIN_PREPARE_TIME) + * fmt->i_bytes_per_frame; + + int frag = (AOUT_MAX_ADVANCE_TIME / AOUT_MIN_PREPARE_TIME) << 16 + | (32 - clz32(bytes - 1)); + if (ioctl (fd, SNDCTL_DSP_SETFRAGMENT, &frag) < 0) + msg_Err (aout, "cannot set 0x%08x fragment: %s", frag, + strerror_r(errno, buf, sizeof(buf) - 1)); + sys->fd = fd; VolumeSync (aout); sys->starting = true;