Add samples playback support
This commit is contained in:
parent
eb20a68b32
commit
52fa4f05f3
42 changed files with 2611 additions and 46 deletions
|
|
@ -145,6 +145,22 @@ 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;
|
||||
}
|
||||
|
||||
void AudioStreamPlaybackMP3::set_parameter(const StringName &p_name, const Variant &p_value) {
|
||||
if (p_name == SNAME("looping")) {
|
||||
if (p_value == Variant()) {
|
||||
|
|
@ -287,6 +303,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);
|
||||
|
|
|
|||
|
|
@ -58,6 +58,9 @@ class AudioStreamPlaybackMP3 : public AudioStreamPlaybackResampled {
|
|||
|
||||
Ref<AudioStreamMP3> mp3_stream;
|
||||
|
||||
bool _is_sample = false;
|
||||
Ref<AudioSamplePlayback> sample_playback;
|
||||
|
||||
protected:
|
||||
virtual int _mix_internal(AudioFrame *p_buffer, int p_frames) override;
|
||||
virtual float get_stream_sampling_rate() override;
|
||||
|
|
@ -74,6 +77,11 @@ public:
|
|||
|
||||
virtual void tag_used_streams() override;
|
||||
|
||||
virtual void set_is_sample(bool p_is_sample) override;
|
||||
virtual bool get_is_sample() const override;
|
||||
virtual Ref<AudioSamplePlayback> get_sample_playback() const override;
|
||||
virtual void set_sample_playback(const Ref<AudioSamplePlayback> &p_playback) override;
|
||||
|
||||
virtual void set_parameter(const StringName &p_name, const Variant &p_value) override;
|
||||
virtual Variant get_parameter(const StringName &p_name) const override;
|
||||
|
||||
|
|
@ -131,6 +139,11 @@ public:
|
|||
|
||||
virtual bool is_monophonic() const override;
|
||||
|
||||
virtual bool can_be_sampled() const override {
|
||||
return true;
|
||||
}
|
||||
virtual Ref<AudioSample> generate_sample() const override;
|
||||
|
||||
virtual void get_parameter_list(List<Parameter> *r_parameters) override;
|
||||
|
||||
AudioStreamMP3();
|
||||
|
|
|
|||
|
|
@ -376,6 +376,22 @@ void AudioStreamPlaybackOggVorbis::seek(double p_time) {
|
|||
}
|
||||
}
|
||||
|
||||
void AudioStreamPlaybackOggVorbis::set_is_sample(bool p_is_sample) {
|
||||
_is_sample = p_is_sample;
|
||||
}
|
||||
|
||||
bool AudioStreamPlaybackOggVorbis::get_is_sample() const {
|
||||
return _is_sample;
|
||||
}
|
||||
|
||||
Ref<AudioSamplePlayback> AudioStreamPlaybackOggVorbis::get_sample_playback() const {
|
||||
return sample_playback;
|
||||
}
|
||||
|
||||
void AudioStreamPlaybackOggVorbis::set_sample_playback(const Ref<AudioSamplePlayback> &p_playback) {
|
||||
sample_playback = p_playback;
|
||||
}
|
||||
|
||||
AudioStreamPlaybackOggVorbis::~AudioStreamPlaybackOggVorbis() {
|
||||
if (block_is_allocated) {
|
||||
vorbis_block_clear(&block);
|
||||
|
|
@ -517,6 +533,18 @@ void AudioStreamOggVorbis::get_parameter_list(List<Parameter> *r_parameters) {
|
|||
r_parameters->push_back(Parameter(PropertyInfo(Variant::BOOL, "looping", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_CHECKABLE), Variant()));
|
||||
}
|
||||
|
||||
Ref<AudioSample> AudioStreamOggVorbis::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 AudioStreamOggVorbis::_bind_methods() {
|
||||
ClassDB::bind_static_method("AudioStreamOggVorbis", D_METHOD("load_from_buffer", "buffer"), &AudioStreamOggVorbis::load_from_buffer);
|
||||
ClassDB::bind_static_method("AudioStreamOggVorbis", D_METHOD("load_from_file", "path"), &AudioStreamOggVorbis::load_from_file);
|
||||
|
|
|
|||
|
|
@ -75,6 +75,9 @@ class AudioStreamPlaybackOggVorbis : public AudioStreamPlaybackResampled {
|
|||
Ref<OggPacketSequencePlayback> vorbis_data_playback;
|
||||
Ref<AudioStreamOggVorbis> vorbis_stream;
|
||||
|
||||
bool _is_sample = false;
|
||||
Ref<AudioSamplePlayback> sample_playback;
|
||||
|
||||
int _mix_frames(AudioFrame *p_buffer, int p_frames);
|
||||
int _mix_frames_vorbis(AudioFrame *p_buffer, int p_frames);
|
||||
|
||||
|
|
@ -100,6 +103,11 @@ public:
|
|||
virtual void set_parameter(const StringName &p_name, const Variant &p_value) override;
|
||||
virtual Variant get_parameter(const StringName &p_name) const override;
|
||||
|
||||
virtual void set_is_sample(bool p_is_sample) override;
|
||||
virtual bool get_is_sample() const override;
|
||||
virtual Ref<AudioSamplePlayback> get_sample_playback() const override;
|
||||
virtual void set_sample_playback(const Ref<AudioSamplePlayback> &p_playback) override;
|
||||
|
||||
AudioStreamPlaybackOggVorbis() {}
|
||||
~AudioStreamPlaybackOggVorbis();
|
||||
};
|
||||
|
|
@ -159,6 +167,11 @@ public:
|
|||
|
||||
virtual void get_parameter_list(List<Parameter> *r_parameters) override;
|
||||
|
||||
virtual bool can_be_sampled() const override {
|
||||
return true;
|
||||
}
|
||||
virtual Ref<AudioSample> generate_sample() const override;
|
||||
|
||||
AudioStreamOggVorbis();
|
||||
virtual ~AudioStreamOggVorbis();
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue