diff --git a/Source/Core/AudioCommon/Src/AOSoundStream.cpp b/Source/Core/AudioCommon/Src/AOSoundStream.cpp index fdc507f5ee..c3cae83f74 100644 --- a/Source/Core/AudioCommon/Src/AOSoundStream.cpp +++ b/Source/Core/AudioCommon/Src/AOSoundStream.cpp @@ -46,20 +46,15 @@ void AOSound::SoundLoop() while (!threadData) { soundCriticalSection.Enter(); - m_mixer->Mix(realtimeBuffer, numBytesToRender >> 2); ao_play(device, (char*)realtimeBuffer, numBytesToRender); - soundCriticalSection.Leave(); if (! threadData) soundSyncEvent.Wait(); } - ao_close(device); - device = NULL; - ao_shutdown(); - + device = NULL; } void *soundThread(void *args) @@ -93,7 +88,10 @@ void AOSound::Stop() delete thread; thread = NULL; soundSyncEvent.Shutdown(); - } +AOSound::~AOSound() { + // FIXME: crashes dolphin + // ao_shutdown(); +} #endif diff --git a/Source/Core/AudioCommon/Src/AOSoundStream.h b/Source/Core/AudioCommon/Src/AOSoundStream.h index 99aa327dab..91f8b12dad 100644 --- a/Source/Core/AudioCommon/Src/AOSoundStream.h +++ b/Source/Core/AudioCommon/Src/AOSoundStream.h @@ -44,7 +44,7 @@ class AOSound : public SoundStream public: AOSound(CMixer *mixer) : SoundStream(mixer) {} - virtual ~AOSound() {} + virtual ~AOSound(); virtual bool Start(); diff --git a/Source/Core/AudioCommon/Src/DSoundStream.h b/Source/Core/AudioCommon/Src/DSoundStream.h index 3a62e633ba..2c46d81529 100644 --- a/Source/Core/AudioCommon/Src/DSoundStream.h +++ b/Source/Core/AudioCommon/Src/DSoundStream.h @@ -64,9 +64,10 @@ class DSound : public SoundStream DWORD dwSoundBytes); public: - DSound(CMixer *mixer, void *hWnd = NULL) : SoundStream(mixer) {} - - DSound(CMixer *mixer) : SoundStream(mixer) {} + DSound(CMixer *mixer, void *hWnd = NULL) : SoundStream(mixer), + bufferSize(0), + totalRenderedBytes(0), + currentPos(0),lastPos(0) {} virtual ~DSound() {} diff --git a/Source/Core/AudioCommon/Src/Mixer.cpp b/Source/Core/AudioCommon/Src/Mixer.cpp index 1174b48f98..5c716e842d 100644 --- a/Source/Core/AudioCommon/Src/Mixer.cpp +++ b/Source/Core/AudioCommon/Src/Mixer.cpp @@ -31,7 +31,6 @@ void CMixer::Mix(short *samples, int numSamples) Premix(NULL, 0); return; } - // silence memset(samples, 0, numSamples * 2 * sizeof(short)); @@ -68,13 +67,14 @@ void CMixer::PushSamples(short *samples, int num_stereo_samples) if (!soundStream) return; + push_sync.Enter(); if (m_queueSize == 0) { m_queueSize = queue_minlength; for (int i = 0; i < queue_minlength; i++) sample_queue.push((s16)0); } - + push_sync.Leave(); static int PV1l=0,PV2l=0,PV3l=0,PV4l=0; static int PV1r=0,PV2r=0,PV3r=0,PV4r=0; static int acc=0; @@ -85,81 +85,81 @@ void CMixer::PushSamples(short *samples, int num_stereo_samples) #endif // Write Other Audio - if (m_throttle) { - /* This is only needed for non-AX sound, currently directly - streamed and DTK sound. For AX we call SoundStream::Update in - AXTask() for example. */ - while (m_queueSize > queue_maxlength / 2) { - // Urgh. - if (g_dspInitialize.pEmulatorState) { - if (*g_dspInitialize.pEmulatorState != 0) - return; - } - soundStream->Update(); - Common::SleepCurrentThread(0); + if (! m_throttle) + return; + + + /* This is only needed for non-AX sound, currently directly + streamed and DTK sound. For AX we call SoundStream::Update in + AXTask() for example. */ + while (m_queueSize > queue_maxlength / 2) { + + // Urgh. + if (g_dspInitialize.pEmulatorState) { + if (*g_dspInitialize.pEmulatorState != 0) + return; } - - push_sync.Enter(); - while (num_stereo_samples) - { - acc += m_sampleRate; - while (num_stereo_samples && (acc >= 48000)) - { - PV4l=PV3l; - PV3l=PV2l; - PV2l=PV1l; - PV1l=*(samples++); //32bit processing - PV4r=PV3r; - PV3r=PV2r; - PV2r=PV1r; - PV1r=*(samples++); //32bit processing - num_stereo_samples--; - acc-=48000; - } - - // defaults to nearest - s32 DataL = PV1l; - s32 DataR = PV1r; - - if (m_mode == 1) //linear - { - DataL = PV1l + ((PV2l - PV1l)*acc)/48000; - DataR = PV1r + ((PV2r - PV1r)*acc)/48000; - } - else if (m_mode == 2) //cubic - { - s32 a0l = PV1l - PV2l - PV4l + PV3l; - s32 a0r = PV1r - PV2r - PV4r + PV3r; - s32 a1l = PV4l - PV3l - a0l; - s32 a1r = PV4r - PV3r - a0r; - s32 a2l = PV1l - PV4l; - s32 a2r = PV1r - PV4r; - s32 a3l = PV2l; - s32 a3r = PV2r; - - s32 t0l = ((a0l )*acc)/48000; - s32 t0r = ((a0r )*acc)/48000; - s32 t1l = ((t0l+a1l)*acc)/48000; - s32 t1r = ((t0r+a1r)*acc)/48000; - s32 t2l = ((t1l+a2l)*acc)/48000; - s32 t2r = ((t1r+a2r)*acc)/48000; - s32 t3l = ((t2l+a3l)); - s32 t3r = ((t2r+a3r)); - - DataL = t3l; - DataR = t3r; - } - - int l = DataL, r = DataR; - if (l < -32767) l = -32767; - if (r < -32767) r = -32767; - if (l > 32767) l = 32767; - if (r > 32767) r = 32767; - sample_queue.push(l); - sample_queue.push(r); - m_queueSize += 2; - } - push_sync.Leave(); - } + soundStream->Update(); + Common::SleepCurrentThread(0); + } + + push_sync.Enter(); + while (num_stereo_samples) { + acc += m_sampleRate; + while (num_stereo_samples && (acc >= 48000)) { + PV4l=PV3l; + PV3l=PV2l; + PV2l=PV1l; + PV1l=*(samples++); //32bit processing + PV4r=PV3r; + PV3r=PV2r; + PV2r=PV1r; + PV1r=*(samples++); //32bit processing + num_stereo_samples--; + acc-=48000; + } + + // defaults to nearest + s32 DataL = PV1l; + s32 DataR = PV1r; + + if (m_mode == 1) { //linear + + DataL = PV1l + ((PV2l - PV1l)*acc)/48000; + DataR = PV1r + ((PV2r - PV1r)*acc)/48000; + } + else if (m_mode == 2) {//cubic + s32 a0l = PV1l - PV2l - PV4l + PV3l; + s32 a0r = PV1r - PV2r - PV4r + PV3r; + s32 a1l = PV4l - PV3l - a0l; + s32 a1r = PV4r - PV3r - a0r; + s32 a2l = PV1l - PV4l; + s32 a2r = PV1r - PV4r; + s32 a3l = PV2l; + s32 a3r = PV2r; + + s32 t0l = ((a0l )*acc)/48000; + s32 t0r = ((a0r )*acc)/48000; + s32 t1l = ((t0l+a1l)*acc)/48000; + s32 t1r = ((t0r+a1r)*acc)/48000; + s32 t2l = ((t1l+a2l)*acc)/48000; + s32 t2r = ((t1r+a2r)*acc)/48000; + s32 t3l = ((t2l+a3l)); + s32 t3r = ((t2r+a3r)); + + DataL = t3l; + DataR = t3r; + } + + int l = DataL, r = DataR; + if (l < -32767) l = -32767; + if (r < -32767) r = -32767; + if (l > 32767) l = 32767; + if (r > 32767) r = 32767; + sample_queue.push(l); + sample_queue.push(r); + m_queueSize += 2; + } + push_sync.Leave(); } diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/main.cpp b/Source/Plugins/Plugin_DSP_HLE/Src/main.cpp index 96edccaf75..9ca3b214e5 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/main.cpp +++ b/Source/Plugins/Plugin_DSP_HLE/Src/main.cpp @@ -217,23 +217,30 @@ void Initialize(void *init) void DSP_StopSoundStream() { - // fprintf(stderr, "in dsp stop\n"); + /* if (!soundStream) PanicAlert("Can't stop non running SoundStream!"); soundStream->Stop(); delete soundStream; soundStream = NULL; - // fprintf(stderr, "in dsp stop end\n"); - +*/ } void Shutdown() { - // FIXME: called before stop is finished???? - // fprintf(stderr, "in dsp shutdown\n"); + NOTICE_LOG(DSPHLE, "Shutting down DSP plugin"); + + if (soundStream) { + soundStream->Stop(); + delete soundStream; + soundStream = NULL; + } + // Check that soundstream already is stopped. - if (soundStream) - PanicAlert("SoundStream alive in DSP::Shutdown!"); + while (soundStream) { + ERROR_LOG(DSPHLE, "Waiting for sound stream"); + Common::SleepCurrentThread(2000); + } // Stop the sound recording if (log_ai) @@ -252,6 +259,7 @@ void Shutdown() m_frame->sMailEnd.clear(); } #endif + INFO_LOG(DSPHLE, "Done shutting down DSP plugin"); } void DoState(unsigned char **ptr, int mode) diff --git a/Source/Plugins/Plugin_DSP_LLE-testing/Src/main.cpp b/Source/Plugins/Plugin_DSP_LLE-testing/Src/main.cpp index f22586637d..01ce22da9f 100644 --- a/Source/Plugins/Plugin_DSP_LLE-testing/Src/main.cpp +++ b/Source/Plugins/Plugin_DSP_LLE-testing/Src/main.cpp @@ -261,22 +261,29 @@ void Initialize(void *init) void DSP_StopSoundStream() { - if (!soundStream) - PanicAlert("Can't stop non running SoundStream!"); - soundStream->Stop(); - delete soundStream; - soundStream = NULL; } void Shutdown(void) { - // Check that soundstream already is stopped. - if (soundStream) - PanicAlert("SoundStream alive in DSP::Shutdown!"); + NOTICE_LOG(DSPHLE, "Shutting down DSP plugin"); + + if (soundStream) { + soundStream->Stop(); + delete soundStream; + soundStream = NULL; + } + // Check that soundstream already is stopped. + while (soundStream) { + ERROR_LOG(DSPHLE, "Waiting for sound stream"); + Common::SleepCurrentThread(2000); + } + // Stop the sound recording if (log_ai) g_wave_writer.Stop(); + + INFO_LOG(DSPHLE, "Done shutting down DSP plugin"); } u16 DSP_WriteControlRegister(u16 _uFlag)