ignore unreasonable prefetches
This commit is contained in:
@@ -450,6 +450,25 @@ void DSoundBuf::CheckUnderrun( int cursorstart, int cursorend, int chunksize )
|
|||||||
wrap( fake_write_cursor, buffersize );
|
wrap( fake_write_cursor, buffersize );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If the driver is requesting an unreasonably large prefetch, ignore it entirely.
|
||||||
|
* Some drivers seem to give broken write cursors sporadically, requesting that
|
||||||
|
* almost the entire buffer be filled. There's no reason a driver should ever need
|
||||||
|
* more than 8k frames of writeahead. */
|
||||||
|
int prefetch = cursorend - cursorstart;
|
||||||
|
wrap( prefetch, buffersize );
|
||||||
|
|
||||||
|
if( prefetch >= 1024*32 )
|
||||||
|
{
|
||||||
|
static bool bLogged = false;
|
||||||
|
if( bLogged )
|
||||||
|
return;
|
||||||
|
bLogged = true;
|
||||||
|
|
||||||
|
LOG->Warn("Sound driver is requesting an overly large prefetch: wants %i (cursor at %i..%i), writeahead not adjusted",
|
||||||
|
prefetch/bytes_per_frame(), cursorstart, cursorend );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
LOG->Trace("write_cursor %i, fake_write_cursor %i, fake_buffer_bytes_filled %i",
|
LOG->Trace("write_cursor %i, fake_write_cursor %i, fake_buffer_bytes_filled %i",
|
||||||
write_cursor, fake_write_cursor, fake_buffer_bytes_filled );
|
write_cursor, fake_write_cursor, fake_buffer_bytes_filled );
|
||||||
|
|
||||||
@@ -491,9 +510,6 @@ void DSoundBuf::CheckUnderrun( int cursorstart, int cursorend, int chunksize )
|
|||||||
* need to increase the writeahead.
|
* need to increase the writeahead.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int prefetch = cursorend - cursorstart;
|
|
||||||
wrap( prefetch, buffersize );
|
|
||||||
|
|
||||||
int old_writeahead = writeahead;
|
int old_writeahead = writeahead;
|
||||||
writeahead = writeahead * 4 / 3;
|
writeahead = writeahead * 4 / 3;
|
||||||
/* Snap to bytes_per_frame. */
|
/* Snap to bytes_per_frame. */
|
||||||
|
|||||||
Reference in New Issue
Block a user