mirror of https://github.com/mgba-emu/mgba.git
Core: Put back fpsTarget
This commit is contained in:
parent
ce085623de
commit
13f1ab5ab8
|
@ -190,5 +190,6 @@ void mCoreLoadForeignConfig(struct mCore* core, const struct mCoreConfig* config
|
|||
#ifndef MINIMAL_CORE
|
||||
mDirectorySetMapOptions(&core->dirs, &core->opts);
|
||||
#endif
|
||||
core->setAudioBufferSize(core, core->opts.audioBuffers);
|
||||
core->loadConfig(core, config);
|
||||
}
|
||||
|
|
|
@ -55,6 +55,7 @@ struct mCore {
|
|||
|
||||
struct blip_t* (*getAudioChannel)(struct mCore*, int ch);
|
||||
void (*setAudioBufferSize)(struct mCore*, size_t samples);
|
||||
size_t (*getAudioBufferSize)(struct mCore*);
|
||||
|
||||
void (*setAVStream)(struct mCore*, struct mAVStream*);
|
||||
|
||||
|
|
|
@ -21,6 +21,8 @@ struct mCoreSync {
|
|||
bool audioWait;
|
||||
Condition audioRequiredCond;
|
||||
Mutex audioBufferMutex;
|
||||
|
||||
float fpsTarget;
|
||||
};
|
||||
|
||||
void mCoreSyncPostFrame(struct mCoreSync* sync);
|
||||
|
|
|
@ -15,6 +15,8 @@
|
|||
|
||||
#ifndef DISABLE_THREADING
|
||||
|
||||
static const float _defaultFPSTarget = 60.f;
|
||||
|
||||
#ifdef USE_PTHREADS
|
||||
static pthread_key_t _contextKey;
|
||||
static pthread_once_t _contextOnce = PTHREAD_ONCE_INIT;
|
||||
|
@ -163,6 +165,10 @@ bool mCoreThreadStart(struct mCoreThread* threadContext) {
|
|||
threadContext->state = THREAD_INITIALIZED;
|
||||
threadContext->logger.p = threadContext;
|
||||
|
||||
if (!threadContext->sync.fpsTarget) {
|
||||
threadContext->sync.fpsTarget = _defaultFPSTarget;
|
||||
}
|
||||
|
||||
MutexInit(&threadContext->stateMutex);
|
||||
ConditionInit(&threadContext->stateCond);
|
||||
|
||||
|
@ -184,6 +190,7 @@ bool mCoreThreadStart(struct mCoreThread* threadContext) {
|
|||
|
||||
threadContext->sync.audioWait = threadContext->core->opts.audioSync;
|
||||
threadContext->sync.videoFrameWait = threadContext->core->opts.videoSync;
|
||||
threadContext->sync.fpsTarget = threadContext->core->opts.fpsTarget;
|
||||
|
||||
MutexLock(&threadContext->stateMutex);
|
||||
ThreadCreate(&threadContext->thread, _mCoreThreadRun, threadContext);
|
||||
|
|
|
@ -101,6 +101,11 @@ static void _GBCoreSetAudioBufferSize(struct mCore* core, size_t samples) {
|
|||
GBAudioResizeBuffer(&gb->audio, samples);
|
||||
}
|
||||
|
||||
static size_t _GBCoreGetAudioBufferSize(struct mCore* core) {
|
||||
struct GB* gb = core->board;
|
||||
return gb->audio.samples;
|
||||
}
|
||||
|
||||
static void _GBCoreSetAVStream(struct mCore* core, struct mAVStream* stream) {
|
||||
// TODO
|
||||
}
|
||||
|
@ -231,6 +236,7 @@ struct mCore* GBCoreCreate(void) {
|
|||
core->getVideoBuffer = _GBCoreGetVideoBuffer;
|
||||
core->getAudioChannel = _GBCoreGetAudioChannel;
|
||||
core->setAudioBufferSize = _GBCoreSetAudioBufferSize;
|
||||
core->getAudioBufferSize = _GBCoreGetAudioBufferSize;
|
||||
core->setAVStream = _GBCoreSetAVStream;
|
||||
core->isROM = GBIsROM;
|
||||
core->loadROM = _GBCoreLoadROM;
|
||||
|
|
|
@ -132,6 +132,11 @@ static void _GBACoreSetAudioBufferSize(struct mCore* core, size_t samples) {
|
|||
GBAAudioResizeBuffer(&gba->audio, samples);
|
||||
}
|
||||
|
||||
static size_t _GBACoreGetAudioBufferSize(struct mCore* core) {
|
||||
struct GBA* gba = core->board;
|
||||
return gba->audio.samples;
|
||||
}
|
||||
|
||||
static void _GBACoreSetAVStream(struct mCore* core, struct mAVStream* stream) {
|
||||
struct GBA* gba = core->board;
|
||||
gba->stream = stream;
|
||||
|
@ -267,6 +272,7 @@ struct mCore* GBACoreCreate(void) {
|
|||
core->getVideoBuffer = _GBACoreGetVideoBuffer;
|
||||
core->getAudioChannel = _GBACoreGetAudioChannel;
|
||||
core->setAudioBufferSize = _GBACoreSetAudioBufferSize;
|
||||
core->getAudioBufferSize = _GBACoreGetAudioBufferSize;
|
||||
core->setAVStream = _GBACoreSetAVStream;
|
||||
core->isROM = GBAIsROM;
|
||||
core->loadROM = _GBACoreLoadROM;
|
||||
|
|
|
@ -18,8 +18,6 @@ using namespace QGBA;
|
|||
AudioDevice::AudioDevice(QObject* parent)
|
||||
: QIODevice(parent)
|
||||
, m_context(nullptr)
|
||||
, m_drift(0)
|
||||
, m_ratio(1.f)
|
||||
{
|
||||
setOpenMode(ReadOnly);
|
||||
}
|
||||
|
@ -29,10 +27,12 @@ void AudioDevice::setFormat(const QAudioFormat& format) {
|
|||
LOG(QT, INFO) << tr("Can't set format of context-less audio device");
|
||||
return;
|
||||
}
|
||||
double fauxClock = GBAAudioCalculateRatio(1, 60, 1); // TODO: Put back fpsTarget
|
||||
double fauxClock = GBAAudioCalculateRatio(1, m_context->sync.fpsTarget, 1);
|
||||
mCoreSyncLockAudio(&m_context->sync);
|
||||
blip_set_rates(m_context->core->getAudioChannel(m_context->core, 0), GBA_ARM7TDMI_FREQUENCY, format.sampleRate() * fauxClock);
|
||||
blip_set_rates(m_context->core->getAudioChannel(m_context->core, 1), GBA_ARM7TDMI_FREQUENCY, format.sampleRate() * fauxClock);
|
||||
blip_set_rates(m_context->core->getAudioChannel(m_context->core, 0),
|
||||
m_context->core->frequency(m_context->core), format.sampleRate() * fauxClock);
|
||||
blip_set_rates(m_context->core->getAudioChannel(m_context->core, 1),
|
||||
m_context->core->frequency(m_context->core), format.sampleRate() * fauxClock);
|
||||
mCoreSyncUnlockAudio(&m_context->sync);
|
||||
}
|
||||
|
||||
|
@ -41,8 +41,8 @@ void AudioDevice::setInput(mCoreThread* input) {
|
|||
}
|
||||
|
||||
qint64 AudioDevice::readData(char* data, qint64 maxSize) {
|
||||
if (maxSize > 0xFFFFFFFF) {
|
||||
maxSize = 0xFFFFFFFF;
|
||||
if (maxSize > 0xFFFFFFFFLL) {
|
||||
maxSize = 0xFFFFFFFFLL;
|
||||
}
|
||||
|
||||
if (!m_context->core) {
|
||||
|
|
|
@ -28,8 +28,6 @@ protected:
|
|||
|
||||
private:
|
||||
mCoreThread* m_context;
|
||||
float m_drift;
|
||||
float m_ratio;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -59,7 +59,7 @@ bool AudioProcessorQt::start() {
|
|||
|
||||
m_device->setInput(input());
|
||||
m_device->setFormat(m_audioOutput->format());
|
||||
m_audioOutput->setBufferSize(2048 * 4); // TODO?
|
||||
m_audioOutput->setBufferSize(input()->core->getAudioBufferSize(input()->core) * 4);
|
||||
|
||||
m_audioOutput->start(m_device);
|
||||
return m_audioOutput->state() == QAudio::ActiveState;
|
||||
|
|
|
@ -101,7 +101,7 @@ GameController::GameController(QObject* parent)
|
|||
gba->video.renderer->disableBG[2] = !controller->m_videoLayers[2];
|
||||
gba->video.renderer->disableBG[3] = !controller->m_videoLayers[3];
|
||||
gba->video.renderer->disableOBJ = !controller->m_videoLayers[4];*/
|
||||
// TODO: Put back fpsTarget
|
||||
controller->m_fpsTarget = context->sync.fpsTarget;
|
||||
|
||||
if (mCoreLoadState(context->core, 0, controller->m_loadStateFlags)) {
|
||||
mCoreDeleteState(context->core, 0);
|
||||
|
@ -239,6 +239,7 @@ void GameController::setConfig(const mCoreConfig* config) {
|
|||
if (isLoaded()) {
|
||||
threadInterrupt();
|
||||
mCoreLoadForeignConfig(m_threadContext.core, config);
|
||||
m_audioProcessor->setInput(&m_threadContext);
|
||||
threadContinue();
|
||||
}
|
||||
}
|
||||
|
@ -680,9 +681,9 @@ void GameController::setVideoLayerEnabled(int layer, bool enable) {
|
|||
void GameController::setFPSTarget(float fps) {
|
||||
threadInterrupt();
|
||||
m_fpsTarget = fps;
|
||||
// TODO: Put back fpsTarget
|
||||
m_threadContext.sync.fpsTarget = fps;
|
||||
if (m_turbo && m_turboSpeed > 0) {
|
||||
// TODO: Put back fpsTarget
|
||||
m_threadContext.sync.fpsTarget *= m_turboSpeed;
|
||||
}
|
||||
if (m_audioProcessor) {
|
||||
redoSamples(m_audioProcessor->getBufferSamples());
|
||||
|
@ -805,15 +806,15 @@ void GameController::setTurboSpeed(float ratio) {
|
|||
void GameController::enableTurbo() {
|
||||
threadInterrupt();
|
||||
if (!m_turbo) {
|
||||
// TODO: Put back fpsTarget
|
||||
m_threadContext.sync.fpsTarget = m_fpsTarget;
|
||||
m_threadContext.sync.audioWait = m_audioSync;
|
||||
m_threadContext.sync.videoFrameWait = m_videoSync;
|
||||
} else if (m_turboSpeed <= 0) {
|
||||
// TODO: Put back fpsTarget
|
||||
m_threadContext.sync.fpsTarget = m_fpsTarget;
|
||||
m_threadContext.sync.audioWait = false;
|
||||
m_threadContext.sync.videoFrameWait = false;
|
||||
} else {
|
||||
// TODO: Put back fpsTarget
|
||||
m_threadContext.sync.fpsTarget = m_fpsTarget * m_turboSpeed;
|
||||
m_threadContext.sync.audioWait = true;
|
||||
m_threadContext.sync.videoFrameWait = false;
|
||||
}
|
||||
|
@ -927,7 +928,6 @@ void GameController::updateKeys() {
|
|||
}
|
||||
|
||||
void GameController::redoSamples(int samples) {
|
||||
// TODO: Put back audio buffers
|
||||
if (m_threadContext.core) {
|
||||
m_threadContext.core->setAudioBufferSize(m_threadContext.core, samples);
|
||||
}
|
||||
|
|
|
@ -38,15 +38,8 @@ bool mSDLInitAudio(struct mSDLAudio* context, struct GBAThread* threadContext) {
|
|||
}
|
||||
context->samples = context->obtainedSpec.samples;
|
||||
context->core = 0;
|
||||
context->thread = 0;
|
||||
|
||||
if (threadContext) {
|
||||
context->thread = threadContext;
|
||||
float ratio = GBAAudioCalculateRatio(0x8000, threadContext->fpsTarget, 44100);
|
||||
threadContext->audioBuffers = context->samples / ratio;
|
||||
if (context->samples > threadContext->audioBuffers) {
|
||||
threadContext->audioBuffers = context->samples * 2;
|
||||
}
|
||||
context->sync = &threadContext->sync;
|
||||
|
||||
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||
|
@ -91,7 +84,7 @@ void mSDLResumeAudio(struct mSDLAudio* context) {
|
|||
|
||||
static void _mSDLAudioCallback(void* context, Uint8* data, int len) {
|
||||
struct mSDLAudio* audioContext = context;
|
||||
if (!context || (!audioContext->core && !audioContext->thread)) {
|
||||
if (!context || !audioContext->core) {
|
||||
memset(data, 0, len);
|
||||
return;
|
||||
}
|
||||
|
@ -102,16 +95,12 @@ static void _mSDLAudioCallback(void* context, Uint8* data, int len) {
|
|||
left = audioContext->core->getAudioChannel(audioContext->core, 0);
|
||||
right = audioContext->core->getAudioChannel(audioContext->core, 1);
|
||||
clockRate = audioContext->core->frequency(audioContext->core);
|
||||
} else if (audioContext->thread) {
|
||||
left = audioContext->thread->gba->audio.psg.left;
|
||||
right = audioContext->thread->gba->audio.psg.right;
|
||||
clockRate = GBA_ARM7TDMI_FREQUENCY;
|
||||
}
|
||||
double fauxClock = 1;
|
||||
if (audioContext->thread) {
|
||||
fauxClock = GBAAudioCalculateRatio(1, audioContext->thread->fpsTarget, 1);
|
||||
}
|
||||
if (audioContext->sync) {
|
||||
if (audioContext->sync->fpsTarget > 0) {
|
||||
fauxClock = GBAAudioCalculateRatio(1, audioContext->sync->fpsTarget, 1);
|
||||
}
|
||||
mCoreSyncLockAudio(audioContext->sync);
|
||||
}
|
||||
blip_set_rates(left, clockRate, audioContext->obtainedSpec.freq * fauxClock);
|
||||
|
|
Loading…
Reference in New Issue