Seems to fix DSound player repeat-at-end problem.
Also avoid throwing-catching an exception during audio display drawing, only because it looks bad in the debug output. Originally committed to SVN as r1449.
This commit is contained in:
parent
3f934a66db
commit
9ab2d1c7fe
2 changed files with 15 additions and 7 deletions
|
@ -394,6 +394,7 @@ void AudioDisplay::DrawInactiveLines(wxDC &dc) {
|
||||||
|
|
||||||
for (int j=shadeFrom;j<shadeTo;j++) {
|
for (int j=shadeFrom;j<shadeTo;j++) {
|
||||||
if (j == line_n) continue;
|
if (j == line_n) continue;
|
||||||
|
if (j < 0) continue;
|
||||||
shade = grid->GetDialogue(j);
|
shade = grid->GetDialogue(j);
|
||||||
|
|
||||||
if (shade) {
|
if (shade) {
|
||||||
|
|
|
@ -182,8 +182,7 @@ void DirectSoundPlayer::OpenStream() {
|
||||||
waveFormat.cbSize = 0;
|
waveFormat.cbSize = 0;
|
||||||
|
|
||||||
// Create the buffer initializer
|
// Create the buffer initializer
|
||||||
//int aim = waveFormat.nAvgBytesPerSec + waveFormat.nAvgBytesPerSec/2; // one and a half second of buffer
|
int aim = waveFormat.nAvgBytesPerSec * 15/100; // 150 ms buffer
|
||||||
int aim = waveFormat.nAvgBytesPerSec / 4; // quarter second of buffer
|
|
||||||
int min = DSBSIZE_MIN;
|
int min = DSBSIZE_MIN;
|
||||||
int max = DSBSIZE_MAX;
|
int max = DSBSIZE_MAX;
|
||||||
bufSize = MIN(MAX(min,aim),max);
|
bufSize = MIN(MAX(min,aim),max);
|
||||||
|
@ -261,6 +260,8 @@ bool DirectSoundPlayer::FillBuffer(bool fill) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we're going to fill the entire buffer (ie. at start of playback) start by zeroing it out
|
// If we're going to fill the entire buffer (ie. at start of playback) start by zeroing it out
|
||||||
|
// If it's not zeroed out we might have a playback selection shorter than the buffer
|
||||||
|
// and then everything after the playback selection will be junk, which we don't want played.
|
||||||
if (fill) {
|
if (fill) {
|
||||||
RetryClear:
|
RetryClear:
|
||||||
res = buffer->Lock(0, bufSize, &ptr1, &size1, &ptr2, &size2, 0);
|
res = buffer->Lock(0, bufSize, &ptr1, &size1, &ptr2, &size2, 0);
|
||||||
|
@ -296,6 +297,10 @@ RetryLock:
|
||||||
unsigned long int count1 = size1 / bytesps;
|
unsigned long int count1 = size1 / bytesps;
|
||||||
unsigned long int count2 = size2 / bytesps;
|
unsigned long int count2 = size2 / bytesps;
|
||||||
|
|
||||||
|
if (count1) wxLogDebug(_T("DS fill: %05lu -> %05lu"), (unsigned long)playPos, (unsigned long)playPos+count1);
|
||||||
|
if (count2) wxLogDebug(_T("DS fill: %05lu => %05lu"), (unsigned long)playPos+count1, (unsigned long)playPos+count1+count2);
|
||||||
|
if (!count1 && !count2) wxLogDebug(_T("DS fill: nothing"));
|
||||||
|
|
||||||
// Get source wave
|
// Get source wave
|
||||||
if (count1) provider->GetAudioWithVolume(ptr1, playPos, count1, volume);
|
if (count1) provider->GetAudioWithVolume(ptr1, playPos, count1, volume);
|
||||||
if (count2) provider->GetAudioWithVolume(ptr2, playPos+count1, count2, volume);
|
if (count2) provider->GetAudioWithVolume(ptr2, playPos+count1, count2, volume);
|
||||||
|
@ -307,7 +312,7 @@ RetryLock:
|
||||||
// Update offset
|
// Update offset
|
||||||
offset = (offset + count1*bytesps + count2*bytesps) % bufSize;
|
offset = (offset + count1*bytesps + count2*bytesps) % bufSize;
|
||||||
|
|
||||||
return true; // If delta>0 we hit end of stream
|
return playPos < endPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -425,7 +430,7 @@ DirectSoundPlayerThread::~DirectSoundPlayerThread() {
|
||||||
wxThread::ExitCode DirectSoundPlayerThread::Entry() {
|
wxThread::ExitCode DirectSoundPlayerThread::Entry() {
|
||||||
// Wake up thread every half second to fill buffer as needed
|
// Wake up thread every half second to fill buffer as needed
|
||||||
// This more or less assumes the buffer is at least one second long
|
// This more or less assumes the buffer is at least one second long
|
||||||
while (WaitForSingleObject(stopnotify, 100) == WAIT_TIMEOUT) {
|
while (WaitForSingleObject(stopnotify, 50) == WAIT_TIMEOUT) {
|
||||||
if (!parent->FillBuffer(false)) {
|
if (!parent->FillBuffer(false)) {
|
||||||
// FillBuffer returns false when end of stream is reached
|
// FillBuffer returns false when end of stream is reached
|
||||||
wxLogDebug(_T("DS thread hit end of stream"));
|
wxLogDebug(_T("DS thread hit end of stream"));
|
||||||
|
@ -435,7 +440,7 @@ wxThread::ExitCode DirectSoundPlayerThread::Entry() {
|
||||||
|
|
||||||
// Now fill buffer with silence
|
// Now fill buffer with silence
|
||||||
DWORD bytesFilled = 0;
|
DWORD bytesFilled = 0;
|
||||||
while (WaitForSingleObject(stopnotify, 100) == WAIT_TIMEOUT) {
|
while (WaitForSingleObject(stopnotify, 50) == WAIT_TIMEOUT) {
|
||||||
void *buf1, *buf2;
|
void *buf1, *buf2;
|
||||||
DWORD size1, size2;
|
DWORD size1, size2;
|
||||||
DWORD playpos;
|
DWORD playpos;
|
||||||
|
@ -448,13 +453,15 @@ wxThread::ExitCode DirectSoundPlayerThread::Entry() {
|
||||||
if (FAILED(res)) break;
|
if (FAILED(res)) break;
|
||||||
if (size1) memset(buf1, 0, size1);
|
if (size1) memset(buf1, 0, size1);
|
||||||
if (size2) memset(buf2, 0, size2);
|
if (size2) memset(buf2, 0, size2);
|
||||||
|
if (size1) wxLogDebug(_T("DS blnk: %05ld -> %05ld"), (unsigned long)parent->playPos+bytesFilled, (unsigned long)parent->playPos+bytesFilled+size1);
|
||||||
|
if (size2) wxLogDebug(_T("DS blnk: %05ld => %05ld"), (unsigned long)parent->playPos+bytesFilled+size1, (unsigned long)parent->playPos+bytesFilled+size1+size2);
|
||||||
bytesFilled += size1 + size2;
|
bytesFilled += size1 + size2;
|
||||||
parent->buffer->Unlock(buf1, size1, buf2, size2);
|
parent->buffer->Unlock(buf1, size1, buf2, size2);
|
||||||
if (bytesFilled >= parent->bufSize) break;
|
if (bytesFilled > parent->bufSize) break;
|
||||||
parent->offset = (parent->offset + size1 + size2) % parent->bufSize;
|
parent->offset = (parent->offset + size1 + size2) % parent->bufSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
WaitForSingleObject(stopnotify, 300);
|
WaitForSingleObject(stopnotify, 150);
|
||||||
|
|
||||||
wxLogDebug(_T("DS thread dead"));
|
wxLogDebug(_T("DS thread dead"));
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue