| 
									
										
										
										
											2023-01-05 13:25:55 +01:00
										 |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*  audio_server.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_SERVER_H
 | 
					
						
							|  |  |  | #define AUDIO_SERVER_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 18:13:45 +02:00
										 |  |  | #include "core/math/audio_frame.h"
 | 
					
						
							| 
									
										
										
										
											2020-11-07 19:33:38 -03:00
										 |  |  | #include "core/object/class_db.h"
 | 
					
						
							| 
									
										
										
										
											2018-09-11 18:13:45 +02:00
										 |  |  | #include "core/os/os.h"
 | 
					
						
							| 
									
										
										
										
											2021-08-27 10:28:23 -07:00
										 |  |  | #include "core/templates/safe_list.h"
 | 
					
						
							| 
									
										
										
										
											2020-11-07 19:33:38 -03:00
										 |  |  | #include "core/variant/variant.h"
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | #include "servers/audio/audio_effect.h"
 | 
					
						
							| 
									
										
										
										
											2021-08-27 10:28:23 -07:00
										 |  |  | #include "servers/audio/audio_filter_sw.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <atomic>
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-13 13:34:22 -03:00
										 |  |  | class AudioDriverDummy; | 
					
						
							| 
									
										
										
										
											2018-02-27 07:54:56 +00:00
										 |  |  | class AudioStream; | 
					
						
							| 
									
										
										
										
											2022-07-23 11:34:36 -03:00
										 |  |  | class AudioStreamWAV; | 
					
						
							| 
									
										
										
										
											2021-08-27 10:28:23 -07:00
										 |  |  | class AudioStreamPlayback; | 
					
						
							| 
									
										
										
										
											2017-09-13 13:34:22 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | class AudioDriver { | 
					
						
							|  |  |  | 	static AudioDriver *singleton; | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 	uint64_t _last_mix_time = 0; | 
					
						
							|  |  |  | 	uint64_t _last_mix_frames = 0; | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-20 21:02:02 -03:00
										 |  |  | #ifdef DEBUG_ENABLED
 | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 	uint64_t prof_ticks = 0; | 
					
						
							|  |  |  | 	uint64_t prof_time = 0; | 
					
						
							| 
									
										
										
										
											2018-06-20 21:02:02 -03:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | protected: | 
					
						
							| 
									
										
										
										
											2020-01-20 13:11:47 +01:00
										 |  |  | 	Vector<int32_t> input_buffer; | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 	unsigned int input_position = 0; | 
					
						
							|  |  |  | 	unsigned int input_size = 0; | 
					
						
							| 
									
										
										
										
											2018-07-03 22:08:43 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void audio_server_process(int p_frames, int32_t *p_buffer, bool p_update_mix_time = true); | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	void update_mix_time(int p_frames); | 
					
						
							| 
									
										
										
										
											2020-01-20 13:11:47 +01:00
										 |  |  | 	void input_buffer_init(int driver_buffer_frames); | 
					
						
							|  |  |  | 	void input_buffer_write(int32_t sample); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-09 22:39:14 -08:00
										 |  |  | 	int _get_configured_mix_rate(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-20 21:02:02 -03:00
										 |  |  | #ifdef DEBUG_ENABLED
 | 
					
						
							|  |  |  | 	_FORCE_INLINE_ void start_counting_ticks() { prof_ticks = OS::get_singleton()->get_ticks_usec(); } | 
					
						
							|  |  |  | 	_FORCE_INLINE_ void stop_counting_ticks() { prof_time += OS::get_singleton()->get_ticks_usec() - prof_ticks; } | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 	_FORCE_INLINE_ void start_counting_ticks() {} | 
					
						
							|  |  |  | 	_FORCE_INLINE_ void stop_counting_ticks() {} | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2021-01-08 20:29:49 -05:00
										 |  |  | 	double get_time_since_last_mix(); //useful for video -> audio sync
 | 
					
						
							|  |  |  | 	double get_time_to_next_mix(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	enum SpeakerMode { | 
					
						
							|  |  |  | 		SPEAKER_MODE_STEREO, | 
					
						
							| 
									
										
										
										
											2017-08-22 18:27:17 -03:00
										 |  |  | 		SPEAKER_SURROUND_31, | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 		SPEAKER_SURROUND_51, | 
					
						
							|  |  |  | 		SPEAKER_SURROUND_71, | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	static AudioDriver *get_singleton(); | 
					
						
							|  |  |  | 	void set_singleton(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-08 17:40:15 +02:00
										 |  |  | 	// Virtual API to implement.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	virtual const char *get_name() const = 0; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	virtual Error init() = 0; | 
					
						
							|  |  |  | 	virtual void start() = 0; | 
					
						
							|  |  |  | 	virtual int get_mix_rate() const = 0; | 
					
						
							|  |  |  | 	virtual SpeakerMode get_speaker_mode() const = 0; | 
					
						
							| 
									
										
										
										
											2023-02-08 17:40:15 +02:00
										 |  |  | 	virtual float get_latency() { return 0; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	virtual void lock() = 0; | 
					
						
							|  |  |  | 	virtual void unlock() = 0; | 
					
						
							|  |  |  | 	virtual void finish() = 0; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-08 17:40:15 +02:00
										 |  |  | 	virtual PackedStringArray get_output_device_list(); | 
					
						
							|  |  |  | 	virtual String get_output_device(); | 
					
						
							|  |  |  | 	virtual void set_output_device(const String &p_name) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual Error input_start() { return FAILED; } | 
					
						
							|  |  |  | 	virtual Error input_stop() { return FAILED; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-24 08:41:40 -06:00
										 |  |  | 	virtual PackedStringArray get_input_device_list(); | 
					
						
							| 
									
										
										
										
											2023-02-08 17:40:15 +02:00
										 |  |  | 	virtual String get_input_device() { return "Default"; } | 
					
						
							|  |  |  | 	virtual void set_input_device(const String &p_name) {} | 
					
						
							| 
									
										
										
										
											2018-02-27 07:54:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-08 17:40:15 +02:00
										 |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-22 18:27:17 -03:00
										 |  |  | 	SpeakerMode get_speaker_mode_by_total_channels(int p_channels) const; | 
					
						
							|  |  |  | 	int get_total_channels_by_speaker_mode(SpeakerMode) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-20 13:11:47 +01:00
										 |  |  | 	Vector<int32_t> get_input_buffer() { return input_buffer; } | 
					
						
							|  |  |  | 	unsigned int get_input_position() { return input_position; } | 
					
						
							|  |  |  | 	unsigned int get_input_size() { return input_size; } | 
					
						
							| 
									
										
										
										
											2019-10-11 23:40:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-20 21:02:02 -03:00
										 |  |  | #ifdef DEBUG_ENABLED
 | 
					
						
							|  |  |  | 	uint64_t get_profiling_time() const { return prof_time; } | 
					
						
							|  |  |  | 	void reset_profiling_time() { prof_time = 0; } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 	AudioDriver() {} | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	virtual ~AudioDriver() {} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | class AudioDriverManager { | 
					
						
							|  |  |  | 	enum { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		MAX_DRIVERS = 10 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	static AudioDriver *drivers[MAX_DRIVERS]; | 
					
						
							|  |  |  | 	static int driver_count; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-13 13:34:22 -03:00
										 |  |  | 	static AudioDriverDummy dummy_driver; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2022-12-09 22:39:14 -08:00
										 |  |  | 	static const int DEFAULT_MIX_RATE = 44100; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	static void add_driver(AudioDriver *p_driver); | 
					
						
							| 
									
										
										
										
											2017-09-13 13:34:22 -03:00
										 |  |  | 	static void initialize(int p_driver); | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	static int get_driver_count(); | 
					
						
							|  |  |  | 	static AudioDriver *get_driver(int p_driver); | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 14:30:40 -03:00
										 |  |  | class AudioBusLayout; | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | class AudioServer : public Object { | 
					
						
							| 
									
										
										
										
											2019-03-19 14:35:57 -04:00
										 |  |  | 	GDCLASS(AudioServer, Object); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2019-05-30 13:47:18 +02:00
										 |  |  | 	//re-expose this here, as AudioDriver is not exposed to script
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	enum SpeakerMode { | 
					
						
							|  |  |  | 		SPEAKER_MODE_STEREO, | 
					
						
							| 
									
										
										
										
											2017-08-22 18:27:17 -03:00
										 |  |  | 		SPEAKER_SURROUND_31, | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 		SPEAKER_SURROUND_51, | 
					
						
							|  |  |  | 		SPEAKER_SURROUND_71, | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	enum { | 
					
						
							| 
									
										
										
										
											2021-08-27 10:28:23 -07:00
										 |  |  | 		AUDIO_DATA_INVALID_ID = -1, | 
					
						
							|  |  |  | 		MAX_CHANNELS_PER_BUS = 4, | 
					
						
							|  |  |  | 		MAX_BUSES_PER_PLAYBACK = 6, | 
					
						
							| 
									
										
										
										
											2021-08-27 21:51:03 -07:00
										 |  |  | 		LOOKAHEAD_BUFFER_SIZE = 64, | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	typedef void (*AudioCallback)(void *p_userdata); | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 	uint64_t mix_time = 0; | 
					
						
							|  |  |  | 	int mix_size = 0; | 
					
						
							| 
									
										
										
										
											2019-04-27 12:22:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 	uint32_t buffer_size = 0; | 
					
						
							|  |  |  | 	uint64_t mix_count = 0; | 
					
						
							|  |  |  | 	uint64_t mix_frames = 0; | 
					
						
							| 
									
										
										
										
											2018-06-20 21:02:02 -03:00
										 |  |  | #ifdef DEBUG_ENABLED
 | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 	uint64_t prof_time = 0; | 
					
						
							| 
									
										
										
										
											2018-06-20 21:02:02 -03:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 	float channel_disable_threshold_db = 0.0f; | 
					
						
							|  |  |  | 	uint32_t channel_disable_frames = 0; | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 	int channel_count = 0; | 
					
						
							|  |  |  | 	int to_mix = 0; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 	float playback_speed_scale = 1.0f; | 
					
						
							| 
									
										
										
										
											2019-06-02 20:01:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | 	bool tag_used_audio_streams = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	struct Bus { | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 		StringName name; | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 		bool solo = false; | 
					
						
							|  |  |  | 		bool mute = false; | 
					
						
							|  |  |  | 		bool bypass = false; | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 		bool soloed = false; | 
					
						
							| 
									
										
										
										
											2017-08-18 18:19:12 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 		// Each channel is a stereo pair.
 | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 		struct Channel { | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 			bool used = false; | 
					
						
							|  |  |  | 			bool active = false; | 
					
						
							|  |  |  | 			AudioFrame peak_volume = AudioFrame(AUDIO_MIN_PEAK_DB, AUDIO_MIN_PEAK_DB); | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 			Vector<AudioFrame> buffer; | 
					
						
							| 
									
										
										
										
											2020-03-17 07:33:00 +01:00
										 |  |  | 			Vector<Ref<AudioEffectInstance>> effect_instances; | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 			uint64_t last_mix_with_audio = 0; | 
					
						
							|  |  |  | 			Channel() {} | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Vector<Channel> channels; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 		struct Effect { | 
					
						
							|  |  |  | 			Ref<AudioEffect> effect; | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 			bool enabled = false; | 
					
						
							| 
									
										
										
										
											2018-06-20 21:02:02 -03:00
										 |  |  | #ifdef DEBUG_ENABLED
 | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 			uint64_t prof_time = 0; | 
					
						
							| 
									
										
										
										
											2018-06-20 21:02:02 -03:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 		Vector<Effect> effects; | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 		float volume_db = 0.0f; | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 		StringName send; | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 		int index_cache = 0; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 10:28:23 -07:00
										 |  |  | 	struct AudioStreamPlaybackBusDetails { | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 		bool bus_active[MAX_BUSES_PER_PLAYBACK] = {}; | 
					
						
							| 
									
										
										
										
											2021-08-27 10:28:23 -07:00
										 |  |  | 		StringName bus[MAX_BUSES_PER_PLAYBACK]; | 
					
						
							|  |  |  | 		AudioFrame volume[MAX_BUSES_PER_PLAYBACK][MAX_CHANNELS_PER_BUS]; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	struct AudioStreamPlaybackListNode { | 
					
						
							|  |  |  | 		enum PlaybackState { | 
					
						
							|  |  |  | 			PAUSED = 0, // Paused. Keep this stream playback around though so it can be restarted.
 | 
					
						
							|  |  |  | 			PLAYING = 1, // Playing. Fading may still be necessary if volume changes!
 | 
					
						
							|  |  |  | 			FADE_OUT_TO_PAUSE = 2, // About to pause.
 | 
					
						
							|  |  |  | 			FADE_OUT_TO_DELETION = 3, // About to stop.
 | 
					
						
							|  |  |  | 			AWAITING_DELETION = 4, | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 		// If zero or positive, a place in the stream to seek to during the next mix.
 | 
					
						
							|  |  |  | 		SafeNumeric<float> setseek; | 
					
						
							|  |  |  | 		SafeNumeric<float> pitch_scale; | 
					
						
							|  |  |  | 		SafeNumeric<float> highshelf_gain; | 
					
						
							|  |  |  | 		SafeNumeric<float> attenuation_filter_cutoff_hz; // This isn't used unless highshelf_gain is nonzero.
 | 
					
						
							|  |  |  | 		AudioFilterSW::Processor filter_process[8]; | 
					
						
							|  |  |  | 		// Updating this ref after the list node is created breaks consistency guarantees, don't do it!
 | 
					
						
							|  |  |  | 		Ref<AudioStreamPlayback> stream_playback; | 
					
						
							|  |  |  | 		// Playback state determines the fate of a particular AudioStreamListNode during the mix step. Must be atomically replaced.
 | 
					
						
							|  |  |  | 		std::atomic<PlaybackState> state = AWAITING_DELETION; | 
					
						
							|  |  |  | 		// This data should only ever be modified by an atomic replacement of the pointer.
 | 
					
						
							|  |  |  | 		std::atomic<AudioStreamPlaybackBusDetails *> bus_details = nullptr; | 
					
						
							|  |  |  | 		// Previous bus details should only be accessed on the audio thread.
 | 
					
						
							|  |  |  | 		AudioStreamPlaybackBusDetails *prev_bus_details = nullptr; | 
					
						
							|  |  |  | 		// The next few samples are stored here so we have some time to fade audio out if it ends abruptly at the beginning of the next mix.
 | 
					
						
							|  |  |  | 		AudioFrame lookahead[LOOKAHEAD_BUFFER_SIZE]; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SafeList<AudioStreamPlaybackListNode *> playback_list; | 
					
						
							|  |  |  | 	SafeList<AudioStreamPlaybackBusDetails *> bus_details_graveyard; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 21:51:03 -07:00
										 |  |  | 	// TODO document if this is necessary.
 | 
					
						
							|  |  |  | 	SafeList<AudioStreamPlaybackBusDetails *> bus_details_graveyard_frame_old; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-17 07:33:00 +01:00
										 |  |  | 	Vector<Vector<AudioFrame>> temp_buffer; //temp_buffer for each level
 | 
					
						
							| 
									
										
										
										
											2021-08-27 10:28:23 -07:00
										 |  |  | 	Vector<AudioFrame> mix_buffer; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Vector<Bus *> buses; | 
					
						
							| 
									
										
										
										
											2022-05-13 15:04:37 +02:00
										 |  |  | 	HashMap<StringName, Bus *> bus_map; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 	void _update_bus_effects(int p_bus); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	static AudioServer *singleton; | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-17 22:43:32 -03:00
										 |  |  | 	void init_channels_and_buffers(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 	void _mix_step(); | 
					
						
							| 
									
										
										
										
											2021-08-27 10:28:23 -07:00
										 |  |  | 	void _mix_step_for_channel(AudioFrame *p_out_buf, AudioFrame *p_source_buf, AudioFrame p_vol_start, AudioFrame p_vol_final, float p_attenuation_filter_cutoff_hz, float p_highshelf_gain, AudioFilterSW::Processor *p_processor_l, AudioFilterSW::Processor *p_processor_r); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Should only be called on the main thread.
 | 
					
						
							|  |  |  | 	AudioStreamPlaybackListNode *_find_playback_list_node(Ref<AudioStreamPlayback> p_playback); | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	struct CallbackItem { | 
					
						
							|  |  |  | 		AudioCallback callback; | 
					
						
							| 
									
										
										
										
											2022-04-04 15:06:57 +02:00
										 |  |  | 		void *userdata = nullptr; | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 10:28:23 -07:00
										 |  |  | 	SafeList<CallbackItem *> update_callback_list; | 
					
						
							|  |  |  | 	SafeList<CallbackItem *> mix_callback_list; | 
					
						
							|  |  |  | 	SafeList<CallbackItem *> listener_changed_callback_list; | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	friend class AudioDriver; | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 	void _driver_process(int p_frames, int32_t *p_buffer); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | protected: | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 	static void _bind_methods(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2017-08-22 18:27:17 -03:00
										 |  |  | 	_FORCE_INLINE_ int get_channel_count() const { | 
					
						
							|  |  |  | 		switch (get_speaker_mode()) { | 
					
						
							| 
									
										
										
										
											2020-05-10 13:00:47 +02:00
										 |  |  | 			case SPEAKER_MODE_STEREO: | 
					
						
							|  |  |  | 				return 1; | 
					
						
							|  |  |  | 			case SPEAKER_SURROUND_31: | 
					
						
							|  |  |  | 				return 2; | 
					
						
							|  |  |  | 			case SPEAKER_SURROUND_51: | 
					
						
							|  |  |  | 				return 3; | 
					
						
							|  |  |  | 			case SPEAKER_SURROUND_71: | 
					
						
							|  |  |  | 				return 4; | 
					
						
							| 
									
										
										
										
											2017-08-22 18:27:17 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		ERR_FAIL_V(1); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 	// Do not use from outside audio thread.
 | 
					
						
							| 
									
										
										
										
											2018-11-13 18:16:33 -03:00
										 |  |  | 	bool thread_has_channel_mix_buffer(int p_bus, int p_buffer) const; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	AudioFrame *thread_get_channel_mix_buffer(int p_bus, int p_buffer); | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 	int thread_get_mix_buffer_size() const; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int thread_find_bus_index(const StringName &p_name); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	void set_bus_count(int p_count); | 
					
						
							|  |  |  | 	int get_bus_count() const; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-23 23:12:08 -03:00
										 |  |  | 	void remove_bus(int p_index); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void add_bus(int p_at_pos = -1); | 
					
						
							| 
									
										
										
										
											2017-01-23 23:12:08 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void move_bus(int p_bus, int p_to_pos); | 
					
						
							| 
									
										
										
										
											2017-01-23 23:12:08 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void set_bus_name(int p_bus, const String &p_name); | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	String get_bus_name(int p_bus) const; | 
					
						
							| 
									
										
										
										
											2017-07-10 21:51:29 +01:00
										 |  |  | 	int get_bus_index(const StringName &p_bus_name) const; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-07 13:38:40 -03:00
										 |  |  | 	int get_bus_channels(int p_bus) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void set_bus_volume_db(int p_bus, float p_volume_db); | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	float get_bus_volume_db(int p_bus) const; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void set_bus_send(int p_bus, const StringName &p_send); | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 	StringName get_bus_send(int p_bus) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void set_bus_solo(int p_bus, bool p_enable); | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 	bool is_bus_solo(int p_bus) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void set_bus_mute(int p_bus, bool p_enable); | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 	bool is_bus_mute(int p_bus) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void set_bus_bypass_effects(int p_bus, bool p_enable); | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 	bool is_bus_bypassing_effects(int p_bus) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void add_bus_effect(int p_bus, const Ref<AudioEffect> &p_effect, int p_at_pos = -1); | 
					
						
							|  |  |  | 	void remove_bus_effect(int p_bus, int p_effect); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	int get_bus_effect_count(int p_bus); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Ref<AudioEffect> get_bus_effect(int p_bus, int p_effect); | 
					
						
							| 
									
										
										
										
											2019-04-10 12:57:03 -03:00
										 |  |  | 	Ref<AudioEffectInstance> get_bus_effect_instance(int p_bus, int p_effect, int p_channel = 0); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void swap_bus_effects(int p_bus, int p_effect, int p_by_effect); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void set_bus_effect_enabled(int p_bus, int p_effect, bool p_enabled); | 
					
						
							|  |  |  | 	bool is_bus_effect_enabled(int p_bus, int p_effect) const; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	float get_bus_peak_volume_left_db(int p_bus, int p_channel) const; | 
					
						
							|  |  |  | 	float get_bus_peak_volume_right_db(int p_bus, int p_channel) const; | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	bool is_bus_channel_active(int p_bus, int p_channel) const; | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-07 13:46:33 -03:00
										 |  |  | 	void set_playback_speed_scale(float p_scale); | 
					
						
							|  |  |  | 	float get_playback_speed_scale() const; | 
					
						
							| 
									
										
										
										
											2019-06-02 20:01:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 21:51:03 -07:00
										 |  |  | 	// Convenience method.
 | 
					
						
							| 
									
										
										
										
											2021-10-10 13:20:56 -03:00
										 |  |  | 	void start_playback_stream(Ref<AudioStreamPlayback> p_playback, StringName p_bus, Vector<AudioFrame> p_volume_db_vector, float p_start_time = 0, float p_pitch_scale = 1); | 
					
						
							| 
									
										
										
										
											2021-08-27 21:51:03 -07:00
										 |  |  | 	// Expose all parameters.
 | 
					
						
							| 
									
										
										
										
											2022-05-13 15:04:37 +02:00
										 |  |  | 	void start_playback_stream(Ref<AudioStreamPlayback> p_playback, HashMap<StringName, Vector<AudioFrame>> p_bus_volumes, float p_start_time = 0, float p_pitch_scale = 1, float p_highshelf_gain = 0, float p_attenuation_cutoff_hz = 0); | 
					
						
							| 
									
										
										
										
											2021-08-27 10:28:23 -07:00
										 |  |  | 	void stop_playback_stream(Ref<AudioStreamPlayback> p_playback); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void set_playback_bus_exclusive(Ref<AudioStreamPlayback> p_playback, StringName p_bus, Vector<AudioFrame> p_volumes); | 
					
						
							| 
									
										
										
										
											2022-05-13 15:04:37 +02:00
										 |  |  | 	void set_playback_bus_volumes_linear(Ref<AudioStreamPlayback> p_playback, HashMap<StringName, Vector<AudioFrame>> p_bus_volumes); | 
					
						
							| 
									
										
										
										
											2021-08-27 10:28:23 -07:00
										 |  |  | 	void set_playback_all_bus_volumes_linear(Ref<AudioStreamPlayback> p_playback, Vector<AudioFrame> p_volumes); | 
					
						
							|  |  |  | 	void set_playback_pitch_scale(Ref<AudioStreamPlayback> p_playback, float p_pitch_scale); | 
					
						
							|  |  |  | 	void set_playback_paused(Ref<AudioStreamPlayback> p_playback, bool p_paused); | 
					
						
							|  |  |  | 	void set_playback_highshelf_params(Ref<AudioStreamPlayback> p_playback, float p_gain, float p_attenuation_cutoff_hz); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bool is_playback_active(Ref<AudioStreamPlayback> p_playback); | 
					
						
							|  |  |  | 	float get_playback_position(Ref<AudioStreamPlayback> p_playback); | 
					
						
							|  |  |  | 	bool is_playback_paused(Ref<AudioStreamPlayback> p_playback); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	uint64_t get_mix_count() const; | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | 	uint64_t get_mixed_frames() const; | 
					
						
							| 
									
										
										
										
											2021-08-27 10:28:23 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	void notify_listener_changed(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	virtual void init(); | 
					
						
							|  |  |  | 	virtual void finish(); | 
					
						
							| 
									
										
										
										
											2018-06-20 21:02:02 -03:00
										 |  |  | 	virtual void update(); | 
					
						
							| 
									
										
										
										
											2017-01-25 14:30:40 -03:00
										 |  |  | 	virtual void load_default_bus_layout(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* MISC config */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	virtual void lock(); | 
					
						
							|  |  |  | 	virtual void unlock(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	virtual SpeakerMode get_speaker_mode() const; | 
					
						
							|  |  |  | 	virtual float get_mix_rate() const; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | 	virtual float read_output_peak_db() const; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	static AudioServer *get_singleton(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-27 12:22:47 -03:00
										 |  |  | 	virtual double get_output_latency() const; | 
					
						
							|  |  |  | 	virtual double get_time_to_next_mix() const; | 
					
						
							| 
									
										
										
										
											2019-04-27 14:05:16 -03:00
										 |  |  | 	virtual double get_time_since_last_mix() const; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 10:28:23 -07:00
										 |  |  | 	void add_listener_changed_callback(AudioCallback p_callback, void *p_userdata); | 
					
						
							|  |  |  | 	void remove_listener_changed_callback(AudioCallback p_callback, void *p_userdata); | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-10 10:58:29 -03:00
										 |  |  | 	void add_update_callback(AudioCallback p_callback, void *p_userdata); | 
					
						
							|  |  |  | 	void remove_update_callback(AudioCallback p_callback, void *p_userdata); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 10:28:23 -07:00
										 |  |  | 	void add_mix_callback(AudioCallback p_callback, void *p_userdata); | 
					
						
							|  |  |  | 	void remove_mix_callback(AudioCallback p_callback, void *p_userdata); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-13 16:45:27 +01:00
										 |  |  | 	void set_bus_layout(const Ref<AudioBusLayout> &p_bus_layout); | 
					
						
							| 
									
										
										
										
											2017-01-25 14:30:40 -03:00
										 |  |  | 	Ref<AudioBusLayout> generate_bus_layout() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-24 08:41:40 -06:00
										 |  |  | 	PackedStringArray get_output_device_list(); | 
					
						
							|  |  |  | 	String get_output_device(); | 
					
						
							| 
									
										
										
										
											2023-02-08 17:40:15 +02:00
										 |  |  | 	void set_output_device(const String &p_name); | 
					
						
							| 
									
										
										
										
											2018-03-25 00:43:51 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-24 08:41:40 -06:00
										 |  |  | 	PackedStringArray get_input_device_list(); | 
					
						
							|  |  |  | 	String get_input_device(); | 
					
						
							|  |  |  | 	void set_input_device(const String &p_name); | 
					
						
							| 
									
										
										
										
											2018-07-16 22:43:47 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-21 01:00:58 +02:00
										 |  |  | 	void set_enable_tagging_used_audio_streams(bool p_enable); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	AudioServer(); | 
					
						
							|  |  |  | 	virtual ~AudioServer(); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | VARIANT_ENUM_CAST(AudioServer::SpeakerMode) | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 14:30:40 -03:00
										 |  |  | class AudioBusLayout : public Resource { | 
					
						
							| 
									
										
										
										
											2019-03-19 14:35:57 -04:00
										 |  |  | 	GDCLASS(AudioBusLayout, Resource); | 
					
						
							| 
									
										
										
										
											2017-01-25 14:30:40 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	friend class AudioServer; | 
					
						
							| 
									
										
										
										
											2017-01-25 14:30:40 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	struct Bus { | 
					
						
							|  |  |  | 		StringName name; | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 		bool solo = false; | 
					
						
							|  |  |  | 		bool mute = false; | 
					
						
							|  |  |  | 		bool bypass = false; | 
					
						
							| 
									
										
										
										
											2017-01-25 14:30:40 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		struct Effect { | 
					
						
							|  |  |  | 			Ref<AudioEffect> effect; | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 			bool enabled = false; | 
					
						
							| 
									
										
										
										
											2017-01-25 14:30:40 -03:00
										 |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Vector<Effect> effects; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 		float volume_db = 0.0f; | 
					
						
							| 
									
										
										
										
											2017-01-25 14:30:40 -03:00
										 |  |  | 		StringName send; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-02 16:28:25 +02:00
										 |  |  | 		Bus() {} | 
					
						
							| 
									
										
										
										
											2017-01-25 14:30:40 -03:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Vector<Bus> buses; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	bool _set(const StringName &p_name, const Variant &p_value); | 
					
						
							|  |  |  | 	bool _get(const StringName &p_name, Variant &r_ret) const; | 
					
						
							|  |  |  | 	void _get_property_list(List<PropertyInfo> *p_list) const; | 
					
						
							| 
									
										
										
										
											2017-01-25 14:30:40 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	AudioBusLayout(); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | typedef AudioServer AS; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // AUDIO_SERVER_H
 |