Vita: Fix audio resampling after GBA fix

This commit is contained in:
Vicki Pfau 2024-04-27 18:55:18 -07:00
parent 5e581b0ade
commit 4aba51e955
1 changed files with 21 additions and 2 deletions

View File

@ -54,6 +54,7 @@ static int currentTex;
static vita2d_texture* tex[2]; static vita2d_texture* tex[2];
static vita2d_texture* screenshot; static vita2d_texture* screenshot;
static Thread audioThread; static Thread audioThread;
static double fpsRatio = 1;
static bool interframeBlending = false; static bool interframeBlending = false;
static bool sgbCrop = false; static bool sgbCrop = false;
static bool blurry = false; static bool blurry = false;
@ -266,6 +267,20 @@ static void _postAudioBuffer(struct mAVStream* stream, struct mAudioBuffer* buf)
MutexUnlock(&audioContext.mutex); MutexUnlock(&audioContext.mutex);
} }
static void _audioRateChanged(struct mAVStream* stream, unsigned sampleRate) {
UNUSED(stream);
if (!sampleRate) {
return;
}
if (!audioContext.resampler.source || !audioContext.resampler.destination) {
return;
}
MutexLock(&audioContext.mutex);
mAudioResamplerProcess(&audioContext.resampler);
mAudioResamplerSetSource(&audioContext.resampler, audioContext.resampler.source, sampleRate / fpsRatio, true);
MutexUnlock(&audioContext.mutex);
}
uint16_t mPSP2PollInput(struct mGUIRunner* runner) { uint16_t mPSP2PollInput(struct mGUIRunner* runner) {
SceCtrlData pad; SceCtrlData pad;
sceCtrlPeekBufferPositiveExt2(0, &pad, 1); sceCtrlPeekBufferPositiveExt2(0, &pad, 1);
@ -364,6 +379,7 @@ void mPSP2Setup(struct mGUIRunner* runner) {
stream.postAudioFrame = NULL; stream.postAudioFrame = NULL;
stream.postAudioBuffer = _postAudioBuffer; stream.postAudioBuffer = _postAudioBuffer;
stream.postVideoFrame = NULL; stream.postVideoFrame = NULL;
stream.audioRateChanged = _audioRateChanged;
runner->core->setAVStream(runner->core, &stream); runner->core->setAVStream(runner->core, &stream);
frameLimiter = true; frameLimiter = true;
@ -423,10 +439,13 @@ void mPSP2LoadROM(struct mGUIRunner* runner) {
float rate = 60.0f / 1.001f; float rate = 60.0f / 1.001f;
sceDisplayGetRefreshRate(&rate); sceDisplayGetRefreshRate(&rate);
double ratio = mCoreCalculateFramerateRatio(runner->core, rate); fpsRatio = mCoreCalculateFramerateRatio(runner->core, rate);
unsigned sampleRate = runner->core->audioSampleRate(runner->core); unsigned sampleRate = runner->core->audioSampleRate(runner->core);
if (!sampleRate) {
sampleRate = 32768;
}
mAudioBufferClear(&audioContext.buffer); mAudioBufferClear(&audioContext.buffer);
mAudioResamplerSetSource(&audioContext.resampler, runner->core->getAudioBuffer(runner->core), sampleRate / ratio, true); mAudioResamplerSetSource(&audioContext.resampler, runner->core->getAudioBuffer(runner->core), sampleRate / fpsRatio, true);
ThreadCreate(&audioThread, _audioThread, &audioContext); ThreadCreate(&audioThread, _audioThread, &audioContext);
} }