diff --git a/src/platform/qt/AudioProcessor.cpp b/src/platform/qt/AudioProcessor.cpp index 5c7118a4b..f7637f850 100644 --- a/src/platform/qt/AudioProcessor.cpp +++ b/src/platform/qt/AudioProcessor.cpp @@ -33,3 +33,7 @@ AudioProcessor::AudioProcessor(QObject* parent) void AudioProcessor::setInput(GBAThread* input) { m_context = input; } + +void AudioProcessor::setBufferSamples(int samples) { + m_samples = samples; +} diff --git a/src/platform/qt/AudioProcessor.h b/src/platform/qt/AudioProcessor.h index 8f1301732..0f5e82ff7 100644 --- a/src/platform/qt/AudioProcessor.h +++ b/src/platform/qt/AudioProcessor.h @@ -19,6 +19,7 @@ public: AudioProcessor(QObject* parent = nullptr); virtual void setInput(GBAThread* input); + int getBufferSamples() const { return m_samples; } public slots: virtual void start() = 0; @@ -29,8 +30,10 @@ public slots: protected: GBAThread* input() { return m_context; } + private: GBAThread* m_context; + int m_samples; }; } diff --git a/src/platform/qt/AudioProcessorQt.cpp b/src/platform/qt/AudioProcessorQt.cpp index c200be649..72fcdd4c8 100644 --- a/src/platform/qt/AudioProcessorQt.cpp +++ b/src/platform/qt/AudioProcessorQt.cpp @@ -63,6 +63,7 @@ void AudioProcessorQt::pause() { } void AudioProcessorQt::setBufferSamples(int samples) { + AudioProcessor::setBufferSamples(samples); if (m_audioOutput) { m_audioOutput->stop(); m_audioOutput->setBufferSize(samples * 4); diff --git a/src/platform/qt/AudioProcessorSDL.cpp b/src/platform/qt/AudioProcessorSDL.cpp index 4584364f7..75868c4ee 100644 --- a/src/platform/qt/AudioProcessorSDL.cpp +++ b/src/platform/qt/AudioProcessorSDL.cpp @@ -25,7 +25,9 @@ void AudioProcessorSDL::start() { if (m_audio.thread) { GBASDLResumeAudio(&m_audio); } else { - m_audio.samples = input()->audioBuffers; + if (!m_audio.samples) { + m_audio.samples = input()->audioBuffers; + } GBASDLInitAudio(&m_audio, input()); } } @@ -35,9 +37,10 @@ void AudioProcessorSDL::pause() { } void AudioProcessorSDL::setBufferSamples(int samples) { + AudioProcessor::setBufferSamples(samples); + m_audio.samples = samples; if (m_audio.thread) { GBASDLDeinitAudio(&m_audio); - m_audio.samples = samples; GBASDLInitAudio(&m_audio, input()); } } diff --git a/src/platform/qt/GameController.cpp b/src/platform/qt/GameController.cpp index 420a2a054..edc529d06 100644 --- a/src/platform/qt/GameController.cpp +++ b/src/platform/qt/GameController.cpp @@ -276,23 +276,16 @@ void GameController::keyReleased(int key) { } void GameController::setAudioBufferSamples(int samples) { - if (m_gameOpen) { - threadInterrupt(); - float ratio = GBAAudioCalculateRatio(m_threadContext.gba->audio.sampleRate, m_threadContext.fpsTarget, 44100); - m_threadContext.audioBuffers = samples / ratio; - GBAAudioResizeBuffer(&m_threadContext.gba->audio, samples / ratio); - threadContinue(); - } else { - float ratio = GBAAudioCalculateRatio(0x8000, m_threadContext.fpsTarget, 44100); - m_threadContext.audioBuffers = samples / ratio; - - } + threadInterrupt(); + redoSamples(samples); + threadContinue(); QMetaObject::invokeMethod(m_audioProcessor, "setBufferSamples", Q_ARG(int, samples)); } void GameController::setFPSTarget(float fps) { threadInterrupt(); m_threadContext.fpsTarget = fps; + redoSamples(m_audioProcessor->getBufferSamples()); threadContinue(); QMetaObject::invokeMethod(m_audioProcessor, "inputParametersChanged"); } @@ -375,6 +368,19 @@ void GameController::updateKeys() { m_threadContext.activeKeys = activeKeys; } +void GameController::redoSamples(int samples) { + float sampleRate = 0x8000; + float ratio; + if (m_threadContext.gba) { + sampleRate = m_threadContext.gba->audio.sampleRate; + } + ratio = GBAAudioCalculateRatio(sampleRate, m_threadContext.fpsTarget, 44100); + m_threadContext.audioBuffers = ceil(samples / ratio); + if (m_threadContext.gba) { + GBAAudioResizeBuffer(&m_threadContext.gba->audio, m_threadContext.audioBuffers); + } +} + void GameController::setLogLevel(int levels) { threadInterrupt(); m_logLevels = levels; diff --git a/src/platform/qt/GameController.h b/src/platform/qt/GameController.h index b4b1d55c8..1375c091c 100644 --- a/src/platform/qt/GameController.h +++ b/src/platform/qt/GameController.h @@ -109,6 +109,7 @@ private: private: void updateKeys(); + void redoSamples(int samples); uint32_t* m_drawContext; GBAThread m_threadContext;