Makes a distinction between blocking and non blocking modes.

This commit is contained in:
shenweip 2020-11-22 02:06:15 +08:00
parent aac4cbb1dc
commit c70c8cad6e
4 changed files with 17 additions and 7 deletions

View file

@ -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) {

View file

@ -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) {

View file

@ -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<u32> *param = new std::vector<u32>({ 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[] =

View file

@ -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);