| 
									
										
										
										
											2023-01-05 13:25:55 +01:00
										 |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*  audio_stream.h                                                        */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*                         This file is part of:                          */ | 
					
						
							|  |  |  | /*                             GODOT ENGINE                               */ | 
					
						
							|  |  |  | /*                        https://godotengine.org                         */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ | 
					
						
							|  |  |  | /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur.                  */ | 
					
						
							|  |  |  | /*                                                                        */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining  */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the        */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including    */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,    */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to     */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to  */ | 
					
						
							|  |  |  | /* the following conditions:                                              */ | 
					
						
							|  |  |  | /*                                                                        */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be         */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.        */ | 
					
						
							|  |  |  | /*                                                                        */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,        */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF     */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY   */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,   */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE      */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                 */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | #ifndef AUDIO_STREAM_H
 | 
					
						
							|  |  |  | #define AUDIO_STREAM_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-07 19:33:38 -03:00
										 |  |  | #include "core/io/image.h"
 | 
					
						
							|  |  |  | #include "core/io/resource.h"
 | 
					
						
							| 
									
										
										
										
											2024-02-14 02:11:45 +01:00
										 |  |  | #include "scene/property_list_helper.h"
 | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | #include "servers/audio/audio_filter_sw.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | #include "servers/audio_server.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-23 14:53:27 -03:00
										 |  |  | #include "core/object/gdvirtual.gen.inc"
 | 
					
						
							|  |  |  | #include "core/variant/native_ptr.h"
 | 
					
						
							| 
									
										
										
										
											2023-12-23 17:30:32 +01:00
										 |  |  | #include "core/variant/typed_array.h"
 | 
					
						
							| 
									
										
										
										
											2021-08-23 14:53:27 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | class AudioStream; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-18 10:50:34 -04:00
										 |  |  | class AudioSamplePlayback : public RefCounted { | 
					
						
							|  |  |  | 	GDCLASS(AudioSamplePlayback, RefCounted); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	Ref<AudioStream> stream; | 
					
						
							| 
									
										
										
										
											2024-09-04 12:04:27 -04:00
										 |  |  | 	Ref<AudioStreamPlayback> stream_playback; | 
					
						
							| 
									
										
										
										
											2024-04-18 10:50:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	float offset = 0.0f; | 
					
						
							| 
									
										
										
										
											2024-08-20 10:29:32 -04:00
										 |  |  | 	float pitch_scale = 1.0; | 
					
						
							| 
									
										
										
										
											2024-04-18 10:50:34 -04:00
										 |  |  | 	Vector<AudioFrame> volume_vector; | 
					
						
							|  |  |  | 	StringName bus; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AudioSample : public RefCounted { | 
					
						
							|  |  |  | 	GDCLASS(AudioSample, RefCounted) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	enum LoopMode { | 
					
						
							|  |  |  | 		LOOP_DISABLED, | 
					
						
							|  |  |  | 		LOOP_FORWARD, | 
					
						
							|  |  |  | 		LOOP_PINGPONG, | 
					
						
							|  |  |  | 		LOOP_BACKWARD, | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Ref<AudioStream> stream; | 
					
						
							|  |  |  | 	Vector<AudioFrame> data; | 
					
						
							|  |  |  | 	int num_channels = 1; | 
					
						
							|  |  |  | 	int sample_rate = 44100; | 
					
						
							|  |  |  | 	LoopMode loop_mode = LOOP_DISABLED; | 
					
						
							|  |  |  | 	int loop_begin = 0; | 
					
						
							|  |  |  | 	int loop_end = 0; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ///////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-04 18:03:15 +02:00
										 |  |  | class AudioStreamPlayback : public RefCounted { | 
					
						
							|  |  |  | 	GDCLASS(AudioStreamPlayback, RefCounted); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-23 14:53:27 -03:00
										 |  |  | protected: | 
					
						
							|  |  |  | 	static void _bind_methods(); | 
					
						
							| 
									
										
										
										
											2022-09-22 08:54:15 -05:00
										 |  |  | 	GDVIRTUAL1(_start, double) | 
					
						
							| 
									
										
										
										
											2021-08-23 14:53:27 -03:00
										 |  |  | 	GDVIRTUAL0(_stop) | 
					
						
							|  |  |  | 	GDVIRTUAL0RC(bool, _is_playing) | 
					
						
							|  |  |  | 	GDVIRTUAL0RC(int, _get_loop_count) | 
					
						
							| 
									
										
										
										
											2022-09-22 08:54:15 -05:00
										 |  |  | 	GDVIRTUAL0RC(double, _get_playback_position) | 
					
						
							|  |  |  | 	GDVIRTUAL1(_seek, double) | 
					
						
							| 
									
										
										
										
											2024-06-18 10:07:35 -05:00
										 |  |  | 	GDVIRTUAL3R_REQUIRED(int, _mix, GDExtensionPtr<AudioFrame>, float, int) | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | 	GDVIRTUAL0(_tag_used_streams) | 
					
						
							| 
									
										
										
										
											2023-12-23 17:30:32 +01:00
										 |  |  | 	GDVIRTUAL2(_set_parameter, const StringName &, const Variant &) | 
					
						
							|  |  |  | 	GDVIRTUAL1RC(Variant, _get_parameter, const StringName &) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2022-09-22 08:54:15 -05:00
										 |  |  | 	virtual void start(double p_from_pos = 0.0); | 
					
						
							| 
									
										
										
										
											2021-08-23 14:53:27 -03:00
										 |  |  | 	virtual void stop(); | 
					
						
							|  |  |  | 	virtual bool is_playing() const; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-23 14:53:27 -03:00
										 |  |  | 	virtual int get_loop_count() const; //times it looped
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-22 08:54:15 -05:00
										 |  |  | 	virtual double get_playback_position() const; | 
					
						
							|  |  |  | 	virtual void seek(double p_time); | 
					
						
							| 
									
										
										
										
											2015-09-09 18:50:52 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | 	virtual void tag_used_streams(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-23 17:30:32 +01:00
										 |  |  | 	virtual void set_parameter(const StringName &p_name, const Variant &p_value); | 
					
						
							|  |  |  | 	virtual Variant get_parameter(const StringName &p_name) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 10:27:58 -07:00
										 |  |  | 	virtual int mix(AudioFrame *p_buffer, float p_rate_scale, int p_frames); | 
					
						
							| 
									
										
										
										
											2024-04-18 10:50:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	virtual void set_is_sample(bool p_is_sample) {} | 
					
						
							|  |  |  | 	virtual bool get_is_sample() const { return false; } | 
					
						
							|  |  |  | 	virtual Ref<AudioSamplePlayback> get_sample_playback() const; | 
					
						
							|  |  |  | 	virtual void set_sample_playback(const Ref<AudioSamplePlayback> &p_playback) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	AudioStreamPlayback(); | 
					
						
							|  |  |  | 	~AudioStreamPlayback(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | class AudioStreamPlaybackResampled : public AudioStreamPlayback { | 
					
						
							| 
									
										
										
										
											2019-03-19 14:35:57 -04:00
										 |  |  | 	GDCLASS(AudioStreamPlaybackResampled, AudioStreamPlayback); | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	enum { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		FP_BITS = 16, //fixed point used for resampling
 | 
					
						
							|  |  |  | 		FP_LEN = (1 << FP_BITS), | 
					
						
							|  |  |  | 		FP_MASK = FP_LEN - 1, | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | 		INTERNAL_BUFFER_LEN = 128, // 128 warrants 3ms positional jitter at much at 44100hz
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		CUBIC_INTERP_HISTORY = 4 | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2015-09-09 18:50:52 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	AudioFrame internal_buffer[INTERNAL_BUFFER_LEN + CUBIC_INTERP_HISTORY]; | 
					
						
							| 
									
										
										
										
											2021-08-27 10:27:58 -07:00
										 |  |  | 	unsigned int internal_buffer_end = -1; | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 	uint64_t mix_offset = 0; | 
					
						
							| 
									
										
										
										
											2015-09-09 18:50:52 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							| 
									
										
										
										
											2022-03-10 08:17:38 +01:00
										 |  |  | 	void begin_resample(); | 
					
						
							| 
									
										
										
										
											2021-08-27 10:27:58 -07:00
										 |  |  | 	// Returns the number of frames that were mixed.
 | 
					
						
							| 
									
										
										
										
											2022-03-10 08:17:38 +01:00
										 |  |  | 	virtual int _mix_internal(AudioFrame *p_buffer, int p_frames); | 
					
						
							|  |  |  | 	virtual float get_stream_sampling_rate(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-18 10:07:35 -05:00
										 |  |  | 	GDVIRTUAL2R_REQUIRED(int, _mix_resampled, GDExtensionPtr<AudioFrame>, int) | 
					
						
							|  |  |  | 	GDVIRTUAL0RC_REQUIRED(float, _get_stream_sampling_rate) | 
					
						
							| 
									
										
										
										
											2022-03-10 08:17:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	static void _bind_methods(); | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2021-08-27 10:27:58 -07:00
										 |  |  | 	virtual int mix(AudioFrame *p_buffer, float p_rate_scale, int p_frames) override; | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	AudioStreamPlaybackResampled() { mix_offset = 0; } | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AudioStream : public Resource { | 
					
						
							| 
									
										
										
										
											2019-03-19 14:35:57 -04:00
										 |  |  | 	GDCLASS(AudioStream, Resource); | 
					
						
							| 
									
										
										
										
											2020-01-26 11:24:14 +01:00
										 |  |  | 	OBJ_SAVE_TYPE(AudioStream); // Saves derived classes with common type so they can be interchanged.
 | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | 	enum { | 
					
						
							|  |  |  | 		MAX_TAGGED_OFFSETS = 8 | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	uint64_t tagged_frame = 0; | 
					
						
							|  |  |  | 	uint64_t offset_count = 0; | 
					
						
							|  |  |  | 	float tagged_offsets[MAX_TAGGED_OFFSETS]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-22 20:35:33 +01:00
										 |  |  | protected: | 
					
						
							|  |  |  | 	static void _bind_methods(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | 	GDVIRTUAL0RC(Ref<AudioStreamPlayback>, _instantiate_playback) | 
					
						
							| 
									
										
										
										
											2021-08-23 14:53:27 -03:00
										 |  |  | 	GDVIRTUAL0RC(String, _get_stream_name) | 
					
						
							| 
									
										
										
										
											2022-09-22 08:54:15 -05:00
										 |  |  | 	GDVIRTUAL0RC(double, _get_length) | 
					
						
							| 
									
										
										
										
											2021-08-27 21:51:03 -07:00
										 |  |  | 	GDVIRTUAL0RC(bool, _is_monophonic) | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | 	GDVIRTUAL0RC(double, _get_bpm) | 
					
						
							|  |  |  | 	GDVIRTUAL0RC(bool, _has_loop) | 
					
						
							|  |  |  | 	GDVIRTUAL0RC(int, _get_bar_beats) | 
					
						
							|  |  |  | 	GDVIRTUAL0RC(int, _get_beat_count) | 
					
						
							| 
									
										
										
										
											2023-12-23 17:30:32 +01:00
										 |  |  | 	GDVIRTUAL0RC(TypedArray<Dictionary>, _get_parameter_list) | 
					
						
							| 
									
										
										
										
											2021-08-23 14:53:27 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-09 18:50:52 -03:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | 	virtual Ref<AudioStreamPlayback> instantiate_playback(); | 
					
						
							| 
									
										
										
										
											2021-08-23 14:53:27 -03:00
										 |  |  | 	virtual String get_stream_name() const; | 
					
						
							| 
									
										
										
										
											2018-01-22 20:35:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | 	virtual double get_bpm() const; | 
					
						
							|  |  |  | 	virtual bool has_loop() const; | 
					
						
							|  |  |  | 	virtual int get_bar_beats() const; | 
					
						
							|  |  |  | 	virtual int get_beat_count() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-22 08:54:15 -05:00
										 |  |  | 	virtual double get_length() const; | 
					
						
							| 
									
										
										
										
											2021-08-27 21:51:03 -07:00
										 |  |  | 	virtual bool is_monophonic() const; | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	void tag_used(float p_offset); | 
					
						
							|  |  |  | 	uint64_t get_tagged_frame() const; | 
					
						
							|  |  |  | 	uint32_t get_tagged_frame_count() const; | 
					
						
							|  |  |  | 	float get_tagged_frame_offset(int p_index) const; | 
					
						
							| 
									
										
										
										
											2023-12-23 17:30:32 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	struct Parameter { | 
					
						
							|  |  |  | 		PropertyInfo property; | 
					
						
							|  |  |  | 		Variant default_value; | 
					
						
							|  |  |  | 		Parameter(const PropertyInfo &p_info = PropertyInfo(), const Variant &p_default_value = Variant()) { | 
					
						
							|  |  |  | 			property = p_info; | 
					
						
							|  |  |  | 			default_value = p_default_value; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual void get_parameter_list(List<Parameter> *r_parameters); | 
					
						
							| 
									
										
										
										
											2024-04-18 10:50:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	virtual bool can_be_sampled() const { return false; } | 
					
						
							|  |  |  | 	virtual Ref<AudioSample> generate_sample() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual bool is_meta_stream() const { return false; } | 
					
						
							| 
									
										
										
										
											2015-09-09 18:50:52 -03:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-27 07:54:56 +00:00
										 |  |  | // Microphone
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AudioStreamPlaybackMicrophone; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AudioStreamMicrophone : public AudioStream { | 
					
						
							| 
									
										
										
										
											2019-03-19 14:35:57 -04:00
										 |  |  | 	GDCLASS(AudioStreamMicrophone, AudioStream); | 
					
						
							| 
									
										
										
										
											2018-02-27 07:54:56 +00:00
										 |  |  | 	friend class AudioStreamPlaybackMicrophone; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 17:00:06 +02:00
										 |  |  | 	HashSet<AudioStreamPlaybackMicrophone *> playbacks; | 
					
						
							| 
									
										
										
										
											2018-02-27 07:54:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | 	virtual Ref<AudioStreamPlayback> instantiate_playback() override; | 
					
						
							| 
									
										
										
										
											2020-07-10 11:34:39 +01:00
										 |  |  | 	virtual String get_stream_name() const override; | 
					
						
							| 
									
										
										
										
											2018-02-27 07:54:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-22 08:54:15 -05:00
										 |  |  | 	virtual double get_length() const override; //if supported, otherwise return 0
 | 
					
						
							| 
									
										
										
										
											2018-02-27 07:54:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 21:51:03 -07:00
										 |  |  | 	virtual bool is_monophonic() const override; | 
					
						
							| 
									
										
										
										
											2018-02-27 07:54:56 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AudioStreamPlaybackMicrophone : public AudioStreamPlaybackResampled { | 
					
						
							| 
									
										
										
										
											2019-06-26 15:08:25 +02:00
										 |  |  | 	GDCLASS(AudioStreamPlaybackMicrophone, AudioStreamPlaybackResampled); | 
					
						
							| 
									
										
										
										
											2018-02-27 07:54:56 +00:00
										 |  |  | 	friend class AudioStreamMicrophone; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 	bool active = false; | 
					
						
							|  |  |  | 	unsigned int input_ofs = 0; | 
					
						
							| 
									
										
										
										
											2018-02-27 07:54:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Ref<AudioStreamMicrophone> microphone; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							| 
									
										
										
										
											2021-08-27 10:27:58 -07:00
										 |  |  | 	virtual int _mix_internal(AudioFrame *p_buffer, int p_frames) override; | 
					
						
							| 
									
										
										
										
											2020-07-10 11:34:39 +01:00
										 |  |  | 	virtual float get_stream_sampling_rate() override; | 
					
						
							| 
									
										
										
										
											2022-09-22 08:54:15 -05:00
										 |  |  | 	virtual double get_playback_position() const override; | 
					
						
							| 
									
										
										
										
											2018-02-27 07:54:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2021-08-27 10:27:58 -07:00
										 |  |  | 	virtual int mix(AudioFrame *p_buffer, float p_rate_scale, int p_frames) override; | 
					
						
							| 
									
										
										
										
											2018-02-27 07:54:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-22 08:54:15 -05:00
										 |  |  | 	virtual void start(double p_from_pos = 0.0) override; | 
					
						
							| 
									
										
										
										
											2020-07-10 11:34:39 +01:00
										 |  |  | 	virtual void stop() override; | 
					
						
							|  |  |  | 	virtual bool is_playing() const override; | 
					
						
							| 
									
										
										
										
											2018-02-27 07:54:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-10 11:34:39 +01:00
										 |  |  | 	virtual int get_loop_count() const override; //times it looped
 | 
					
						
							| 
									
										
										
										
											2018-02-27 07:54:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-22 08:54:15 -05:00
										 |  |  | 	virtual void seek(double p_time) override; | 
					
						
							| 
									
										
										
										
											2018-02-27 07:54:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | 	virtual void tag_used_streams() override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-27 07:54:56 +00:00
										 |  |  | 	~AudioStreamPlaybackMicrophone(); | 
					
						
							|  |  |  | 	AudioStreamPlaybackMicrophone(); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | class AudioStreamPlaybackRandomizer; | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | class AudioStreamRandomizer : public AudioStream { | 
					
						
							|  |  |  | 	GDCLASS(AudioStreamRandomizer, AudioStream); | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | public: | 
					
						
							|  |  |  | 	enum PlaybackMode { | 
					
						
							|  |  |  | 		PLAYBACK_RANDOM_NO_REPEATS, | 
					
						
							|  |  |  | 		PLAYBACK_RANDOM, | 
					
						
							|  |  |  | 		PLAYBACK_SEQUENTIAL, | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 	friend class AudioStreamPlaybackRandomizer; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	struct PoolEntry { | 
					
						
							|  |  |  | 		Ref<AudioStream> stream; | 
					
						
							| 
									
										
										
										
											2024-02-14 02:11:45 +01:00
										 |  |  | 		float weight = 1.0; | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-14 02:11:45 +01:00
										 |  |  | 	static inline PropertyListHelper base_property_helper; | 
					
						
							|  |  |  | 	PropertyListHelper property_helper; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 17:00:06 +02:00
										 |  |  | 	HashSet<AudioStreamPlaybackRandomizer *> playbacks; | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | 	Vector<PoolEntry> audio_stream_pool; | 
					
						
							| 
									
										
										
										
											2023-08-02 17:20:40 +02:00
										 |  |  | 	float random_pitch_scale = 1.0f; | 
					
						
							|  |  |  | 	float random_volume_offset_db = 0.0f; | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Ref<AudioStreamPlayback> instance_playback_random(); | 
					
						
							|  |  |  | 	Ref<AudioStreamPlayback> instance_playback_no_repeats(); | 
					
						
							|  |  |  | 	Ref<AudioStreamPlayback> instance_playback_sequential(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Ref<AudioStream> last_playback = nullptr; | 
					
						
							|  |  |  | 	PlaybackMode playback_mode = PLAYBACK_RANDOM_NO_REPEATS; | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  | 	static void _bind_methods(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-14 02:11:45 +01:00
										 |  |  | 	bool _set(const StringName &p_name, const Variant &p_value) { return property_helper.property_set_value(p_name, p_value); } | 
					
						
							|  |  |  | 	bool _get(const StringName &p_name, Variant &r_ret) const { return property_helper.property_get_value(p_name, r_ret); } | 
					
						
							| 
									
										
										
										
											2024-05-23 17:10:55 +02:00
										 |  |  | 	void _get_property_list(List<PropertyInfo> *p_list) const { property_helper.get_property_list(p_list); } | 
					
						
							| 
									
										
										
										
											2024-02-14 02:11:45 +01:00
										 |  |  | 	bool _property_can_revert(const StringName &p_name) const { return property_helper.property_can_revert(p_name); } | 
					
						
							|  |  |  | 	bool _property_get_revert(const StringName &p_name, Variant &r_property) const { return property_helper.property_get_revert(p_name, r_property); } | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2022-10-26 17:54:31 -04:00
										 |  |  | 	void add_stream(int p_index, Ref<AudioStream> p_stream, float p_weight = 1.0); | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | 	void move_stream(int p_index_from, int p_index_to); | 
					
						
							|  |  |  | 	void remove_stream(int p_index); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void set_stream(int p_index, Ref<AudioStream> p_stream); | 
					
						
							|  |  |  | 	Ref<AudioStream> get_stream(int p_index) const; | 
					
						
							|  |  |  | 	void set_stream_probability_weight(int p_index, float p_weight); | 
					
						
							|  |  |  | 	float get_stream_probability_weight(int p_index) const; | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | 	void set_streams_count(int p_count); | 
					
						
							|  |  |  | 	int get_streams_count() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void set_random_pitch(float p_pitch_scale); | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | 	float get_random_pitch() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | 	void set_random_volume_offset_db(float p_volume_offset_db); | 
					
						
							|  |  |  | 	float get_random_volume_offset_db() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void set_playback_mode(PlaybackMode p_playback_mode); | 
					
						
							|  |  |  | 	PlaybackMode get_playback_mode() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | 	virtual Ref<AudioStreamPlayback> instantiate_playback() override; | 
					
						
							| 
									
										
										
										
											2020-07-10 11:34:39 +01:00
										 |  |  | 	virtual String get_stream_name() const override; | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-22 08:54:15 -05:00
										 |  |  | 	virtual double get_length() const override; //if supported, otherwise return 0
 | 
					
						
							| 
									
										
										
										
											2021-08-27 21:51:03 -07:00
										 |  |  | 	virtual bool is_monophonic() const override; | 
					
						
							| 
									
										
										
										
											2018-01-22 20:35:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-18 10:50:34 -04:00
										 |  |  | 	virtual bool is_meta_stream() const override { return true; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | 	AudioStreamRandomizer(); | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | class AudioStreamPlaybackRandomizer : public AudioStreamPlayback { | 
					
						
							|  |  |  | 	GDCLASS(AudioStreamPlaybackRandomizer, AudioStreamPlayback); | 
					
						
							|  |  |  | 	friend class AudioStreamRandomizer; | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | 	Ref<AudioStreamRandomizer> randomizer; | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | 	Ref<AudioStreamPlayback> playback; | 
					
						
							|  |  |  | 	Ref<AudioStreamPlayback> playing; | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | 	float pitch_scale; | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | 	float volume_scale; | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2022-09-22 08:54:15 -05:00
										 |  |  | 	virtual void start(double p_from_pos = 0.0) override; | 
					
						
							| 
									
										
										
										
											2020-07-10 11:34:39 +01:00
										 |  |  | 	virtual void stop() override; | 
					
						
							|  |  |  | 	virtual bool is_playing() const override; | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-10 11:34:39 +01:00
										 |  |  | 	virtual int get_loop_count() const override; //times it looped
 | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-22 08:54:15 -05:00
										 |  |  | 	virtual double get_playback_position() const override; | 
					
						
							|  |  |  | 	virtual void seek(double p_time) override; | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 10:27:58 -07:00
										 |  |  | 	virtual int mix(AudioFrame *p_buffer, float p_rate_scale, int p_frames) override; | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | 	virtual void tag_used_streams() override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | 	~AudioStreamPlaybackRandomizer(); | 
					
						
							| 
									
										
										
										
											2017-07-15 01:23:10 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-11 23:57:09 -07:00
										 |  |  | VARIANT_ENUM_CAST(AudioStreamRandomizer::PlaybackMode); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | #endif // AUDIO_STREAM_H
 |