mirror of
https://github.com/mpv-player/mpv
synced 2025-01-18 21:31:13 +00:00
Fix the error handling in the play() function: add a handler for EINTR,
improve the reporting of other errors, and don't try to call snd_pcm_writei() repeatedly when it aborts after a partial write due to an error. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@17622 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
7d319f4b75
commit
7673cbf6a7
@ -739,10 +739,7 @@ static void reset(void)
|
|||||||
|
|
||||||
static int play(void* data, int len, int flags)
|
static int play(void* data, int len, int flags)
|
||||||
{
|
{
|
||||||
|
|
||||||
//bytes_per_sample is always 4 for 2 chn S16_LE
|
|
||||||
int num_frames = len / bytes_per_sample;
|
int num_frames = len / bytes_per_sample;
|
||||||
char *output_samples = (char *)data;
|
|
||||||
snd_pcm_sframes_t res = 0;
|
snd_pcm_sframes_t res = 0;
|
||||||
|
|
||||||
//mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: frames=%i, len=%i\n",num_frames,len);
|
//mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: frames=%i, len=%i\n",num_frames,len);
|
||||||
@ -752,39 +749,33 @@ static int play(void* data, int len, int flags)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (num_frames > 0) {
|
if (num_frames == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
res = snd_pcm_writei(alsa_handler, (void *)output_samples, num_frames);
|
do {
|
||||||
|
res = snd_pcm_writei(alsa_handler, data, num_frames);
|
||||||
|
|
||||||
if (res == -ESTRPIPE) { /* suspend */
|
if (res == -EINTR) {
|
||||||
|
/* nothing to do */
|
||||||
|
res = 0;
|
||||||
|
}
|
||||||
|
else if (res == -ESTRPIPE) { /* suspend */
|
||||||
mp_msg(MSGT_AO,MSGL_INFO,"alsa-play: pcm in suspend mode. trying to resume\n");
|
mp_msg(MSGT_AO,MSGL_INFO,"alsa-play: pcm in suspend mode. trying to resume\n");
|
||||||
while ((res = snd_pcm_resume(alsa_handler)) == -EAGAIN)
|
while ((res = snd_pcm_resume(alsa_handler)) == -EAGAIN)
|
||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
else if (res < 0) {
|
if (res < 0) {
|
||||||
mp_msg(MSGT_AO,MSGL_INFO,"alsa-play: unknown status, trying to reset soundcard\n");
|
mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: write error: %s\n", snd_strerror(res));
|
||||||
|
mp_msg(MSGT_AO,MSGL_INFO,"alsa-play: trying to reset soundcard\n");
|
||||||
if ((res = snd_pcm_prepare(alsa_handler)) < 0) {
|
if ((res = snd_pcm_prepare(alsa_handler)) < 0) {
|
||||||
mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: snd prepare error");
|
mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: pcm prepare error: %s\n", snd_strerror(res));
|
||||||
return(0);
|
return(0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} while (res == 0);
|
||||||
|
|
||||||
if (res > 0) {
|
return res < 0 ? res : res * bytes_per_sample;
|
||||||
|
|
||||||
/* output_samples += ao_data.channels * res; */
|
|
||||||
output_samples += res * bytes_per_sample;
|
|
||||||
|
|
||||||
num_frames -= res;
|
|
||||||
}
|
|
||||||
|
|
||||||
} //end while
|
|
||||||
|
|
||||||
if (res < 0) {
|
|
||||||
mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: write error %s", snd_strerror(res));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return len - len % bytes_per_sample;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* how many byes are free in the buffer */
|
/* how many byes are free in the buffer */
|
||||||
|
Loading…
Reference in New Issue
Block a user