Merge pull request #45617 from RandomShaper/modernize_atomics
Modernize atomics (and fix `volatile`)
This commit is contained in:
@@ -131,7 +131,7 @@ bool AudioRBResampler::mix(AudioFrame *p_dest, int p_frames) {
|
||||
src_read = read_space;
|
||||
}
|
||||
|
||||
rb_read_pos = (rb_read_pos + src_read) & rb_mask;
|
||||
rb_read_pos.set((rb_read_pos.get() + src_read) & rb_mask);
|
||||
|
||||
// Create fadeout effect for the end of stream (note that it can be because of slow writer)
|
||||
if (p_frames - target_todo > 0) {
|
||||
@@ -183,8 +183,8 @@ Error AudioRBResampler::setup(int p_channels, int p_src_mix_rate, int p_target_m
|
||||
src_mix_rate = p_src_mix_rate;
|
||||
target_mix_rate = p_target_mix_rate;
|
||||
offset = 0;
|
||||
rb_read_pos = 0;
|
||||
rb_write_pos = 0;
|
||||
rb_read_pos.set(0);
|
||||
rb_write_pos.set(0);
|
||||
|
||||
//avoid maybe strange noises upon load
|
||||
for (unsigned int i = 0; i < (rb_len * channels); i++) {
|
||||
@@ -205,8 +205,8 @@ void AudioRBResampler::clear() {
|
||||
memdelete_arr(read_buf);
|
||||
rb = nullptr;
|
||||
offset = 0;
|
||||
rb_read_pos = 0;
|
||||
rb_write_pos = 0;
|
||||
rb_read_pos.set(0);
|
||||
rb_write_pos.set(0);
|
||||
read_buf = nullptr;
|
||||
}
|
||||
|
||||
@@ -214,8 +214,8 @@ AudioRBResampler::AudioRBResampler() {
|
||||
rb = nullptr;
|
||||
offset = 0;
|
||||
read_buf = nullptr;
|
||||
rb_read_pos = 0;
|
||||
rb_write_pos = 0;
|
||||
rb_read_pos.set(0);
|
||||
rb_write_pos.set(0);
|
||||
|
||||
rb_bits = 0;
|
||||
rb_len = 0;
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#define AUDIO_RB_RESAMPLER_H
|
||||
|
||||
#include "core/os/memory.h"
|
||||
#include "core/templates/safe_refcount.h"
|
||||
#include "core/typedefs.h"
|
||||
#include "servers/audio_server.h"
|
||||
|
||||
@@ -44,8 +45,8 @@ struct AudioRBResampler {
|
||||
uint32_t src_mix_rate;
|
||||
uint32_t target_mix_rate;
|
||||
|
||||
volatile int rb_read_pos;
|
||||
volatile int rb_write_pos;
|
||||
SafeNumeric<int> rb_read_pos;
|
||||
SafeNumeric<int> rb_write_pos;
|
||||
|
||||
int32_t offset; //contains the fractional remainder of the resampler
|
||||
enum {
|
||||
@@ -62,8 +63,8 @@ struct AudioRBResampler {
|
||||
|
||||
public:
|
||||
_FORCE_INLINE_ void flush() {
|
||||
rb_read_pos = 0;
|
||||
rb_write_pos = 0;
|
||||
rb_read_pos.set(0);
|
||||
rb_write_pos.set(0);
|
||||
offset = 0;
|
||||
}
|
||||
|
||||
@@ -78,8 +79,8 @@ public:
|
||||
_FORCE_INLINE_ int get_writer_space() const {
|
||||
int space, r, w;
|
||||
|
||||
r = rb_read_pos;
|
||||
w = rb_write_pos;
|
||||
r = rb_read_pos.get();
|
||||
w = rb_write_pos.get();
|
||||
|
||||
if (r == w) {
|
||||
space = rb_len - 1;
|
||||
@@ -95,8 +96,8 @@ public:
|
||||
_FORCE_INLINE_ int get_reader_space() const {
|
||||
int space, r, w;
|
||||
|
||||
r = rb_read_pos;
|
||||
w = rb_write_pos;
|
||||
r = rb_read_pos.get();
|
||||
w = rb_write_pos.get();
|
||||
|
||||
if (r == w) {
|
||||
space = 0;
|
||||
@@ -110,48 +111,52 @@ public:
|
||||
}
|
||||
|
||||
_FORCE_INLINE_ bool has_data() const {
|
||||
return rb && rb_read_pos != rb_write_pos;
|
||||
return rb && rb_read_pos.get() != rb_write_pos.get();
|
||||
}
|
||||
|
||||
_FORCE_INLINE_ float *get_write_buffer() { return read_buf; }
|
||||
_FORCE_INLINE_ void write(uint32_t p_frames) {
|
||||
ERR_FAIL_COND(p_frames >= rb_len);
|
||||
|
||||
int wp = rb_write_pos.get();
|
||||
|
||||
switch (channels) {
|
||||
case 1: {
|
||||
for (uint32_t i = 0; i < p_frames; i++) {
|
||||
rb[rb_write_pos] = read_buf[i];
|
||||
rb_write_pos = (rb_write_pos + 1) & rb_mask;
|
||||
rb[wp] = read_buf[i];
|
||||
wp = (wp + 1) & rb_mask;
|
||||
}
|
||||
} break;
|
||||
case 2: {
|
||||
for (uint32_t i = 0; i < p_frames; i++) {
|
||||
rb[(rb_write_pos << 1) + 0] = read_buf[(i << 1) + 0];
|
||||
rb[(rb_write_pos << 1) + 1] = read_buf[(i << 1) + 1];
|
||||
rb_write_pos = (rb_write_pos + 1) & rb_mask;
|
||||
rb[(wp << 1) + 0] = read_buf[(i << 1) + 0];
|
||||
rb[(wp << 1) + 1] = read_buf[(i << 1) + 1];
|
||||
wp = (wp + 1) & rb_mask;
|
||||
}
|
||||
} break;
|
||||
case 4: {
|
||||
for (uint32_t i = 0; i < p_frames; i++) {
|
||||
rb[(rb_write_pos << 2) + 0] = read_buf[(i << 2) + 0];
|
||||
rb[(rb_write_pos << 2) + 1] = read_buf[(i << 2) + 1];
|
||||
rb[(rb_write_pos << 2) + 2] = read_buf[(i << 2) + 2];
|
||||
rb[(rb_write_pos << 2) + 3] = read_buf[(i << 2) + 3];
|
||||
rb_write_pos = (rb_write_pos + 1) & rb_mask;
|
||||
rb[(wp << 2) + 0] = read_buf[(i << 2) + 0];
|
||||
rb[(wp << 2) + 1] = read_buf[(i << 2) + 1];
|
||||
rb[(wp << 2) + 2] = read_buf[(i << 2) + 2];
|
||||
rb[(wp << 2) + 3] = read_buf[(i << 2) + 3];
|
||||
wp = (wp + 1) & rb_mask;
|
||||
}
|
||||
} break;
|
||||
case 6: {
|
||||
for (uint32_t i = 0; i < p_frames; i++) {
|
||||
rb[(rb_write_pos * 6) + 0] = read_buf[(i * 6) + 0];
|
||||
rb[(rb_write_pos * 6) + 1] = read_buf[(i * 6) + 1];
|
||||
rb[(rb_write_pos * 6) + 2] = read_buf[(i * 6) + 2];
|
||||
rb[(rb_write_pos * 6) + 3] = read_buf[(i * 6) + 3];
|
||||
rb[(rb_write_pos * 6) + 4] = read_buf[(i * 6) + 4];
|
||||
rb[(rb_write_pos * 6) + 5] = read_buf[(i * 6) + 5];
|
||||
rb_write_pos = (rb_write_pos + 1) & rb_mask;
|
||||
rb[(wp * 6) + 0] = read_buf[(i * 6) + 0];
|
||||
rb[(wp * 6) + 1] = read_buf[(i * 6) + 1];
|
||||
rb[(wp * 6) + 2] = read_buf[(i * 6) + 2];
|
||||
rb[(wp * 6) + 3] = read_buf[(i * 6) + 3];
|
||||
rb[(wp * 6) + 4] = read_buf[(i * 6) + 4];
|
||||
rb[(wp * 6) + 5] = read_buf[(i * 6) + 5];
|
||||
wp = (wp + 1) & rb_mask;
|
||||
}
|
||||
} break;
|
||||
}
|
||||
|
||||
rb_write_pos.set(wp);
|
||||
}
|
||||
|
||||
int get_channel_count() const;
|
||||
|
||||
@@ -106,7 +106,7 @@ int AudioEffectCapture::get_frames_available() const {
|
||||
}
|
||||
|
||||
int64_t AudioEffectCapture::get_discarded_frames() const {
|
||||
return discarded_frames;
|
||||
return discarded_frames.get();
|
||||
}
|
||||
|
||||
int AudioEffectCapture::get_buffer_length_frames() const {
|
||||
@@ -115,7 +115,7 @@ int AudioEffectCapture::get_buffer_length_frames() const {
|
||||
}
|
||||
|
||||
int64_t AudioEffectCapture::get_pushed_frames() const {
|
||||
return pushed_frames;
|
||||
return pushed_frames.get();
|
||||
}
|
||||
|
||||
void AudioEffectCaptureInstance::process(const AudioFrame *p_src_frames, AudioFrame *p_dst_frames, int p_frame_count) {
|
||||
@@ -129,9 +129,9 @@ void AudioEffectCaptureInstance::process(const AudioFrame *p_src_frames, AudioFr
|
||||
// Add incoming audio frames to the IO ring buffer
|
||||
int32_t ret = buffer.write(p_src_frames, p_frame_count);
|
||||
ERR_FAIL_COND_MSG(ret != p_frame_count, "Failed to add data to effect capture ring buffer despite sufficient space.");
|
||||
atomic_add(&base->pushed_frames, p_frame_count);
|
||||
base->pushed_frames.add(p_frame_count);
|
||||
} else {
|
||||
atomic_add(&base->discarded_frames, p_frame_count);
|
||||
base->discarded_frames.add(p_frame_count);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -55,8 +55,8 @@ class AudioEffectCapture : public AudioEffect {
|
||||
friend class AudioEffectCaptureInstance;
|
||||
|
||||
RingBuffer<AudioFrame> buffer;
|
||||
uint64_t discarded_frames = 0;
|
||||
uint64_t pushed_frames = 0;
|
||||
SafeNumeric<uint64_t> discarded_frames;
|
||||
SafeNumeric<uint64_t> pushed_frames;
|
||||
float buffer_length_seconds = 0.1f;
|
||||
bool buffer_initialized = false;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user