This commit is contained in:
DanielSvoboda 2025-07-15 23:23:15 -03:00
parent 84e8c2c884
commit 2116c1dae4
4 changed files with 34 additions and 23 deletions

View File

@ -97,9 +97,15 @@ int PS4_SYSV_ABI sceAudioInGetSilentState() {
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI sceAudioInHqOpen() { int PS4_SYSV_ABI sceAudioInHqOpen(Libraries::UserService::OrbisUserServiceUserId userId, u32 type,
LOG_ERROR(Lib_AudioIn, "(STUBBED) called"); u32 index, u32 len, u32 freq, u32 param) {
return ORBIS_OK; LOG_ERROR(Lib_AudioIn, "called");
int result = audio->AudioInOpen(type, len, freq, param);
if (result == -1) {
LOG_ERROR(Lib_AudioOut, "Audio ports are full");
return 0x80260005;
}
return result;
} }
int PS4_SYSV_ABI sceAudioInHqOpenEx() { int PS4_SYSV_ABI sceAudioInHqOpenEx() {
@ -128,13 +134,13 @@ int PS4_SYSV_ABI sceAudioInIsSharedDevice() {
int PS4_SYSV_ABI sceAudioInOpen(Libraries::UserService::OrbisUserServiceUserId userId, u32 type, int PS4_SYSV_ABI sceAudioInOpen(Libraries::UserService::OrbisUserServiceUserId userId, u32 type,
u32 index, u32 len, u32 freq, u32 param) { u32 index, u32 len, u32 freq, u32 param) {
LOG_ERROR(Lib_AudioIn, "called");
int result = audio->AudioInOpen(type, len, freq, param); int result = audio->AudioInOpen(type, len, freq, param);
if (result == -1) { if (result == -1) {
LOG_ERROR(Lib_AudioOut, "Audio ports are full"); LOG_ERROR(Lib_AudioOut, "Audio ports are full");
return 0x80260005; return 0x80260005;
} }
return result; return result;
LOG_ERROR(Lib_AudioIn, "called");
} }
int PS4_SYSV_ABI sceAudioInOpenEx() { int PS4_SYSV_ABI sceAudioInOpenEx() {

View File

@ -33,7 +33,8 @@ int PS4_SYSV_ABI sceAudioInGetGain();
int PS4_SYSV_ABI sceAudioInGetHandleStatusInfo(); int PS4_SYSV_ABI sceAudioInGetHandleStatusInfo();
int PS4_SYSV_ABI sceAudioInGetRerouteCount(); int PS4_SYSV_ABI sceAudioInGetRerouteCount();
int PS4_SYSV_ABI sceAudioInGetSilentState(); int PS4_SYSV_ABI sceAudioInGetSilentState();
int PS4_SYSV_ABI sceAudioInHqOpen(); int PS4_SYSV_ABI sceAudioInHqOpen(Libraries::UserService::OrbisUserServiceUserId userId, u32 type,
u32 index, u32 len, u32 freq, u32 param);
int PS4_SYSV_ABI sceAudioInHqOpenEx(); int PS4_SYSV_ABI sceAudioInHqOpenEx();
int PS4_SYSV_ABI sceAudioInInit(); int PS4_SYSV_ABI sceAudioInInit();
int PS4_SYSV_ABI sceAudioInInput(s32 handle, void* dest); int PS4_SYSV_ABI sceAudioInInput(s32 handle, void* dest);

View File

@ -9,10 +9,9 @@ int SDLAudioIn::AudioInit() {
} }
int SDLAudioIn::AudioInOpen(int type, uint32_t samples_num, uint32_t freq, uint32_t format) { int SDLAudioIn::AudioInOpen(int type, uint32_t samples_num, uint32_t freq, uint32_t format) {
using Libraries::AudioIn::OrbisAudioInParam;
std::scoped_lock lock{m_mutex}; std::scoped_lock lock{m_mutex};
for (int id = 0; id < portsIn.size(); id++) { for (int id = 0; id < static_cast<int>(portsIn.size()); ++id) {
auto& port = portsIn[id]; auto& port = portsIn[id];
if (!port.isOpen) { if (!port.isOpen) {
port.isOpen = true; port.isOpen = true;
@ -23,12 +22,12 @@ int SDLAudioIn::AudioInOpen(int type, uint32_t samples_num, uint32_t freq, uint3
SDL_AudioFormat sampleFormat; SDL_AudioFormat sampleFormat;
switch (format) { switch (format) {
case 0: case Libraries::AudioIn::ORBIS_AUDIO_IN_PARAM_FORMAT_S16_MONO:
sampleFormat = SDL_AUDIO_S16; sampleFormat = SDL_AUDIO_S16;
port.channels_num = 1; port.channels_num = 1;
port.sample_size = 2; port.sample_size = 2;
break; break;
case 2: case Libraries::AudioIn::ORBIS_AUDIO_IN_PARAM_FORMAT_S16_STEREO:
sampleFormat = SDL_AUDIO_S16; sampleFormat = SDL_AUDIO_S16;
port.channels_num = 2; port.channels_num = 2;
port.sample_size = 2; port.sample_size = 2;
@ -48,26 +47,31 @@ int SDLAudioIn::AudioInOpen(int type, uint32_t samples_num, uint32_t freq, uint3
nullptr, nullptr); nullptr, nullptr);
if (!port.stream) { if (!port.stream) {
port.isOpen = false; port.isOpen = false;
return -1; return ORBIS_AUDIO_IN_ERROR_INVALID_PORT;
}
if (SDL_ResumeAudioStreamDevice(port.stream) == false) {
SDL_DestroyAudioStream(port.stream);
port = {};
return ORBIS_AUDIO_IN_ERROR_STREAM_FAIL;
} }
SDL_ResumeAudioDevice(SDL_GetAudioStreamDevice(port.stream));
return id + 1; return id + 1;
} }
} }
return -1; return ORBIS_AUDIO_IN_ERROR_INVALID_PORT;
} }
int SDLAudioIn::AudioInInput(int handle, void* out_buffer) { int SDLAudioIn::AudioInInput(int handle, void* out_buffer) {
std::scoped_lock lock{m_mutex}; std::scoped_lock lock{m_mutex};
if (handle < 1 || handle > portsIn.size())
if (handle < 1 || handle > static_cast<int>(portsIn.size()) || !out_buffer)
return ORBIS_AUDIO_IN_ERROR_INVALID_PORT; return ORBIS_AUDIO_IN_ERROR_INVALID_PORT;
auto& port = portsIn[handle - 1]; auto& port = portsIn[handle - 1];
if (!port.isOpen || out_buffer == nullptr) { if (!port.isOpen)
return ORBIS_AUDIO_IN_ERROR_INVALID_PORT; return ORBIS_AUDIO_IN_ERROR_INVALID_PORT;
}
const int bytesToRead = port.samples_num * port.sample_size * port.channels_num; const int bytesToRead = port.samples_num * port.sample_size * port.channels_num;
@ -90,19 +94,19 @@ int SDLAudioIn::AudioInInput(int handle, void* out_buffer) {
} }
} }
int result = SDL_GetAudioStreamData(port.stream, out_buffer, bytesToRead); const int bytesRead = SDL_GetAudioStreamData(port.stream, out_buffer, bytesToRead);
if (result < 0) { if (bytesRead < 0) {
// SDL_GetAudioStreamData failed // SDL_GetAudioStreamData failed
SDL_Log("AudioInInput error: %s", SDL_GetError()); SDL_Log("AudioInInput error: %s", SDL_GetError());
return ORBIS_AUDIO_IN_ERROR_STREAM_FAIL; return ORBIS_AUDIO_IN_ERROR_STREAM_FAIL;
} }
const int framesRead = bytesRead / (port.sample_size * port.channels_num);
return result; return framesRead;
} }
void SDLAudioIn::AudioInClose(int handle) { void SDLAudioIn::AudioInClose(int handle) {
std::scoped_lock lock{m_mutex}; std::scoped_lock lock{m_mutex};
if (handle < 1 || handle > portsIn.size()) if (handle < 1 || handle > (int)portsIn.size())
return; return;
auto& port = portsIn[handle - 1]; auto& port = portsIn[handle - 1];
@ -110,5 +114,5 @@ void SDLAudioIn::AudioInClose(int handle) {
return; return;
SDL_DestroyAudioStream(port.stream); SDL_DestroyAudioStream(port.stream);
port.isOpen = false; port = {};
} }

View File

@ -186,7 +186,7 @@ int PS4_SYSV_ABI sceHttpGetAcceptEncodingGZIPEnabled() {
int PS4_SYSV_ABI sceHttpGetAllResponseHeaders() { int PS4_SYSV_ABI sceHttpGetAllResponseHeaders() {
LOG_ERROR(Lib_Http, "(STUBBED) called"); LOG_ERROR(Lib_Http, "(STUBBED) called");
return ORBIS_OK; return ORBIS_FAIL;
} }
int PS4_SYSV_ABI sceHttpGetAuthEnabled() { int PS4_SYSV_ABI sceHttpGetAuthEnabled() {