mirror of https://github.com/odrling/Aegisub
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:
parent
fd9f2d5465
commit
d291871460
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
Loading…
Reference in New Issue