summaryrefslogtreecommitdiffstats
path: root/modules/minimp3/audio_stream_mp3.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/minimp3/audio_stream_mp3.cpp')
-rw-r--r--modules/minimp3/audio_stream_mp3.cpp69
1 files changed, 48 insertions, 21 deletions
diff --git a/modules/minimp3/audio_stream_mp3.cpp b/modules/minimp3/audio_stream_mp3.cpp
index a46a1c93b5..4963cfdf1a 100644
--- a/modules/minimp3/audio_stream_mp3.cpp
+++ b/modules/minimp3/audio_stream_mp3.cpp
@@ -57,7 +57,7 @@ int AudioStreamPlaybackMP3::_mix_internal(AudioFrame *p_buffer, int p_frames) {
mp3dec_frame_info_t frame_info;
mp3d_sample_t *buf_frame = nullptr;
- int samples_mixed = mp3dec_ex_read_frame(mp3d, &buf_frame, &frame_info, mp3_stream->channels);
+ int samples_mixed = mp3dec_ex_read_frame(&mp3d, &buf_frame, &frame_info, mp3_stream->channels);
if (samples_mixed) {
p_buffer[p_frames - todo] = AudioFrame(buf_frame[0], buf_frame[samples_mixed - 1]);
@@ -70,7 +70,7 @@ int AudioStreamPlaybackMP3::_mix_internal(AudioFrame *p_buffer, int p_frames) {
if (beat_loop && (int)frames_mixed >= beat_length_frames) {
for (int i = 0; i < FADE_SIZE; i++) {
- samples_mixed = mp3dec_ex_read_frame(mp3d, &buf_frame, &frame_info, mp3_stream->channels);
+ samples_mixed = mp3dec_ex_read_frame(&mp3d, &buf_frame, &frame_info, mp3_stream->channels);
loop_fade[i] = AudioFrame(buf_frame[0], buf_frame[samples_mixed - 1]);
if (!samples_mixed) {
break;
@@ -138,13 +138,32 @@ void AudioStreamPlaybackMP3::seek(double p_time) {
}
frames_mixed = uint32_t(mp3_stream->sample_rate * p_time);
- mp3dec_ex_seek(mp3d, (uint64_t)frames_mixed * mp3_stream->channels);
+ mp3dec_ex_seek(&mp3d, (uint64_t)frames_mixed * mp3_stream->channels);
}
void AudioStreamPlaybackMP3::tag_used_streams() {
mp3_stream->tag_used(get_playback_position());
}
+void AudioStreamPlaybackMP3::set_is_sample(bool p_is_sample) {
+ _is_sample = p_is_sample;
+}
+
+bool AudioStreamPlaybackMP3::get_is_sample() const {
+ return _is_sample;
+}
+
+Ref<AudioSamplePlayback> AudioStreamPlaybackMP3::get_sample_playback() const {
+ return sample_playback;
+}
+
+void AudioStreamPlaybackMP3::set_sample_playback(const Ref<AudioSamplePlayback> &p_playback) {
+ sample_playback = p_playback;
+ if (sample_playback.is_valid()) {
+ sample_playback->stream_playback = Ref<AudioStreamPlayback>(this);
+ }
+}
+
void AudioStreamPlaybackMP3::set_parameter(const StringName &p_name, const Variant &p_value) {
if (p_name == SNAME("looping")) {
if (p_value == Variant()) {
@@ -165,10 +184,7 @@ Variant AudioStreamPlaybackMP3::get_parameter(const StringName &p_name) const {
}
AudioStreamPlaybackMP3::~AudioStreamPlaybackMP3() {
- if (mp3d) {
- mp3dec_ex_close(mp3d);
- memfree(mp3d);
- }
+ mp3dec_ex_close(&mp3d);
}
Ref<AudioStreamPlayback> AudioStreamMP3::instantiate_playback() {
@@ -181,9 +197,8 @@ Ref<AudioStreamPlayback> AudioStreamMP3::instantiate_playback() {
mp3s.instantiate();
mp3s->mp3_stream = Ref<AudioStreamMP3>(this);
- mp3s->mp3d = (mp3dec_ex_t *)memalloc(sizeof(mp3dec_ex_t));
- int errorcode = mp3dec_ex_open_buf(mp3s->mp3d, data.ptr(), data_len, MP3D_SEEK_TO_SAMPLE);
+ int errorcode = mp3dec_ex_open_buf(&mp3s->mp3d, data.ptr(), data_len, MP3D_SEEK_TO_SAMPLE);
mp3s->frames_mixed = 0;
mp3s->active = false;
@@ -206,22 +221,22 @@ void AudioStreamMP3::clear_data() {
void AudioStreamMP3::set_data(const Vector<uint8_t> &p_data) {
int src_data_len = p_data.size();
- const uint8_t *src_datar = p_data.ptr();
- mp3dec_ex_t mp3d;
- int err = mp3dec_ex_open_buf(&mp3d, src_datar, src_data_len, MP3D_SEEK_TO_SAMPLE);
- ERR_FAIL_COND_MSG(err || mp3d.info.hz == 0, "Failed to decode mp3 file. Make sure it is a valid mp3 audio file.");
-
- channels = mp3d.info.channels;
- sample_rate = mp3d.info.hz;
- length = float(mp3d.samples) / (sample_rate * float(channels));
+ mp3dec_ex_t *mp3d = memnew(mp3dec_ex_t);
+ int err = mp3dec_ex_open_buf(mp3d, p_data.ptr(), src_data_len, MP3D_SEEK_TO_SAMPLE);
+ if (err || mp3d->info.hz == 0) {
+ memdelete(mp3d);
+ ERR_FAIL_MSG("Failed to decode mp3 file. Make sure it is a valid mp3 audio file.");
+ }
- mp3dec_ex_close(&mp3d);
+ channels = mp3d->info.channels;
+ sample_rate = mp3d->info.hz;
+ length = float(mp3d->samples) / (sample_rate * float(channels));
- clear_data();
+ mp3dec_ex_close(mp3d);
+ memdelete(mp3d);
- data.resize(src_data_len);
- memcpy(data.ptrw(), src_datar, src_data_len);
+ data = p_data;
data_len = src_data_len;
}
@@ -287,6 +302,18 @@ int AudioStreamMP3::get_bar_beats() const {
return bar_beats;
}
+Ref<AudioSample> AudioStreamMP3::generate_sample() const {
+ Ref<AudioSample> sample;
+ sample.instantiate();
+ sample->stream = this;
+ sample->loop_mode = loop
+ ? AudioSample::LoopMode::LOOP_FORWARD
+ : AudioSample::LoopMode::LOOP_DISABLED;
+ sample->loop_begin = loop_offset;
+ sample->loop_end = 0;
+ return sample;
+}
+
void AudioStreamMP3::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_data", "data"), &AudioStreamMP3::set_data);
ClassDB::bind_method(D_METHOD("get_data"), &AudioStreamMP3::get_data);