diff --git a/Core/HLE/sceAudio.cpp b/Core/HLE/sceAudio.cpp index aa247385d4..0ef9583e1a 100644 --- a/Core/HLE/sceAudio.cpp +++ b/Core/HLE/sceAudio.cpp @@ -474,7 +474,7 @@ static u32 sceAudioSRCOutputBlocking(u32 vol, u32 buf) { static int sceAudioInputBlocking(u32 maxSamples, u32 sampleRate, u32 bufAddr) { ERROR_LOG(HLE, "UNIMPL sceAudioInputBlocking: maxSamples: %d, samplerate: %d, bufAddr: %08x", maxSamples, sampleRate, bufAddr); - return __MicInputBlocking(maxSamples, sampleRate, bufAddr); + return __MicInput(maxSamples, sampleRate, bufAddr); } static u32 sceAudioRoutingSetMode(u32 mode) { diff --git a/Core/HLE/sceUsbCam.cpp b/Core/HLE/sceUsbCam.cpp index c6dccd6796..e391f52457 100644 --- a/Core/HLE/sceUsbCam.cpp +++ b/Core/HLE/sceUsbCam.cpp @@ -134,12 +134,12 @@ static int sceUsbCamStopMic() { static int sceUsbCamReadMicBlocking(u32 bufAddr, u32 size) { INFO_LOG(HLE, "UNIMPL sceUsbCamReadMicBlocking: size: %d", size); - return __MicInputBlocking(size >> 1, config->micParam.frequency, bufAddr); + return __MicInput(size >> 1, config->micParam.frequency, bufAddr); } static int sceUsbCamReadMic(u32 bufAddr, u32 size) { INFO_LOG(HLE, "UNIMPL sceUsbCamReadMic: size: %d", size); - return __MicInputBlocking(size >> 1, config->micParam.frequency, bufAddr); + return __MicInput(size >> 1, config->micParam.frequency, bufAddr, false); } static int sceUsbCamSetupVideo(u32 paramAddr, u32 workareaAddr, int wasize) { diff --git a/Core/HLE/sceUsbMic.cpp b/Core/HLE/sceUsbMic.cpp index d3f2075dd9..3248a70225 100644 --- a/Core/HLE/sceUsbMic.cpp +++ b/Core/HLE/sceUsbMic.cpp @@ -267,7 +267,7 @@ static int sceUsbMicInputBlocking(u32 maxSamples, u32 sampleRate, u32 bufAddr) { } curSampleRate = sampleRate; curChannels = 1; - return __MicInputBlocking(maxSamples, sampleRate, bufAddr); + return __MicInput(maxSamples, sampleRate, bufAddr); } static int sceUsbMicInputInitEx(u32 paramAddr) { @@ -390,7 +390,7 @@ void Microphone::onMicDeviceChange() { } } -u32 __MicInputBlocking(u32 maxSamples, u32 sampleRate, u32 bufAddr) { +u32 __MicInput(u32 maxSamples, u32 sampleRate, u32 bufAddr, bool block) { u32 size = maxSamples << 1; if (!audioBuf) { audioBuf = new QueueBuf(size); @@ -405,6 +405,16 @@ u32 __MicInputBlocking(u32 maxSamples, u32 sampleRate, u32 bufAddr) { std::vector *param = new std::vector({ sampleRate, 1 }); Microphone::startMic(param); } + if (!block) { + size = Microphone::availableAudioBufSize(); + if (size > 0) { + u8 *tempbuf8 = new u8[size]; + Microphone::getAudioData(tempbuf8, Microphone::availableAudioBufSize()); + Memory::Memcpy(bufAddr, tempbuf8, size); + delete[] tempbuf8; + } + return size; + } u64 waitTimeus = 0; if (Microphone::availableAudioBufSize() < size) { waitTimeus = (size - Microphone::availableAudioBufSize()) * 1000000 / 2 / sampleRate; @@ -419,7 +429,7 @@ u32 __MicInputBlocking(u32 maxSamples, u32 sampleRate, u32 bufAddr) { DEBUG_LOG(HLE, "MicInputBlocking: blocking thread(%d)", (int)__KernelGetCurThread()); __KernelWaitCurThread(WAITTYPE_MICINPUT, 1, size, 0, false, "blocking microphone"); - return maxSamples; + return size; } const HLEFunction sceUsbMic[] = diff --git a/Core/HLE/sceUsbMic.h b/Core/HLE/sceUsbMic.h index cd71c0d1c2..42d4d6ec53 100644 --- a/Core/HLE/sceUsbMic.h +++ b/Core/HLE/sceUsbMic.h @@ -78,4 +78,4 @@ namespace Microphone { void onMicDeviceChange(); } -u32 __MicInputBlocking(u32 maxSamples, u32 sampleRate, u32 bufAddr); +u32 __MicInput(u32 maxSamples, u32 sampleRate, u32 bufAddr, bool block = true);