1
0
mirror of http://mpg123.de/trunk/.git synced 2025-10-23 16:48:31 +03:00

libout123: limit write block to 16K

git-svn-id: svn://scm.orgis.org/mpg123/trunk@4655 35dc7657-300d-0410-a2e5-dc2837fedb53
This commit is contained in:
thor
2020-04-26 12:56:12 +00:00
parent 17168060ed
commit 0b72b870fb
2 changed files with 11 additions and 2 deletions

2
NEWS
View File

@@ -84,6 +84,8 @@
-- Fixed out_play() abortion logic to better detect fatal situations -- Fixed out_play() abortion logic to better detect fatal situations
(broken pipe). Needed on FreeBSD, while Linux buffers the issue away. (broken pipe). Needed on FreeBSD, while Linux buffers the issue away.
Should resolve bug 283. Should resolve bug 283.
-- Limit size of buffer block being written in out123_play to 16K, avoiding
unnecessary failure with ALSA at least.
-- Using SDL2 now if found. Output module code unchanged. -- Using SDL2 now if found. Output module code unchanged.
-- Added hex and txt (plain text) printout. -- Added hex and txt (plain text) printout.
-- Eliminated a spots where error messages would still be printed -- Eliminated a spots where error messages would still be printed

View File

@@ -691,13 +691,19 @@ out123_play(out123_handle *ao, void *bytes, size_t count)
else else
#endif #endif
{ {
// Write 16K in a piece as maximum, as I've seen random short
// writes of big blocks with ALSA.
int maxcount = 1<<14;
maxcount -= maxcount % ao->framesize;
if(maxcount < 1)
maxcount = ao->framesize;
if(ao->flags & OUT123_MUTE) if(ao->flags & OUT123_MUTE)
mute_block( bytes, count, ao->zerosample mute_block( bytes, count, ao->zerosample
, MPG123_SAMPLESIZE(ao->format) ); , MPG123_SAMPLESIZE(ao->format) );
do /* Playback in a loop to be able to continue after interruptions. */ do /* Playback in a loop to be able to continue after interruptions. */
{ {
errno = 0; errno = 0;
int block = count > INT_MAX ? INT_MAX : count; int block = count > maxcount ? maxcount : count;
written = ao->write(ao, bytes, block); written = ao->write(ao, bytes, block);
debug4( "written: %d errno: %i (%s), keep_on=%d" debug4( "written: %d errno: %i (%s), keep_on=%d"
, written, errno, strerror(errno) , written, errno, strerror(errno)
@@ -707,7 +713,8 @@ out123_play(out123_handle *ao, void *bytes, size_t count)
{ {
ao->errcode = OUT123_DEV_PLAY; ao->errcode = OUT123_DEV_PLAY;
if(!AOQUIET) if(!AOQUIET)
error1("Error in writing audio (%s?)!", strerror(errno)); merror( "Error in writing audio, wrote only %d of %d (%s?)!"
, written, block, strerror(errno) );
/* This is a serious issue ending this playback round. */ /* This is a serious issue ending this playback round. */
break; break;
} }