summaryrefslogtreecommitdiff
path: root/servers/audio_server.h
diff options
context:
space:
mode:
Diffstat (limited to 'servers/audio_server.h')
-rw-r--r--servers/audio_server.h134
1 files changed, 118 insertions, 16 deletions
diff --git a/servers/audio_server.h b/servers/audio_server.h
index 77aca39760..8cc31752ba 100644
--- a/servers/audio_server.h
+++ b/servers/audio_server.h
@@ -100,63 +100,148 @@ public:
};
+
+
class AudioServer : public Object {
GDCLASS( AudioServer, Object )
public:
- enum BusMode {
- BUS_MODE_STEREO,
- BUS_MODE_SURROUND
- };
-
//re-expose this her, as AudioDriver is not exposed to script
enum SpeakerMode {
SPEAKER_MODE_STEREO,
SPEAKER_SURROUND_51,
SPEAKER_SURROUND_71,
};
+
+ enum {
+ AUDIO_DATA_INVALID_ID=-1
+ };
+
+ typedef void (*AudioCallback)(void* p_userdata);
+
private:
uint32_t buffer_size;
+ uint64_t mix_count;
+ uint64_t mix_frames;
+
+ float channel_disable_treshold_db;
+ uint32_t channel_disable_frames;
+
+ int to_mix;
struct Bus {
- String name;
- BusMode mode;
- Vector<AudioFrame> buffer;
+ StringName name;
+ bool solo;
+ bool mute;
+ bool bypass;
+
+ //Each channel is a stereo pair.
+ struct Channel {
+ bool used;
+ bool active;
+ AudioFrame peak_volume;
+ Vector<AudioFrame> buffer;
+ Vector<Ref<AudioEffectInstance> > effect_instances;
+ uint64_t last_mix_with_audio;
+ Channel() { last_mix_with_audio=0; used=false; active=false; peak_volume=AudioFrame(0,0); }
+ };
+
+ Vector<Channel> channels;
+
struct Effect {
Ref<AudioEffect> effect;
- Ref<AudioEffectInstance> instance;
bool enabled;
};
Vector<Effect> effects;
-
float volume_db;
+ StringName send;
+ int index_cache;
};
- Vector<Bus> buses;
+ Vector< Vector<AudioFrame> >temp_buffer; //temp_buffer for each level
+ Vector<Bus*> buses;
+ Map<StringName,Bus*> bus_map;
+ _FORCE_INLINE_ int _get_channel_count() const {
+ switch (AudioDriver::get_singleton()->get_speaker_mode()) {
+ case AudioDriver::SPEAKER_MODE_STEREO: return 1;
+ case AudioDriver::SPEAKER_SURROUND_51: return 3;
+ case AudioDriver::SPEAKER_SURROUND_71: return 4;
+
+ }
+ ERR_FAIL_V(1);
+ }
+
+
+ void _update_bus_effects(int p_bus);
- static void _bind_methods();
static AudioServer* singleton;
+
+ // TODO create an audiodata pool to optimize memory
+
+
+ Map<void*,uint32_t> audio_data;
+ size_t audio_data_total_mem;
+ size_t audio_data_max_mem;
+
+ Mutex *audio_data_lock;
+
+ void _mix_step();
+
+ struct CallbackItem {
+
+ AudioCallback callback;
+ void *userdata;
+
+ bool operator<(const CallbackItem& p_item) const {
+ return (callback==p_item.callback ? userdata < p_item.userdata : callback < p_item.callback);
+ }
+ };
+
+ Set<CallbackItem> callbacks;
+
+
+
+friend class AudioDriver;
+ void _driver_process(int p_frames, int32_t *p_buffer);
+protected:
+
+ static void _bind_methods();
public:
+ //do not use from outside audio thread
+ AudioFrame *thread_get_channel_mix_buffer(int p_bus,int p_buffer);
+ int thread_get_mix_buffer_size() const;
+ int thread_find_bus_index(const StringName& p_name);
+
void set_bus_count(int p_count);
int get_bus_count() const;
- void set_bus_mode(int p_bus,BusMode p_mode);
- BusMode get_bus_mode(int p_bus) const;
-
void set_bus_name(int p_bus,const String& p_name);
String get_bus_name(int p_bus) const;
void set_bus_volume_db(int p_bus,float p_volume_db);
float get_bus_volume_db(int p_bus) const;
+
+ void set_bus_send(int p_bus,const StringName& p_send);
+ StringName get_bus_send(int p_bus) const;
+
+ void set_bus_solo(int p_bus,bool p_enable);
+ bool is_bus_solo(int p_bus) const;
+
+ void set_bus_mute(int p_bus,bool p_enable);
+ bool is_bus_mute(int p_bus) const;
+
+ void set_bus_bypass_effects(int p_bus,bool p_enable);
+ bool is_bus_bypassing_effects(int p_bus) const;
+
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);
@@ -168,6 +253,13 @@ public:
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;
+ void move_bus(int p_bus,int p_to_bus);
+
+ 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;
+
+ bool is_bus_channel_active(int p_bus,int p_channel) const;
+
virtual void init();
virtual void finish();
virtual void update();
@@ -188,11 +280,21 @@ public:
virtual double get_mix_time() const; //useful for video -> audio sync
virtual double get_output_delay() const;
+ void* audio_data_alloc(uint32_t p_data_len, const uint8_t *p_from_data=NULL);
+ void audio_data_free(void* p_data);
+
+ size_t audio_data_get_total_memory_usage() const;
+ size_t audio_data_get_max_memory_usage() const;
+
+
+ void add_callback(AudioCallback p_callback,void *p_userdata);
+ void remove_callback(AudioCallback p_callback,void *p_userdata);
+
AudioServer();
virtual ~AudioServer();
};
-VARIANT_ENUM_CAST( AudioServer::BusMode )
+
VARIANT_ENUM_CAST( AudioServer::SpeakerMode )
typedef AudioServer AS;