You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
Merge pull request #64607 from RandomShaper/safe_audio_threading
This commit is contained in:
@@ -501,11 +501,11 @@ Error AudioDriverWASAPI::init_capture_device(bool reinit) {
|
||||
}
|
||||
|
||||
Error AudioDriverWASAPI::audio_device_finish(AudioDeviceWASAPI *p_device) {
|
||||
if (p_device->active) {
|
||||
if (p_device->active.is_set()) {
|
||||
if (p_device->audio_client) {
|
||||
p_device->audio_client->Stop();
|
||||
}
|
||||
p_device->active = false;
|
||||
p_device->active.clear();
|
||||
}
|
||||
|
||||
SAFE_RELEASE(p_device->audio_client)
|
||||
@@ -533,8 +533,7 @@ Error AudioDriverWASAPI::init() {
|
||||
ERR_PRINT("WASAPI: init_render_device error");
|
||||
}
|
||||
|
||||
exit_thread = false;
|
||||
thread_exited = false;
|
||||
exit_thread.clear();
|
||||
|
||||
thread.start(thread_func, this);
|
||||
|
||||
@@ -684,7 +683,7 @@ void AudioDriverWASAPI::thread_func(void *p_udata) {
|
||||
uint32_t avail_frames = 0;
|
||||
uint32_t write_ofs = 0;
|
||||
|
||||
while (!ad->exit_thread) {
|
||||
while (!ad->exit_thread.is_set()) {
|
||||
uint32_t read_frames = 0;
|
||||
uint32_t written_frames = 0;
|
||||
|
||||
@@ -692,7 +691,7 @@ void AudioDriverWASAPI::thread_func(void *p_udata) {
|
||||
ad->lock();
|
||||
ad->start_counting_ticks();
|
||||
|
||||
if (ad->audio_output.active) {
|
||||
if (ad->audio_output.active.is_set()) {
|
||||
ad->audio_server_process(ad->buffer_frames, ad->samples_in.ptrw());
|
||||
} else {
|
||||
for (int i = 0; i < ad->samples_in.size(); i++) {
|
||||
@@ -758,7 +757,7 @@ void AudioDriverWASAPI::thread_func(void *p_udata) {
|
||||
}
|
||||
} else {
|
||||
ERR_PRINT("WASAPI: Get buffer error");
|
||||
ad->exit_thread = true;
|
||||
ad->exit_thread.set();
|
||||
}
|
||||
}
|
||||
} else if (hr == AUDCLNT_E_DEVICE_INVALIDATED) {
|
||||
@@ -807,7 +806,7 @@ void AudioDriverWASAPI::thread_func(void *p_udata) {
|
||||
write_ofs = 0;
|
||||
}
|
||||
|
||||
if (ad->audio_input.active) {
|
||||
if (ad->audio_input.active.is_set()) {
|
||||
UINT32 packet_length = 0;
|
||||
BYTE *data;
|
||||
UINT32 num_frames_available;
|
||||
@@ -886,8 +885,6 @@ void AudioDriverWASAPI::thread_func(void *p_udata) {
|
||||
OS::get_singleton()->delay_usec(1000);
|
||||
}
|
||||
}
|
||||
|
||||
ad->thread_exited = true;
|
||||
}
|
||||
|
||||
void AudioDriverWASAPI::start() {
|
||||
@@ -896,7 +893,7 @@ void AudioDriverWASAPI::start() {
|
||||
if (hr != S_OK) {
|
||||
ERR_PRINT("WASAPI: Start failed");
|
||||
} else {
|
||||
audio_output.active = true;
|
||||
audio_output.active.set();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -910,7 +907,7 @@ void AudioDriverWASAPI::unlock() {
|
||||
}
|
||||
|
||||
void AudioDriverWASAPI::finish() {
|
||||
exit_thread = true;
|
||||
exit_thread.set();
|
||||
thread.wait_to_finish();
|
||||
|
||||
finish_capture_device();
|
||||
@@ -924,19 +921,19 @@ Error AudioDriverWASAPI::capture_start() {
|
||||
return err;
|
||||
}
|
||||
|
||||
if (audio_input.active) {
|
||||
if (audio_input.active.is_set()) {
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
audio_input.audio_client->Start();
|
||||
audio_input.active = true;
|
||||
audio_input.active.set();
|
||||
return OK;
|
||||
}
|
||||
|
||||
Error AudioDriverWASAPI::capture_stop() {
|
||||
if (audio_input.active) {
|
||||
if (audio_input.active.is_set()) {
|
||||
audio_input.audio_client->Stop();
|
||||
audio_input.active = false;
|
||||
audio_input.active.clear();
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
|
||||
#include "core/os/mutex.h"
|
||||
#include "core/os/thread.h"
|
||||
#include "core/templates/safe_refcount.h"
|
||||
#include "servers/audio_server.h"
|
||||
|
||||
#include <audioclient.h>
|
||||
@@ -48,7 +49,7 @@ class AudioDriverWASAPI : public AudioDriver {
|
||||
IAudioClient *audio_client = nullptr;
|
||||
IAudioRenderClient *render_client = nullptr;
|
||||
IAudioCaptureClient *capture_client = nullptr;
|
||||
bool active = false;
|
||||
SafeFlag active;
|
||||
|
||||
WORD format_tag = 0;
|
||||
WORD bits_per_sample = 0;
|
||||
@@ -76,8 +77,7 @@ class AudioDriverWASAPI : public AudioDriver {
|
||||
float real_latency = 0.0;
|
||||
bool using_audio_client_3 = false;
|
||||
|
||||
bool thread_exited = false;
|
||||
mutable bool exit_thread = false;
|
||||
SafeFlag exit_thread;
|
||||
|
||||
static _FORCE_INLINE_ void write_sample(WORD format_tag, int bits_per_sample, BYTE *buffer, int i, int32_t sample);
|
||||
static _FORCE_INLINE_ int32_t read_sample(WORD format_tag, int bits_per_sample, BYTE *buffer, int i);
|
||||
|
||||
Reference in New Issue
Block a user