Implements sceUsbCamGetMicDataLength.

This commit is contained in:
shenweip 2020-11-23 14:07:11 +08:00
parent c70c8cad6e
commit f2bd0b9f6f
3 changed files with 27 additions and 12 deletions

View file

@ -142,6 +142,10 @@ static int sceUsbCamReadMic(u32 bufAddr, u32 size) {
return __MicInput(size >> 1, config->micParam.frequency, bufAddr, false);
}
static int sceUsbCamGetMicDataLength() {
return Microphone::getReadMicDataLength();
}
static int sceUsbCamSetupVideo(u32 paramAddr, u32 workareaAddr, int wasize) {
if (Memory::IsValidRange(paramAddr, sizeof(PspUsbCamSetupVideoParam))) {
Memory::ReadStruct(paramAddr, &config->videoParam);
@ -251,7 +255,7 @@ const HLEFunction sceUsbCam[] =
{ 0X3DC0088E, &WrapI_UU<sceUsbCamReadMic>, "sceUsbCamReadMic", 'i', "xx" },
{ 0XB048A67D, nullptr, "sceUsbCamWaitReadMicEnd", '?', "" },
{ 0XF8847F60, nullptr, "sceUsbCamPollReadMicEnd", '?', "" },
{ 0X5778B452, nullptr, "sceUsbCamGetMicDataLength", '?', "" },
{ 0X5778B452, &WrapI_V<sceUsbCamGetMicDataLength>, "sceUsbCamGetMicDataLength", 'i', "" },
{ 0X08AEE98A, nullptr, "sceUsbCamSetMicGain", '?', "" },
{ 0X17F7B2FB, &WrapI_UUI<sceUsbCamSetupVideo>, "sceUsbCamSetupVideo", 'i', "xxi" },

View file

@ -50,6 +50,7 @@ std::mutex wtMutex;
bool isNeedInput;
u32 curSampleRate;
u32 curChannels;
u32 readMicDataLength;
int micState; // 0 means stopped, 1 means started, for save state.
static void __UsbMicAudioUpdate(u64 userdata, int cyclesLate) {
@ -72,6 +73,7 @@ static void __UsbMicAudioUpdate(u64 userdata, int cyclesLate) {
DEBUG_LOG(HLE, "sceUsbMic: Waking up thread(%d)", (int)waitingThread.threadID);
__KernelResumeThreadFromWait(threadID, ret);
waitingThreads.erase(waitingThreads.begin() + count);
readMicDataLength += waitingThread.needSize;
} else {
u64 waitTimeus = (waitingThread.needSize - Microphone::availableAudioBufSize()) * 1000000 / 2 / waitingThread.sampleRate;
if(eventUsbMicAudioUpdate == -1)
@ -88,6 +90,7 @@ static void __UsbMicAudioUpdate(u64 userdata, int cyclesLate) {
DEBUG_LOG(HLE, "sceUsbMic: Waking up thread(%d)", (int)waitingThread.threadID);
__KernelResumeThreadFromWait(threadID, ret);
waitingThreads.erase(waitingThreads.begin() + count);
readMicDataLength += waitingThread.needSize;
}
}
++count;
@ -183,6 +186,8 @@ QueueBuf& QueueBuf::operator=(const QueueBuf &buf) {
u32 QueueBuf::push(u8 *buf, u32 size) {
u32 addedSize = 0;
if (size > capacity)
resize(size);
// This will overwrite the old data if the size prepare to add more than remaining size.
std::unique_lock<std::mutex> lock(mutex);
while (end + size > capacity) {
@ -331,13 +336,7 @@ bool Microphone::isHaveDevice() {
}
bool Microphone::isMicStarted() {
#ifdef HAVE_WIN32_MICROPHONE
if(winMic)
return winMic->isStarted();
#elif PPSSPP_PLATFORM(ANDROID)
return audioRecording_State();
#endif
return false;
return micState == 1;
}
// Deprecated.
@ -353,6 +352,10 @@ u32 Microphone::availableAudioBufSize() {
return audioBuf->getAvailableSize();
}
u32 Microphone::getReadMicDataLength() {
return ::readMicDataLength;
}
int Microphone::addAudioData(u8 *buf, u32 size) {
if (audioBuf)
audioBuf->push(buf, size);
@ -400,21 +403,26 @@ u32 __MicInput(u32 maxSamples, u32 sampleRate, u32 bufAddr, bool block) {
if (!audioBuf)
return 0;
readMicDataLength = 0;
numNeedSamples = maxSamples;
if (!Microphone::isMicStarted()) {
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());
memset(tempbuf8, 0, size);
Microphone::getAudioData(tempbuf8, size);
Memory::Memcpy(bufAddr, tempbuf8, size);
delete[] tempbuf8;
}
readMicDataLength += size;
return size;
}
u64 waitTimeus = 0;
if (Microphone::availableAudioBufSize() < size) {
waitTimeus = (size - Microphone::availableAudioBufSize()) * 1000000 / 2 / sampleRate;

View file

@ -65,10 +65,10 @@ namespace Microphone {
int stopMic();
bool isHaveDevice();
bool isMicStarted();
// Deprecated.
bool isNeedInput();
u32 numNeedSamples();
u32 availableAudioBufSize();
u32 getReadMicDataLength();
int addAudioData(u8 *buf, u32 size);
u32 getAudioData(u8 *buf, u32 size);
@ -76,6 +76,9 @@ namespace Microphone {
std::vector<std::string> getDeviceList();
void onMicDeviceChange();
// Deprecated.
bool isNeedInput();
}
u32 __MicInput(u32 maxSamples, u32 sampleRate, u32 bufAddr, bool block = true);