Qt: Fix FPS target and SDL initialization audio issues

This commit is contained in:
Jeffrey Pfau 2014-12-23 21:58:29 -08:00
parent 5b3a2e04b1
commit 280c803305
6 changed files with 31 additions and 13 deletions

View File

@ -33,3 +33,7 @@ AudioProcessor::AudioProcessor(QObject* parent)
void AudioProcessor::setInput(GBAThread* input) { void AudioProcessor::setInput(GBAThread* input) {
m_context = input; m_context = input;
} }
void AudioProcessor::setBufferSamples(int samples) {
m_samples = samples;
}

View File

@ -19,6 +19,7 @@ public:
AudioProcessor(QObject* parent = nullptr); AudioProcessor(QObject* parent = nullptr);
virtual void setInput(GBAThread* input); virtual void setInput(GBAThread* input);
int getBufferSamples() const { return m_samples; }
public slots: public slots:
virtual void start() = 0; virtual void start() = 0;
@ -29,8 +30,10 @@ public slots:
protected: protected:
GBAThread* input() { return m_context; } GBAThread* input() { return m_context; }
private: private:
GBAThread* m_context; GBAThread* m_context;
int m_samples;
}; };
} }

View File

@ -63,6 +63,7 @@ void AudioProcessorQt::pause() {
} }
void AudioProcessorQt::setBufferSamples(int samples) { void AudioProcessorQt::setBufferSamples(int samples) {
AudioProcessor::setBufferSamples(samples);
if (m_audioOutput) { if (m_audioOutput) {
m_audioOutput->stop(); m_audioOutput->stop();
m_audioOutput->setBufferSize(samples * 4); m_audioOutput->setBufferSize(samples * 4);

View File

@ -25,7 +25,9 @@ void AudioProcessorSDL::start() {
if (m_audio.thread) { if (m_audio.thread) {
GBASDLResumeAudio(&m_audio); GBASDLResumeAudio(&m_audio);
} else { } else {
m_audio.samples = input()->audioBuffers; if (!m_audio.samples) {
m_audio.samples = input()->audioBuffers;
}
GBASDLInitAudio(&m_audio, input()); GBASDLInitAudio(&m_audio, input());
} }
} }
@ -35,9 +37,10 @@ void AudioProcessorSDL::pause() {
} }
void AudioProcessorSDL::setBufferSamples(int samples) { void AudioProcessorSDL::setBufferSamples(int samples) {
AudioProcessor::setBufferSamples(samples);
m_audio.samples = samples;
if (m_audio.thread) { if (m_audio.thread) {
GBASDLDeinitAudio(&m_audio); GBASDLDeinitAudio(&m_audio);
m_audio.samples = samples;
GBASDLInitAudio(&m_audio, input()); GBASDLInitAudio(&m_audio, input());
} }
} }

View File

@ -276,23 +276,16 @@ void GameController::keyReleased(int key) {
} }
void GameController::setAudioBufferSamples(int samples) { void GameController::setAudioBufferSamples(int samples) {
if (m_gameOpen) { threadInterrupt();
threadInterrupt(); redoSamples(samples);
float ratio = GBAAudioCalculateRatio(m_threadContext.gba->audio.sampleRate, m_threadContext.fpsTarget, 44100); threadContinue();
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;
}
QMetaObject::invokeMethod(m_audioProcessor, "setBufferSamples", Q_ARG(int, samples)); QMetaObject::invokeMethod(m_audioProcessor, "setBufferSamples", Q_ARG(int, samples));
} }
void GameController::setFPSTarget(float fps) { void GameController::setFPSTarget(float fps) {
threadInterrupt(); threadInterrupt();
m_threadContext.fpsTarget = fps; m_threadContext.fpsTarget = fps;
redoSamples(m_audioProcessor->getBufferSamples());
threadContinue(); threadContinue();
QMetaObject::invokeMethod(m_audioProcessor, "inputParametersChanged"); QMetaObject::invokeMethod(m_audioProcessor, "inputParametersChanged");
} }
@ -375,6 +368,19 @@ void GameController::updateKeys() {
m_threadContext.activeKeys = activeKeys; 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) { void GameController::setLogLevel(int levels) {
threadInterrupt(); threadInterrupt();
m_logLevels = levels; m_logLevels = levels;

View File

@ -109,6 +109,7 @@ private:
private: private:
void updateKeys(); void updateKeys();
void redoSamples(int samples);
uint32_t* m_drawContext; uint32_t* m_drawContext;
GBAThread m_threadContext; GBAThread m_threadContext;