mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-20 17:59:08 +02:00
A non-blocking sceAudioInput keeps filling its buffer from the host capture after it returns, but WaitInputEnd and PollInputEnd reported it done at once, so a game that reads the buffer right after the wait (FTB2's voice chat) got nothing. WaitInputEnd now blocks like the blocking input path, and PollInputEnd returns 1 until the buffer is full. Both pad with silence after the same 100 ms of host jitter, so a stalled device cannot hang the game.
94 lines
2.2 KiB
C++
94 lines
2.2 KiB
C++
// Copyright (c) 2019- PPSSPP Project.
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, version 2.0 or later versions.
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License 2.0 for more details.
|
|
|
|
// A copy of the GPL 2.0 should have been included with the program.
|
|
// If not, see http://www.gnu.org/licenses/
|
|
|
|
// Official git repository and contact information can be found at
|
|
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
|
|
|
#pragma once
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "sceKernel.h"
|
|
|
|
void Register_sceUsbMic();
|
|
|
|
void __UsbMicInit();
|
|
void __UsbMicShutdown();
|
|
void __UsbMicDoState(PointerWrap &p);
|
|
|
|
enum MICTYPE {
|
|
AUDIOINPUT,
|
|
USBMIC,
|
|
CAMERAMIC
|
|
};
|
|
|
|
struct MicWaitInfo {
|
|
SceUID threadID;
|
|
u32 addr;
|
|
int needSize;
|
|
u32 sampleRate;
|
|
};
|
|
|
|
class QueueBuf {
|
|
public:
|
|
QueueBuf(int size);
|
|
~QueueBuf();
|
|
|
|
QueueBuf(const QueueBuf &buf) = delete;
|
|
QueueBuf& operator=(const QueueBuf &buf) = delete;
|
|
|
|
int push(const u8 *buf, int size);
|
|
int pop(u8 *buf, int size);
|
|
void resize(int newSize);
|
|
void flush();
|
|
int getAvailableSize() const {
|
|
return available;
|
|
}
|
|
int getRemainingSize() const;
|
|
int getStartPos() const;
|
|
int getCapacity() const {
|
|
return capacity;
|
|
}
|
|
|
|
private:
|
|
int available = 0;
|
|
int end = 0;
|
|
int capacity; // set in constructor
|
|
u8 *buf_;
|
|
};
|
|
|
|
namespace Microphone {
|
|
int startMic();
|
|
int stopMic();
|
|
bool isHaveDevice();
|
|
bool isMicStarted();
|
|
int numNeedSamples();
|
|
int availableAudioBufSize();
|
|
int getReadMicDataLength();
|
|
|
|
int addAudioData(u8 *buf, int size);
|
|
int getAudioData(u8 *buf, int size);
|
|
void flushAudioData();
|
|
|
|
std::vector<std::string> getDeviceList();
|
|
void onMicDeviceChange();
|
|
}
|
|
|
|
u32 __MicInput(u32 maxSamples, u32 sampleRate, u32 bufAddr, MICTYPE type, bool block = true);
|
|
// Finish a non-blocking __MicInput. Wait blocks the thread until the buffer is full and
|
|
// returns whether it had to; Poll returns 1 while the buffer is not full yet.
|
|
bool __MicWaitInputEnd();
|
|
u32 __MicPollInputEnd();
|