From: Philip Gladstone Date: Wed, 5 Feb 2003 01:59:52 +0000 (+0000) Subject: Fix the 'hard cpu loop' problem when capturing audio from /dev/dsp. This X-Git-Tag: v0.5~16705 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=79134973d862af5e22cf8909df690e3e1d4b256e;p=coroid%2Flibav_saccubus.git Fix the 'hard cpu loop' problem when capturing audio from /dev/dsp. This code now waits for up to 30ms before reporting that no packet is available. Originally committed as revision 1546 to svn://svn.ffmpeg.org/ffmpeg/trunk --- diff --git a/libavformat/audio.c b/libavformat/audio.c index 05055a178..737b79cd1 100644 --- a/libavformat/audio.c +++ b/libavformat/audio.c @@ -244,6 +244,18 @@ static int audio_read_packet(AVFormatContext *s1, AVPacket *pkt) if (av_new_packet(pkt, s->frame_size) < 0) return -EIO; for(;;) { + struct timeval tv; + fd_set fds; + + tv.tv_sec = 0; + tv.tv_usec = 30 * 1000; /* 30 msecs -- a bit shorter than 1 frame at 30fps */ + + FD_ZERO(&fds); + FD_SET(s->fd, &fds); + + /* This will block until data is available or we get a timeout */ + (void) select(s->fd + 1, &fds, 0, 0, &tv); + ret = read(s->fd, pkt->data, pkt->size); if (ret > 0) break;