static int Demux( demux_t *p_demux ) { demux_sys_t *p_sys = p_demux->p_sys; block_t *p_blocka = NULL; block_t *p_blockv = NULL; /* Try grabbing audio frames first */ if( p_sys->fd_audio >= 0 ) p_blocka = GrabAudio( p_demux ); /* Try grabbing video frame */ p_blockv = GrabVideo( p_demux ); if( !p_blocka && !p_blockv ) { /* Sleep so we do not consume all the cpu, 10ms seems * like a good value (100fps) */ msleep( 10000 ); return 1; } if( p_blocka ) { es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_blocka->i_pts ); es_out_Send( p_demux->out, p_sys->p_es_audio, p_blocka ); } if( p_blockv ) { es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_blockv->i_pts ); es_out_Send( p_demux->out, p_sys->p_es_video, p_blockv ); } return 1; }
/***************************************************************************** * Demux: Processes the audio frame *****************************************************************************/ static int Demux( demux_t *p_demux ) { demux_sys_t *p_sys = p_demux->p_sys; block_t *p_block = NULL; do { if( p_block ) { es_out_Send( p_demux->out, p_sys->p_es, p_block ); p_block = NULL; } /* Wait for data */ int i_wait = snd_pcm_wait( p_sys->p_alsa_pcm, 10 ); /* See poll() comment in oss.c */ switch( i_wait ) { case 1: { p_block = GrabAudio( p_demux ); if( p_block ) es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block->i_pts ); } /* FIXME: this is a copy paste from below. Shouldn't be needed * twice. */ case -EPIPE: /* xrun */ snd_pcm_prepare( p_sys->p_alsa_pcm ); break; case -ESTRPIPE: { /* suspend */ int i_resume = snd_pcm_resume( p_sys->p_alsa_pcm ); if( i_resume < 0 && i_resume != -EAGAIN ) snd_pcm_prepare( p_sys->p_alsa_pcm ); break; } /* </FIXME> */ } } while( p_block && p_sys->i_next_demux_date > 0 && p_block->i_pts < p_sys->i_next_demux_date ); if( p_block ) es_out_Send( p_demux->out, p_sys->p_es, p_block ); return 1; }