Revert r2210 and r2201 because those fixes to DSound player seemed to just make things more unstable.

A complete rewrite of the DSound player might follow later.

Originally committed to SVN as r2415.
This commit is contained in:
Niels Martin Hansen 2008-10-22 22:31:43 +00:00
parent fd9f2d5465
commit d291871460
2 changed files with 18 additions and 33 deletions

View File

@ -48,6 +48,7 @@
/////////////// ///////////////
// Constructor // Constructor
DirectSoundPlayer::DirectSoundPlayer() { DirectSoundPlayer::DirectSoundPlayer() {
playing = false;
volume = 1.0f; volume = 1.0f;
playPos = 0; playPos = 0;
startPos = 0; startPos = 0;
@ -260,6 +261,7 @@ void DirectSoundPlayer::Play(int64_t start,int64_t count) {
// Play // Play
buffer->SetCurrentPosition(0); buffer->SetCurrentPosition(0);
res = buffer->Play(0,0,play_flag); res = buffer->Play(0,0,play_flag);
if (SUCCEEDED(res)) playing = true;
startTime = GetTickCount(); startTime = GetTickCount();
// Update timer // Update timer
@ -274,15 +276,17 @@ void DirectSoundPlayer::Stop(bool timerToo) {
if (thread) { if (thread) {
if (thread->IsAlive()) { if (thread->IsAlive()) {
thread->Stop(); thread->Stop();
thread->Wait();
} }
thread = NULL; thread = NULL;
} }
// The thread should now stop filling the buffer soon enough that we can safely stop the buffer // The thread is now guaranteed dead and there are no concurrency problems to worry about
// and possibly start having soomething else filling it soon.
if (buffer) buffer->Stop(); // Stop
if (buffer) buffer->Stop(); // the thread should have done this already
// Reset variables // Reset variables
playing = false;
playPos = 0; playPos = 0;
startPos = 0; startPos = 0;
endPos = 0; endPos = 0;
@ -298,7 +302,7 @@ void DirectSoundPlayer::Stop(bool timerToo) {
/////////// ///////////
// Set end // Set end
void DirectSoundPlayer::SetEndPosition(int64_t pos) { void DirectSoundPlayer::SetEndPosition(int64_t pos) {
if (IsPlaying()) endPos = pos; if (playing) endPos = pos;
} }
@ -313,8 +317,8 @@ void DirectSoundPlayer::SetCurrentPosition(int64_t pos) {
//////////////////////// ////////////////////////
// Get current position // Get current position
int64_t DirectSoundPlayer::GetCurrentPosition() { int64_t DirectSoundPlayer::GetCurrentPosition() {
// Assume position 0 if we aren't playing currently // Check if buffer is loaded
if (!IsPlaying()) return 0; if (!buffer || !playing) return 0;
// FIXME: this should be based on not duration played but actual sample being heard // FIXME: this should be based on not duration played but actual sample being heard
// (during vidoeo playback, cur_frame might get changed to resync) // (during vidoeo playback, cur_frame might get changed to resync)
@ -324,23 +328,9 @@ int64_t DirectSoundPlayer::GetCurrentPosition() {
} }
///////////////////////////////////////
// Check whether the buffer is playing
bool DirectSoundPlayer::IsPlaying() {
if (!buffer) return false;
DWORD status = 0;
if (SUCCEEDED(buffer->GetStatus(&status))) {
return !!(status & DSBSTATUS_PLAYING);
} else {
return false;
}
}
////////////////////// //////////////////////
// Thread constructor // Thread constructor
DirectSoundPlayerThread::DirectSoundPlayerThread(DirectSoundPlayer *par) : wxThread(wxTHREAD_DETACHED) { DirectSoundPlayerThread::DirectSoundPlayerThread(DirectSoundPlayer *par) : wxThread(wxTHREAD_JOINABLE) {
parent = par; parent = par;
stopnotify = CreateEvent(NULL, true, false, NULL); stopnotify = CreateEvent(NULL, true, false, NULL);
} }
@ -356,13 +346,8 @@ DirectSoundPlayerThread::~DirectSoundPlayerThread() {
////////////////////// //////////////////////
// Thread entry point // Thread entry point
wxThread::ExitCode DirectSoundPlayerThread::Entry() { wxThread::ExitCode DirectSoundPlayerThread::Entry() {
// Every thread that uses COM must initialise it
CoInitialize(0); CoInitialize(0);
// Make sure we have the buffer available as long as we're alive
parent->buffer->AddRef();
IDirectSoundBuffer8 *buffer = parent->buffer;
// 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, 50) == WAIT_TIMEOUT) { while (WaitForSingleObject(stopnotify, 50) == WAIT_TIMEOUT) {
@ -380,18 +365,18 @@ wxThread::ExitCode DirectSoundPlayerThread::Entry() {
DWORD size1, size2; DWORD size1, size2;
DWORD playpos; DWORD playpos;
HRESULT res; HRESULT res;
res = buffer->GetCurrentPosition(&playpos, NULL); res = parent->buffer->GetCurrentPosition(&playpos, NULL);
if (FAILED(res)) break; if (FAILED(res)) break;
int toWrite = playpos - parent->offset; int toWrite = playpos - parent->offset;
while (toWrite < 0) toWrite += parent->bufSize; while (toWrite < 0) toWrite += parent->bufSize;
res = buffer->Lock(parent->offset, toWrite, &buf1, &size1, &buf2, &size2, 0); res = parent->buffer->Lock(parent->offset, toWrite, &buf1, &size1, &buf2, &size2, 0);
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 (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); 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;
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;
} }
@ -400,10 +385,9 @@ wxThread::ExitCode DirectSoundPlayerThread::Entry() {
wxLogDebug(_T("DS thread dead")); wxLogDebug(_T("DS thread dead"));
// Our owner is responsible for stopping the buffer parent->playing = false;
buffer->Release(); parent->buffer->Stop();
// And un-init COM since we inited it
CoUninitialize(); CoUninitialize();
return 0; return 0;
} }

View File

@ -90,6 +90,7 @@ class DirectSoundPlayer : public AudioPlayer {
friend class DirectSoundPlayerThread; friend class DirectSoundPlayerThread;
private: private:
volatile bool playing;
float volume; float volume;
int offset; int offset;
DWORD bufSize; DWORD bufSize;
@ -115,7 +116,7 @@ public:
void Play(int64_t start,int64_t count); void Play(int64_t start,int64_t count);
void Stop(bool timerToo=true); void Stop(bool timerToo=true);
bool IsPlaying(); bool IsPlaying() { return playing; }
int64_t GetStartPosition() { return startPos; } int64_t GetStartPosition() { return startPos; }
int64_t GetEndPosition() { return endPos; } int64_t GetEndPosition() { return endPos; }