Qt: Fix thread sync issues with QtMultimedia audio driver

This commit is contained in:
Jeffrey Pfau 2015-02-21 02:44:59 -08:00
parent 56475e578b
commit 37fd51df39
2 changed files with 3 additions and 1 deletions

View File

@ -34,6 +34,7 @@ void AudioDevice::setFormat(const QAudioFormat& format) {
GBASyncLockAudio(&m_context->sync); GBASyncLockAudio(&m_context->sync);
blip_set_rates(m_context->gba->audio.left, GBA_ARM7TDMI_FREQUENCY, format.sampleRate() * fauxClock); blip_set_rates(m_context->gba->audio.left, GBA_ARM7TDMI_FREQUENCY, format.sampleRate() * fauxClock);
blip_set_rates(m_context->gba->audio.right, GBA_ARM7TDMI_FREQUENCY, format.sampleRate() * fauxClock); blip_set_rates(m_context->gba->audio.right, GBA_ARM7TDMI_FREQUENCY, format.sampleRate() * fauxClock);
GBASyncUnlockAudio(&m_context->sync);
#endif #endif
} }
@ -53,6 +54,7 @@ qint64 AudioDevice::readData(char* data, qint64 maxSize) {
#if RESAMPLE_LIBRARY == RESAMPLE_NN #if RESAMPLE_LIBRARY == RESAMPLE_NN
return GBAAudioResampleNN(&m_context->gba->audio, m_ratio, &m_drift, reinterpret_cast<GBAStereoSample*>(data), maxSize / sizeof(GBAStereoSample)) * sizeof(GBAStereoSample); return GBAAudioResampleNN(&m_context->gba->audio, m_ratio, &m_drift, reinterpret_cast<GBAStereoSample*>(data), maxSize / sizeof(GBAStereoSample)) * sizeof(GBAStereoSample);
#elif RESAMPLE_LIBRARY == RESAMPLE_BLIP_BUF #elif RESAMPLE_LIBRARY == RESAMPLE_BLIP_BUF
GBASyncLockAudio(&m_context->sync);
int available = blip_samples_avail(m_context->gba->audio.left); int available = blip_samples_avail(m_context->gba->audio.left);
if (available > maxSize / sizeof(GBAStereoSample)) { if (available > maxSize / sizeof(GBAStereoSample)) {
available = maxSize / sizeof(GBAStereoSample); available = maxSize / sizeof(GBAStereoSample);

View File

@ -461,7 +461,7 @@ void GameController::clearAVStream() {
} }
void GameController::reloadAudioDriver() { void GameController::reloadAudioDriver() {
m_audioProcessor->pause(); QMetaObject::invokeMethod(m_audioProcessor, "pause", Qt::BlockingQueuedConnection);
delete m_audioProcessor; delete m_audioProcessor;
m_audioProcessor = AudioProcessor::create(); m_audioProcessor = AudioProcessor::create();
m_audioProcessor->moveToThread(m_audioThread); m_audioProcessor->moveToThread(m_audioThread);