mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-01-30 01:58:33 +00:00
sceNetAccept sleep and SDLAudio::AudioOutOutput latency and cpu improvements (#507)
* Add 5-second sleep on sceNetAccept as this can be called in an infinite loop and would normally block (this isn't ideal for non-blocking sockets but it's all stubs at the moment anyway) * SDLAudio::AudioOutOutput: protect against invalid handle, support NULL input (wait only), replace fixed 65536 with an amount based on settable latency target (20ms for now) * Fix whitespace --------- Co-authored-by: j <j@local>
This commit is contained in:
parent
fdb13a3b90
commit
d66d129357
|
@ -84,7 +84,7 @@ int SDLAudio::AudioOutOpen(int type, u32 samples_num, u32 freq,
|
|||
port.stream =
|
||||
SDL_OpenAudioDeviceStream(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &fmt, NULL, NULL);
|
||||
SDL_ResumeAudioDevice(SDL_GetAudioStreamDevice(port.stream));
|
||||
return id + 1;
|
||||
return id + 1; // Handle range 1..n keeps 0 reserved
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -93,22 +93,35 @@ int SDLAudio::AudioOutOpen(int type, u32 samples_num, u32 freq,
|
|||
|
||||
s32 SDLAudio::AudioOutOutput(s32 handle, const void* ptr) {
|
||||
std::shared_lock lock{m_mutex};
|
||||
if (handle < 1 || handle > portsOut.size()) {
|
||||
// Handle is outside range 1..n
|
||||
return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT;
|
||||
}
|
||||
auto& port = portsOut[handle - 1];
|
||||
if (!port.isOpen) {
|
||||
return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT;
|
||||
}
|
||||
if (ptr == nullptr) {
|
||||
return 0;
|
||||
}
|
||||
// TODO mixing channels
|
||||
int result = SDL_PutAudioStreamData(port.stream, ptr,
|
||||
port.samples_num * port.sample_size * port.channels_num);
|
||||
// TODO find a correct value 8192 is estimated
|
||||
while (SDL_GetAudioStreamAvailable(port.stream) > 65536) {
|
||||
SDL_Delay(0);
|
||||
|
||||
// Allow call with null - this acts as "wait for buffer ready"
|
||||
if (ptr != nullptr) {
|
||||
// TODO mixing channels
|
||||
int result = SDL_PutAudioStreamData(
|
||||
port.stream, ptr, port.samples_num * port.sample_size * port.channels_num);
|
||||
if (result != 0) {
|
||||
// There's various possible failures, just assume some buffer is full
|
||||
return ORBIS_AUDIO_OUT_ERROR_PORT_FULL;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
auto bytesPerSecond = 48000 * port.sample_size * port.channels_num;
|
||||
const int TARGET_LATENCY_MS = 20; // Arbitrary, but slightly more than one 60fps frame
|
||||
auto sizeTarget = (bytesPerSecond * TARGET_LATENCY_MS) / 1000;
|
||||
|
||||
while (SDL_GetAudioStreamAvailable(port.stream) > sizeTarget) {
|
||||
SDL_Delay(1); // Sleep behaviour is platform-dependent; 1ms may be up to 17ms
|
||||
}
|
||||
|
||||
return ORBIS_OK;
|
||||
}
|
||||
|
||||
bool SDLAudio::AudioOutSetVolume(s32 handle, s32 bitflag, s32* volume) {
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include <thread>
|
||||
|
||||
#ifdef WIN32
|
||||
#define _WINSOCK_DEPRECATED_NO_WARNINGS
|
||||
#include <Ws2tcpip.h>
|
||||
|
@ -59,7 +61,8 @@ int PS4_SYSV_ABI sce_net_in6addr_nodelocal_allnodes() {
|
|||
}
|
||||
|
||||
OrbisNetId PS4_SYSV_ABI sceNetAccept(OrbisNetId s, OrbisNetSockaddr* addr, u32* paddrlen) {
|
||||
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
||||
LOG_ERROR(Lib_Net, "(STUBBED) called [sleeping]");
|
||||
std::this_thread::sleep_for(std::chrono::seconds(5));
|
||||
return ORBIS_OK;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue