diff options
Diffstat (limited to 'servers/audio_server.cpp')
-rw-r--r-- | servers/audio_server.cpp | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/servers/audio_server.cpp b/servers/audio_server.cpp new file mode 100644 index 0000000000..81dab367c1 --- /dev/null +++ b/servers/audio_server.cpp @@ -0,0 +1,178 @@ +/*************************************************************************/ +/* audio_server.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* 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. */ +/*************************************************************************/ +#include "audio_server.h" +#include "globals.h" + +void AudioMixer::audio_mixer_chunk_call(int p_frames) { + + AudioServer::get_singleton()->audio_mixer_chunk_callback(p_frames); +} + +AudioMixer *AudioServer::EventStream::get_mixer() const { + + return AudioServer::get_singleton()->get_mixer(); +} + +AudioServer *AudioServer::singleton=NULL; + +AudioServer *AudioServer::get_singleton() { + + return singleton; +} + +void AudioServer::sample_set_signed_data(RID p_sample, const DVector<float>& p_buffer) { + + int len = p_buffer.size(); + ERR_FAIL_COND( len == 0 ); + + DVector<uint8_t> data; + data.resize(len*2); + DVector<uint8_t>::Write w=data.write(); + + int16_t *samples = (int16_t*)w.ptr(); + + DVector<float>::Read r = p_buffer.read(); + + for(int i=0;i<len;i++) { + + float sample = r[i]; + sample = Math::floor( sample * (1<<16) ); + if (sample<-32768) + sample=-32768; + else if (sample>32767) + sample=32767; + samples[i]=sample; + } + + w = DVector<uint8_t>::Write(); + + sample_set_data(p_sample,data); + + +} + +void AudioServer::_bind_methods() { + + ObjectTypeDB::bind_method(_MD("sample_create","format","stereo","length"), &AudioServer::sample_create ); + ObjectTypeDB::bind_method(_MD("sample_set_description","sample","description"), &AudioServer::sample_set_description ); + ObjectTypeDB::bind_method(_MD("sample_get_description","sample"), &AudioServer::sample_get_description ); + + ObjectTypeDB::bind_method(_MD("sample_get_format","sample"), &AudioServer::sample_get_format ); + ObjectTypeDB::bind_method(_MD("sample_is_stereo","sample"), &AudioServer::sample_is_stereo ); + ObjectTypeDB::bind_method(_MD("sample_get_length","sample"), &AudioServer::sample_get_length ); + + ObjectTypeDB::bind_method(_MD("sample_set_signed_data","sample","data"), &AudioServer::sample_set_signed_data ); + ObjectTypeDB::bind_method(_MD("sample_set_data","sample"), &AudioServer::sample_set_data ); + ObjectTypeDB::bind_method(_MD("sample_get_data","sample"), &AudioServer::sample_get_data ); + + ObjectTypeDB::bind_method(_MD("sample_set_mix_rate","sample","mix_rate"), &AudioServer::sample_set_mix_rate ); + ObjectTypeDB::bind_method(_MD("sample_get_mix_rate","sample"), &AudioServer::sample_get_mix_rate ); + + ObjectTypeDB::bind_method(_MD("sample_set_loop_format","sample","loop_format"), &AudioServer::sample_set_loop_format ); + ObjectTypeDB::bind_method(_MD("sample_get_loop_format","sample"), &AudioServer::sample_get_loop_format ); + + + ObjectTypeDB::bind_method(_MD("sample_set_loop_begin","sample","pos"), &AudioServer::sample_set_loop_begin ); + ObjectTypeDB::bind_method(_MD("sample_get_loop_begin","sample"), &AudioServer::sample_get_loop_begin ); + + ObjectTypeDB::bind_method(_MD("sample_set_loop_end","sample","pos"), &AudioServer::sample_set_loop_end ); + ObjectTypeDB::bind_method(_MD("sample_get_loop_end","sample"), &AudioServer::sample_get_loop_end ); + + + + ObjectTypeDB::bind_method(_MD("voice_create"), &AudioServer::voice_create ); + ObjectTypeDB::bind_method(_MD("voice_play","voice","sample"), &AudioServer::voice_play ); + ObjectTypeDB::bind_method(_MD("voice_set_volume","voice","volume"), &AudioServer::voice_set_volume ); + ObjectTypeDB::bind_method(_MD("voice_set_pan","voice","pan","depth","height"), &AudioServer::voice_set_pan,DEFVAL(0),DEFVAL(0) ); + ObjectTypeDB::bind_method(_MD("voice_set_filter","voice","type","cutoff","resonance","gain"), &AudioServer::voice_set_filter,DEFVAL(0) ); + ObjectTypeDB::bind_method(_MD("voice_set_chorus","voice","chorus"), &AudioServer::voice_set_chorus ); + ObjectTypeDB::bind_method(_MD("voice_set_reverb","voice","room","reverb"), &AudioServer::voice_set_reverb ); + ObjectTypeDB::bind_method(_MD("voice_set_mix_rate","voice","rate"), &AudioServer::voice_set_mix_rate ); + ObjectTypeDB::bind_method(_MD("voice_set_positional","voice","enabled"), &AudioServer::voice_set_positional ); + + + ObjectTypeDB::bind_method(_MD("voice_get_volume","voice"), &AudioServer::voice_get_volume ); + ObjectTypeDB::bind_method(_MD("voice_get_pan","voice"), &AudioServer::voice_get_pan ); + ObjectTypeDB::bind_method(_MD("voice_get_pan_height","voice"), &AudioServer::voice_get_pan_height ); + ObjectTypeDB::bind_method(_MD("voice_get_pan_depth","voice"), &AudioServer::voice_get_pan_depth ); + ObjectTypeDB::bind_method(_MD("voice_get_filter_type","voice"), &AudioServer::voice_get_filter_type ); + ObjectTypeDB::bind_method(_MD("voice_get_filter_cutoff","voice"), &AudioServer::voice_get_filter_cutoff ); + ObjectTypeDB::bind_method(_MD("voice_get_filter_resonance","voice"), &AudioServer::voice_get_filter_resonance ); + ObjectTypeDB::bind_method(_MD("voice_get_chorus","voice"), &AudioServer::voice_get_chorus ); + ObjectTypeDB::bind_method(_MD("voice_get_reverb_type","voice"), &AudioServer::voice_get_reverb_type ); + ObjectTypeDB::bind_method(_MD("voice_get_reverb","voice"), &AudioServer::voice_get_reverb ); + ObjectTypeDB::bind_method(_MD("voice_get_mix_rate","voice"), &AudioServer::voice_get_mix_rate ); + ObjectTypeDB::bind_method(_MD("voice_is_positional","voice"), &AudioServer::voice_is_positional ); + + ObjectTypeDB::bind_method(_MD("voice_stop","voice"), &AudioServer::voice_stop ); + + ObjectTypeDB::bind_method(_MD("free","rid"), &AudioServer::free ); + + ObjectTypeDB::bind_method(_MD("set_stream_global_volume_scale","scale"), &AudioServer::set_stream_global_volume_scale ); + ObjectTypeDB::bind_method(_MD("get_stream_global_volume_scale"), &AudioServer::get_stream_global_volume_scale ); + + ObjectTypeDB::bind_method(_MD("set_fx_global_volume_scale","scale"), &AudioServer::set_fx_global_volume_scale ); + ObjectTypeDB::bind_method(_MD("get_fx_global_volume_scale"), &AudioServer::get_fx_global_volume_scale ); + + ObjectTypeDB::bind_method(_MD("set_event_voice_global_volume_scale","scale"), &AudioServer::set_event_voice_global_volume_scale ); + ObjectTypeDB::bind_method(_MD("get_event_voice_global_volume_scale"), &AudioServer::get_event_voice_global_volume_scale ); + + BIND_CONSTANT( SAMPLE_FORMAT_PCM8 ); + BIND_CONSTANT( SAMPLE_FORMAT_PCM16 ); + BIND_CONSTANT( SAMPLE_FORMAT_IMA_ADPCM ); + + BIND_CONSTANT( SAMPLE_LOOP_NONE ); + BIND_CONSTANT( SAMPLE_LOOP_FORWARD ); + BIND_CONSTANT( SAMPLE_LOOP_PING_PONG ); + + BIND_CONSTANT( FILTER_NONE ); + BIND_CONSTANT( FILTER_LOWPASS ); + BIND_CONSTANT( FILTER_BANDPASS ); + BIND_CONSTANT( FILTER_HIPASS ); + BIND_CONSTANT( FILTER_NOTCH ); + BIND_CONSTANT( FILTER_BANDLIMIT ); ///< cutoff is LP resonace is HP + + BIND_CONSTANT( REVERB_SMALL ); + BIND_CONSTANT( REVERB_MEDIUM ); + BIND_CONSTANT( REVERB_LARGE ); + BIND_CONSTANT( REVERB_HALL ); + + GLOBAL_DEF("audio/stream_buffering_ms",500); + +} + +AudioServer::AudioServer() { + + singleton=this; +} + +AudioServer::~AudioServer() { + + +} |