[AudioStreamGenerator] Add mixing rate presets, update docs.
This commit is contained in:
parent
296de7da83
commit
3965bdfd62
4 changed files with 73 additions and 11 deletions
|
|
@ -38,6 +38,15 @@ float AudioStreamGenerator::get_mix_rate() const {
|
|||
return mix_rate;
|
||||
}
|
||||
|
||||
void AudioStreamGenerator::set_mix_rate_mode(AudioStreamGenerator::AudioStreamGeneratorMixRate p_mix_rate_mode) {
|
||||
ERR_FAIL_INDEX(p_mix_rate_mode, AudioStreamGeneratorMixRate::MIX_RATE_MAX);
|
||||
mix_rate_mode = p_mix_rate_mode;
|
||||
}
|
||||
|
||||
AudioStreamGenerator::AudioStreamGeneratorMixRate AudioStreamGenerator::get_mix_rate_mode() const {
|
||||
return mix_rate_mode;
|
||||
}
|
||||
|
||||
void AudioStreamGenerator::set_buffer_length(float p_seconds) {
|
||||
buffer_len = p_seconds;
|
||||
}
|
||||
|
|
@ -46,11 +55,22 @@ float AudioStreamGenerator::get_buffer_length() const {
|
|||
return buffer_len;
|
||||
}
|
||||
|
||||
float AudioStreamGenerator::_get_target_rate() const {
|
||||
switch (mix_rate_mode) {
|
||||
case AudioStreamGeneratorMixRate::MIX_RATE_OUTPUT:
|
||||
return AudioServer::get_singleton()->get_mix_rate();
|
||||
case AudioStreamGeneratorMixRate::MIX_RATE_INPUT:
|
||||
return AudioServer::get_singleton()->get_input_mix_rate();
|
||||
default:
|
||||
return mix_rate;
|
||||
}
|
||||
}
|
||||
|
||||
Ref<AudioStreamPlayback> AudioStreamGenerator::instantiate_playback() {
|
||||
Ref<AudioStreamGeneratorPlayback> playback;
|
||||
playback.instantiate();
|
||||
playback->generator = this;
|
||||
int target_buffer_size = mix_rate * buffer_len;
|
||||
int target_buffer_size = _get_target_rate() * buffer_len;
|
||||
playback->buffer.resize(nearest_shift(target_buffer_size));
|
||||
playback->buffer.clear();
|
||||
return playback;
|
||||
|
|
@ -72,16 +92,20 @@ void AudioStreamGenerator::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_mix_rate", "hz"), &AudioStreamGenerator::set_mix_rate);
|
||||
ClassDB::bind_method(D_METHOD("get_mix_rate"), &AudioStreamGenerator::get_mix_rate);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_mix_rate_mode", "mode"), &AudioStreamGenerator::set_mix_rate_mode);
|
||||
ClassDB::bind_method(D_METHOD("get_mix_rate_mode"), &AudioStreamGenerator::get_mix_rate_mode);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_buffer_length", "seconds"), &AudioStreamGenerator::set_buffer_length);
|
||||
ClassDB::bind_method(D_METHOD("get_buffer_length"), &AudioStreamGenerator::get_buffer_length);
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "mix_rate_mode", PROPERTY_HINT_ENUM, "System Output Rate,System Input Rate,Custom Rate"), "set_mix_rate_mode", "get_mix_rate_mode");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "mix_rate", PROPERTY_HINT_RANGE, "20,192000,1,suffix:Hz"), "set_mix_rate", "get_mix_rate");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "buffer_length", PROPERTY_HINT_RANGE, "0.01,10,0.01,suffix:s"), "set_buffer_length", "get_buffer_length");
|
||||
}
|
||||
|
||||
AudioStreamGenerator::AudioStreamGenerator() {
|
||||
mix_rate = 44100;
|
||||
buffer_len = 0.5;
|
||||
BIND_ENUM_CONSTANT(MIX_RATE_OUTPUT);
|
||||
BIND_ENUM_CONSTANT(MIX_RATE_INPUT);
|
||||
BIND_ENUM_CONSTANT(MIX_RATE_CUSTOM);
|
||||
BIND_ENUM_CONSTANT(MIX_RATE_MAX);
|
||||
}
|
||||
|
||||
////////////////
|
||||
|
|
@ -162,12 +186,12 @@ int AudioStreamGeneratorPlayback::_mix_internal(AudioFrame *p_buffer, int p_fram
|
|||
skips++;
|
||||
}
|
||||
|
||||
mixed += p_frames / generator->get_mix_rate();
|
||||
mixed += p_frames / generator->_get_target_rate();
|
||||
return p_frames;
|
||||
}
|
||||
|
||||
float AudioStreamGeneratorPlayback::get_stream_sampling_rate() {
|
||||
return generator->get_mix_rate();
|
||||
return generator->_get_target_rate();
|
||||
}
|
||||
|
||||
void AudioStreamGeneratorPlayback::start(double p_from_pos) {
|
||||
|
|
|
|||
|
|
@ -37,16 +37,31 @@
|
|||
class AudioStreamGenerator : public AudioStream {
|
||||
GDCLASS(AudioStreamGenerator, AudioStream);
|
||||
|
||||
float mix_rate;
|
||||
float buffer_len;
|
||||
public:
|
||||
enum AudioStreamGeneratorMixRate {
|
||||
MIX_RATE_OUTPUT,
|
||||
MIX_RATE_INPUT,
|
||||
MIX_RATE_CUSTOM,
|
||||
MIX_RATE_MAX,
|
||||
};
|
||||
|
||||
private:
|
||||
AudioStreamGeneratorMixRate mix_rate_mode = MIX_RATE_CUSTOM;
|
||||
float mix_rate = 44100;
|
||||
float buffer_len = 0.5;
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
float _get_target_rate() const;
|
||||
|
||||
void set_mix_rate(float p_mix_rate);
|
||||
float get_mix_rate() const;
|
||||
|
||||
void set_mix_rate_mode(AudioStreamGeneratorMixRate p_mix_rate_mode);
|
||||
AudioStreamGeneratorMixRate get_mix_rate_mode() const;
|
||||
|
||||
void set_buffer_length(float p_seconds);
|
||||
float get_buffer_length() const;
|
||||
|
||||
|
|
@ -55,7 +70,7 @@ public:
|
|||
|
||||
virtual double get_length() const override;
|
||||
virtual bool is_monophonic() const override;
|
||||
AudioStreamGenerator();
|
||||
AudioStreamGenerator() {}
|
||||
};
|
||||
|
||||
class AudioStreamGeneratorPlayback : public AudioStreamPlaybackResampled {
|
||||
|
|
@ -96,4 +111,6 @@ public:
|
|||
AudioStreamGeneratorPlayback();
|
||||
};
|
||||
|
||||
VARIANT_ENUM_CAST(AudioStreamGenerator::AudioStreamGeneratorMixRate);
|
||||
|
||||
#endif // AUDIO_STREAM_GENERATOR_H
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue