|
@@ -38,6 +38,15 @@ float AudioStreamGenerator::get_mix_rate() const {
|
|
return mix_rate;
|
|
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) {
|
|
void AudioStreamGenerator::set_buffer_length(float p_seconds) {
|
|
buffer_len = p_seconds;
|
|
buffer_len = p_seconds;
|
|
}
|
|
}
|
|
@@ -46,11 +55,22 @@ float AudioStreamGenerator::get_buffer_length() const {
|
|
return buffer_len;
|
|
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<AudioStreamPlayback> AudioStreamGenerator::instantiate_playback() {
|
|
Ref<AudioStreamGeneratorPlayback> playback;
|
|
Ref<AudioStreamGeneratorPlayback> playback;
|
|
playback.instantiate();
|
|
playback.instantiate();
|
|
playback->generator = this;
|
|
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.resize(nearest_shift(target_buffer_size));
|
|
playback->buffer.clear();
|
|
playback->buffer.clear();
|
|
return playback;
|
|
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("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("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("set_buffer_length", "seconds"), &AudioStreamGenerator::set_buffer_length);
|
|
ClassDB::bind_method(D_METHOD("get_buffer_length"), &AudioStreamGenerator::get_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, "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");
|
|
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++;
|
|
skips++;
|
|
}
|
|
}
|
|
|
|
|
|
- mixed += p_frames / generator->get_mix_rate();
|
|
|
|
|
|
+ mixed += p_frames / generator->_get_target_rate();
|
|
return p_frames;
|
|
return p_frames;
|
|
}
|
|
}
|
|
|
|
|
|
float AudioStreamGeneratorPlayback::get_stream_sampling_rate() {
|
|
float AudioStreamGeneratorPlayback::get_stream_sampling_rate() {
|
|
- return generator->get_mix_rate();
|
|
|
|
|
|
+ return generator->_get_target_rate();
|
|
}
|
|
}
|
|
|
|
|
|
void AudioStreamGeneratorPlayback::start(double p_from_pos) {
|
|
void AudioStreamGeneratorPlayback::start(double p_from_pos) {
|