Skip to content

Commit d5ad6dd

Browse files
committed
AudioStream(Playback)WAV: Use LocalVectors instead of pointers
1 parent a5830f6 commit d5ad6dd

File tree

2 files changed

+24
-48
lines changed

2 files changed

+24
-48
lines changed

scene/resources/audio_stream_wav.cpp

+22-46
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,8 @@ void AudioStreamPlaybackWAV::do_resample(const Depth *p_src, AudioFrame *p_dst,
123123
int16_t nibble, diff, step;
124124

125125
p_ima_adpcm[i].last_nibble++;
126-
const uint8_t *src_ptr = (const uint8_t *)base->data;
127-
src_ptr += AudioStreamWAV::DATA_PAD;
128126

129-
uint8_t nbb = src_ptr[(p_ima_adpcm[i].last_nibble >> 1) * (is_stereo ? 2 : 1) + i];
127+
uint8_t nbb = p_src[(p_ima_adpcm[i].last_nibble >> 1) * (is_stereo ? 2 : 1) + i];
130128
nibble = (p_ima_adpcm[i].last_nibble & 1) ? (nbb >> 4) : (nbb & 0xF);
131129
step = _ima_adpcm_step_table[p_ima_adpcm[i].step_index];
132130

@@ -184,9 +182,8 @@ void AudioStreamPlaybackWAV::do_resample(const Depth *p_src, AudioFrame *p_dst,
184182

185183
if (p_qoa->data_ofs != new_data_ofs) {
186184
p_qoa->data_ofs = new_data_ofs;
187-
const uint8_t *src_ptr = (const uint8_t *)base->data;
188-
src_ptr += p_qoa->data_ofs + AudioStreamWAV::DATA_PAD;
189-
qoa_decode_frame(src_ptr, p_qoa->frame_len, &p_qoa->desc, p_qoa->dec, &p_qoa->dec_len);
185+
const uint8_t *ofs_src = (uint8_t *)p_src + p_qoa->data_ofs;
186+
qoa_decode_frame(ofs_src, p_qoa->frame_len, &p_qoa->desc, p_qoa->dec.ptr(), &p_qoa->dec_len);
190187
}
191188

192189
uint32_t dec_idx = (interp_pos % QOA_FRAME_LEN) * p_qoa->desc.channels;
@@ -267,7 +264,7 @@ void AudioStreamPlaybackWAV::do_resample(const Depth *p_src, AudioFrame *p_dst,
267264
}
268265

269266
int AudioStreamPlaybackWAV::mix(AudioFrame *p_buffer, float p_rate_scale, int p_frames) {
270-
if (!base->data || !active) {
267+
if (base->data.is_empty() || !active) {
271268
for (int i = 0; i < p_frames; i++) {
272269
p_buffer[i] = AudioFrame(0, 0);
273270
}
@@ -324,8 +321,7 @@ int AudioStreamPlaybackWAV::mix(AudioFrame *p_buffer, float p_rate_scale, int p_
324321

325322
/* audio data */
326323

327-
uint8_t *dataptr = (uint8_t *)base->data;
328-
const void *data = dataptr + AudioStreamWAV::DATA_PAD;
324+
const uint8_t *data = base->data.ptr() + AudioStreamWAV::DATA_PAD;
329325
AudioFrame *dst_buff = p_buffer;
330326

331327
if (format == AudioStreamWAV::FORMAT_IMA_ADPCM) {
@@ -483,11 +479,7 @@ void AudioStreamPlaybackWAV::set_sample_playback(const Ref<AudioSamplePlayback>
483479

484480
AudioStreamPlaybackWAV::AudioStreamPlaybackWAV() {}
485481

486-
AudioStreamPlaybackWAV::~AudioStreamPlaybackWAV() {
487-
if (qoa.dec) {
488-
memfree(qoa.dec);
489-
}
490-
}
482+
AudioStreamPlaybackWAV::~AudioStreamPlaybackWAV() {}
491483

492484
/////////////////////
493485

@@ -554,7 +546,7 @@ double AudioStreamWAV::get_length() const {
554546
break;
555547
case AudioStreamWAV::FORMAT_QOA:
556548
qoa_desc desc = {};
557-
qoa_decode_header((uint8_t *)data + DATA_PAD, data_bytes, &desc);
549+
qoa_decode_header(data.ptr() + DATA_PAD, data_bytes, &desc);
558550
len = desc.samples * desc.channels;
559551
break;
560552
}
@@ -572,36 +564,26 @@ bool AudioStreamWAV::is_monophonic() const {
572564

573565
void AudioStreamWAV::set_data(const Vector<uint8_t> &p_data) {
574566
AudioServer::get_singleton()->lock();
575-
if (data) {
576-
memfree(data);
577-
data = nullptr;
578-
data_bytes = 0;
579-
}
580567

581-
int datalen = p_data.size();
582-
if (datalen) {
583-
const uint8_t *r = p_data.ptr();
584-
int alloc_len = datalen + DATA_PAD * 2;
585-
data = memalloc(alloc_len); //alloc with some padding for interpolation
586-
memset(data, 0, alloc_len);
587-
uint8_t *dataptr = (uint8_t *)data;
588-
memcpy(dataptr + DATA_PAD, r, datalen);
589-
data_bytes = datalen;
590-
}
568+
int src_data_len = p_data.size();
569+
570+
data.clear();
571+
572+
int alloc_len = src_data_len + DATA_PAD * 2;
573+
data.resize(alloc_len);
574+
memset(data.ptr(), 0, alloc_len);
575+
memcpy(data.ptr() + DATA_PAD, p_data.ptr(), src_data_len);
576+
data_bytes = src_data_len;
591577

592578
AudioServer::get_singleton()->unlock();
593579
}
594580

595581
Vector<uint8_t> AudioStreamWAV::get_data() const {
596582
Vector<uint8_t> pv;
597583

598-
if (data) {
584+
if (!data.is_empty()) {
599585
pv.resize(data_bytes);
600-
{
601-
uint8_t *w = pv.ptrw();
602-
uint8_t *dataptr = (uint8_t *)data;
603-
memcpy(w, dataptr + DATA_PAD, data_bytes);
604-
}
586+
memcpy(pv.ptrw(), data.ptr() + DATA_PAD, data_bytes);
605587
}
606588

607589
return pv;
@@ -693,12 +675,12 @@ Ref<AudioStreamPlayback> AudioStreamWAV::instantiate_playback() {
693675
sample->base = Ref<AudioStreamWAV>(this);
694676

695677
if (format == AudioStreamWAV::FORMAT_QOA) {
696-
uint32_t ffp = qoa_decode_header((uint8_t *)data + DATA_PAD, data_bytes, &sample->qoa.desc);
678+
uint32_t ffp = qoa_decode_header(data.ptr() + DATA_PAD, data_bytes, &sample->qoa.desc);
697679
ERR_FAIL_COND_V(ffp != 8, Ref<AudioStreamPlaybackWAV>());
698680
sample->qoa.frame_len = qoa_max_frame_size(&sample->qoa.desc);
699681
int samples_len = (sample->qoa.desc.samples > QOA_FRAME_LEN ? QOA_FRAME_LEN : sample->qoa.desc.samples);
700-
int alloc_len = sample->qoa.desc.channels * samples_len * sizeof(int16_t);
701-
sample->qoa.dec = (int16_t *)memalloc(alloc_len);
682+
int dec_len = sample->qoa.desc.channels * samples_len;
683+
sample->qoa.dec.resize(dec_len);
702684
}
703685

704686
return sample;
@@ -780,10 +762,4 @@ void AudioStreamWAV::_bind_methods() {
780762

781763
AudioStreamWAV::AudioStreamWAV() {}
782764

783-
AudioStreamWAV::~AudioStreamWAV() {
784-
if (data) {
785-
memfree(data);
786-
data = nullptr;
787-
data_bytes = 0;
788-
}
789-
}
765+
AudioStreamWAV::~AudioStreamWAV() {}

scene/resources/audio_stream_wav.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class AudioStreamPlaybackWAV : public AudioStreamPlayback {
6262
qoa_desc desc = {};
6363
uint32_t data_ofs = 0;
6464
uint32_t frame_len = 0;
65-
int16_t *dec = nullptr;
65+
LocalVector<int16_t> dec;
6666
uint32_t dec_len = 0;
6767
int64_t cache_pos = -1;
6868
int16_t cache[2] = { 0, 0 };
@@ -137,7 +137,7 @@ class AudioStreamWAV : public AudioStream {
137137
int loop_begin = 0;
138138
int loop_end = 0;
139139
int mix_rate = 44100;
140-
void *data = nullptr;
140+
LocalVector<uint8_t> data;
141141
uint32_t data_bytes = 0;
142142

143143
protected:

0 commit comments

Comments
 (0)