mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-29 08:41:20 +00:00
libAudio2: fix regression
This commit is contained in:
1 parent
e903c93848
commit
3726b0ae22
3 files changed
+22
-19
No files matched your search
+17
-15
@@ -83,7 +83,7 @@ public:
|
|||||||
bool AudioOutClose(Id handle);
|
bool AudioOutClose(Id handle);
|
||||||
bool AudioOutValid(Id handle);
|
bool AudioOutValid(Id handle);
|
||||||
bool AudioOutSetVolume(Id handle, uint32_t bitflag, const int* volume);
|
bool AudioOutSetVolume(Id handle, uint32_t bitflag, const int* volume);
|
||||||
uint32_t AudioOutOutputs(OutputParam* params, uint32_t num);
|
uint32_t AudioOutOutputs(OutputParam* params, uint32_t num, bool blocking = true);
|
||||||
bool AudioOutGetStatus(Id handle, int* type, int* channels_num);
|
bool AudioOutGetStatus(Id handle, int* type, int* channels_num);
|
||||||
|
|
||||||
Id AudioInOpen(uint32_t type, uint32_t samples_num, uint32_t freq, Format format);
|
Id AudioInOpen(uint32_t type, uint32_t samples_num, uint32_t freq, Format format);
|
||||||
@@ -130,7 +130,7 @@ private:
|
|||||||
static void CloseSdlDevice(PortOut* port);
|
static void CloseSdlDevice(PortOut* port);
|
||||||
static const void* PrepareOutputBuffer(const PortOut& port, const void* data,
|
static const void* PrepareOutputBuffer(const PortOut& port, const void* data,
|
||||||
std::vector<uint8_t>* buffer);
|
std::vector<uint8_t>* buffer);
|
||||||
static bool QueueSdlAudio(PortOut* port, const void* data);
|
static bool QueueSdlAudio(PortOut* port, const void* data, bool blocking);
|
||||||
};
|
};
|
||||||
|
|
||||||
static Audio* g_audio = nullptr;
|
static Audio* g_audio = nullptr;
|
||||||
@@ -152,7 +152,7 @@ void AudioOutClose(int handle) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t AudioOutOutputs(const OutputParam* params, uint32_t num) {
|
uint32_t AudioOutOutputs(const OutputParam* params, uint32_t num, bool blocking) {
|
||||||
if (g_audio == nullptr || params == nullptr || num == 0) {
|
if (g_audio == nullptr || params == nullptr || num == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -171,7 +171,7 @@ uint32_t AudioOutOutputs(const OutputParam* params, uint32_t num) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return g_audio->AudioOutOutputs(output_params.data(),
|
return g_audio->AudioOutOutputs(output_params.data(),
|
||||||
static_cast<uint32_t>(output_params.size()));
|
static_cast<uint32_t>(output_params.size()), blocking);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace AudioInternal
|
} // namespace AudioInternal
|
||||||
@@ -321,7 +321,7 @@ const void* Audio::PrepareOutputBuffer(const PortOut& port, const void* data,
|
|||||||
return buffer->data();
|
return buffer->data();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Audio::QueueSdlAudio(PortOut* port, const void* data) {
|
bool Audio::QueueSdlAudio(PortOut* port, const void* data, bool blocking) {
|
||||||
EXIT_IF(port == nullptr);
|
EXIT_IF(port == nullptr);
|
||||||
|
|
||||||
if (port->audio_device == 0 || data == nullptr) {
|
if (port->audio_device == 0 || data == nullptr) {
|
||||||
@@ -363,14 +363,16 @@ bool Audio::QueueSdlAudio(PortOut* port, const void* data) {
|
|||||||
queue_size = static_cast<uint32_t>(cvt.len_cvt);
|
queue_size = static_cast<uint32_t>(cvt.len_cvt);
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto min_queued_size = queue_size * 2u;
|
if (blocking) {
|
||||||
const auto wait_start = LibKernel::KernelGetProcessTime();
|
const auto min_queued_size = queue_size * 2u;
|
||||||
while (SDL_GetQueuedAudioSize(port->audio_device) > min_queued_size) {
|
const auto wait_start = LibKernel::KernelGetProcessTime();
|
||||||
if (LibKernel::KernelGetProcessTime() - wait_start > 200000) {
|
while (SDL_GetQueuedAudioSize(port->audio_device) > min_queued_size) {
|
||||||
SDL_ClearQueuedAudio(port->audio_device);
|
if (LibKernel::KernelGetProcessTime() - wait_start > 200000) {
|
||||||
break;
|
SDL_ClearQueuedAudio(port->audio_device);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Common::Thread::SleepMicro(1000);
|
||||||
}
|
}
|
||||||
Common::Thread::SleepMicro(1000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SDL_QueueAudio(port->audio_device, queue_data, queue_size) < 0) {
|
if (SDL_QueueAudio(port->audio_device, queue_data, queue_size) < 0) {
|
||||||
@@ -492,7 +494,7 @@ bool Audio::AudioOutSetVolume(Id handle, uint32_t bitflag, const int* volume) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Audio::AudioOutOutputs(OutputParam* params, uint32_t num) {
|
uint32_t Audio::AudioOutOutputs(OutputParam* params, uint32_t num, bool blocking) {
|
||||||
EXIT_NOT_IMPLEMENTED(num == 0);
|
EXIT_NOT_IMPLEMENTED(num == 0);
|
||||||
EXIT_NOT_IMPLEMENTED(!AudioOutValid(params[0].handle));
|
EXIT_NOT_IMPLEMENTED(!AudioOutValid(params[0].handle));
|
||||||
|
|
||||||
@@ -509,14 +511,14 @@ uint32_t Audio::AudioOutOutputs(OutputParam* params, uint32_t num) {
|
|||||||
max_wait_time = (wait_time > max_wait_time ? wait_time : max_wait_time);
|
max_wait_time = (wait_time > max_wait_time ? wait_time : max_wait_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (max_wait_time != 0) {
|
if (blocking && max_wait_time != 0) {
|
||||||
Common::Thread::SleepMicro(max_wait_time);
|
Common::Thread::SleepMicro(max_wait_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint32_t i = 0; i < num; i++) {
|
for (uint32_t i = 0; i < num; i++) {
|
||||||
auto& port = m_out_ports[params[i].handle.GetId()];
|
auto& port = m_out_ports[params[i].handle.GetId()];
|
||||||
|
|
||||||
QueueSdlAudio(&port, params[i].data);
|
QueueSdlAudio(&port, params[i].data, blocking);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint32_t i = 0; i < num; i++) {
|
for (uint32_t i = 0; i < num; i++) {
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ static constexpr int OUT_PORTS_MAX = 32;
|
|||||||
|
|
||||||
int AudioOutOpen(int type, uint32_t samples_num, uint32_t freq, Format format);
|
int AudioOutOpen(int type, uint32_t samples_num, uint32_t freq, Format format);
|
||||||
void AudioOutClose(int handle);
|
void AudioOutClose(int handle);
|
||||||
uint32_t AudioOutOutputs(const OutputParam* params, uint32_t num);
|
uint32_t AudioOutOutputs(const OutputParam* params, uint32_t num, bool blocking = true);
|
||||||
|
|
||||||
} // namespace Libs::Audio::AudioInternal
|
} // namespace Libs::Audio::AudioInternal
|
||||||
|
|
||||||
|
|||||||
@@ -348,7 +348,7 @@ static uint32_t audioout2_context_grains(AudioOut2ContextHandle ctx) {
|
|||||||
return samples_num;
|
return samples_num;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void audioout2_queue_context_audio(AudioOut2ContextHandle ctx) {
|
static void audioout2_queue_context_audio(AudioOut2ContextHandle ctx, bool blocking) {
|
||||||
std::vector<AudioInternal::OutputParam> params;
|
std::vector<AudioInternal::OutputParam> params;
|
||||||
params.reserve(AudioInternal::OUT_PORTS_MAX);
|
params.reserve(AudioInternal::OUT_PORTS_MAX);
|
||||||
|
|
||||||
@@ -365,7 +365,8 @@ static void audioout2_queue_context_audio(AudioOut2ContextHandle ctx) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)AudioInternal::AudioOutOutputs(params.data(), static_cast<uint32_t>(params.size()));
|
(void)AudioInternal::AudioOutOutputs(params.data(), static_cast<uint32_t>(params.size()),
|
||||||
|
blocking);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void audioout2_close_audio_handle(int audio_handle) {
|
static void audioout2_close_audio_handle(int audio_handle) {
|
||||||
@@ -514,7 +515,7 @@ int KYTY_SYSV_ABI AudioOut2ContextPush(AudioOut2ContextHandle ctx, uint32_t bloc
|
|||||||
}
|
}
|
||||||
state->queued++;
|
state->queued++;
|
||||||
g_audioout2_context_mutex.Unlock();
|
g_audioout2_context_mutex.Unlock();
|
||||||
audioout2_queue_context_audio(ctx);
|
audioout2_queue_context_audio(ctx, blocking != 0);
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user