Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "audio_server_javascript.h"
- #include "emscripten.h"
- AudioMixer *AudioServerJavascript::get_mixer() {
- return NULL;
- }
- void AudioServerJavascript::audio_mixer_chunk_callback(int p_frames){
- }
- RID AudioServerJavascript::sample_create(SampleFormat p_format, bool p_stereo, int p_length) {
- Sample *sample = memnew( Sample );
- sample->format=p_format;
- sample->sterero=p_stereo;
- sample->length=p_length;
- sample->loop_begin=0;
- sample->loop_end=p_length;
- sample->loop_format=SAMPLE_LOOP_NONE;
- sample->mix_rate=44100;
- sample->index=-1;
- return sample_owner.make_rid(sample);
- }
- void AudioServerJavascript::sample_set_description(RID p_sample, const String& p_description){
- }
- String AudioServerJavascript::sample_get_description(RID p_sample, const String& p_description) const{
- return String();
- }
- AudioServerJavascript::SampleFormat AudioServerJavascript::sample_get_format(RID p_sample) const{
- return SAMPLE_FORMAT_PCM8;
- }
- bool AudioServerJavascript::sample_is_stereo(RID p_sample) const{
- const Sample *sample = sample_owner.get(p_sample);
- ERR_FAIL_COND_V(!sample,false);
- return sample->sterero;
- }
- int AudioServerJavascript::sample_get_length(RID p_sample) const{
- const Sample *sample = sample_owner.get(p_sample);
- ERR_FAIL_COND_V(!sample,0);
- return sample->length;
- }
- const void* AudioServerJavascript::sample_get_data_ptr(RID p_sample) const{
- return NULL;
- }
- void AudioServerJavascript::sample_set_data(RID p_sample, const DVector<uint8_t>& p_buffer){
- Sample *sample = sample_owner.get(p_sample);
- ERR_FAIL_COND(!sample);
- int chans = sample->sterero?2:1;
- Vector<float> buffer;
- buffer.resize(sample->length*chans);
- DVector<uint8_t>::Read r=p_buffer.read();
- if (sample->format==SAMPLE_FORMAT_PCM8) {
- const int8_t*ptr = (const int8_t*)r.ptr();
- for(int i=0;i<sample->length*chans;i++) {
- buffer[i]=ptr[i]/128.0;
- }
- } else if (sample->format==SAMPLE_FORMAT_PCM16){
- const int16_t*ptr = (const int16_t*)r.ptr();
- for(int i=0;i<sample->length*chans;i++) {
- buffer[i]=ptr[i]/32768.0;
- }
- } else {
- ERR_EXPLAIN("Unsupported for now");
- ERR_FAIL();
- }
- sample->tmp_data=buffer;
- }
- const DVector<uint8_t> AudioServerJavascript::sample_get_data(RID p_sample) const{
- return DVector<uint8_t>();
- }
- void AudioServerJavascript::sample_set_mix_rate(RID p_sample,int p_rate){
- Sample *sample = sample_owner.get(p_sample);
- ERR_FAIL_COND(!sample);
- sample->mix_rate=p_rate;
- }
- int AudioServerJavascript::sample_get_mix_rate(RID p_sample) const{
- const Sample *sample = sample_owner.get(p_sample);
- ERR_FAIL_COND_V(!sample,0);
- return sample->mix_rate;
- }
- void AudioServerJavascript::sample_set_loop_format(RID p_sample,SampleLoopFormat p_format){
- Sample *sample = sample_owner.get(p_sample);
- ERR_FAIL_COND(!sample);
- sample->loop_format=p_format;
- }
- AudioServerJavascript::SampleLoopFormat AudioServerJavascript::sample_get_loop_format(RID p_sample) const {
- const Sample *sample = sample_owner.get(p_sample);
- ERR_FAIL_COND_V(!sample,SAMPLE_LOOP_NONE);
- return sample->loop_format;
- }
- void AudioServerJavascript::sample_set_loop_begin(RID p_sample,int p_pos){
- Sample *sample = sample_owner.get(p_sample);
- ERR_FAIL_COND(!sample);
- sample->loop_begin=p_pos;
- }
- int AudioServerJavascript::sample_get_loop_begin(RID p_sample) const{
- const Sample *sample = sample_owner.get(p_sample);
- ERR_FAIL_COND_V(!sample,0);
- return sample->loop_begin;
- }
- void AudioServerJavascript::sample_set_loop_end(RID p_sample,int p_pos){
- Sample *sample = sample_owner.get(p_sample);
- ERR_FAIL_COND(!sample);
- sample->loop_end=p_pos;
- }
- int AudioServerJavascript::sample_get_loop_end(RID p_sample) const{
- const Sample *sample = sample_owner.get(p_sample);
- ERR_FAIL_COND_V(!sample,0);
- return sample->loop_end;
- }
- /* VOICE API */
- RID AudioServerJavascript::voice_create(){
- Voice *voice = memnew( Voice );
- voice->index=voice_base;
- voice->volume=1.0;
- voice->pan=0.0;
- voice->pan_depth=.0;
- voice->pan_height=0.0;
- voice->chorus=0;
- voice->reverb_type=REVERB_SMALL;
- voice->reverb=0;
- voice->mix_rate=-1;
- voice->positional=false;
- voice->active=false;
- EM_ASM( {
- _as_voices[$0]=_as_audioctx.createBufferSource();
- _as_voices[$0].connect(audioCtx.destination);
- },voice_base);
- voice_base++;
- return voice_owner.make_rid( voice );
- }
- void AudioServerJavascript::voice_play(RID p_voice, RID p_sample){
- Voice* voice=voice_owner.get(p_voice);
- ERR_FAIL_COND(!voice);
- Sample *sample=sample_owner.get(p_sample);
- ERR_FAIL_COND(!sample);
- // due to how webaudio works, sample cration is deferred until used
- // sorry! WebAudio absolutely sucks
- if (sample->index==-1) {
- //create sample if not created
- ERR_FAIL_COND(sample->tmp_data.size()==0);
- sample->index=sample_base;
- EM_ASM( {
- _as_samples[$0]=_as_audioctx.createBuffer($1,$2,$3);
- },sample_base,p_stereo?2:1,p_length,sample->mix_rate);
- sample_base++;
- int chans = sample->sterero?2:1;
- for(int i=0;i<chans;i++) {
- EM_ASM({
- _as_edited_buffer=_as_samples[$0].getChannelData($1);
- },sample->index,i);
- for(int j=0;j<sample->length;j++) {
- EM_ASM({
- _as_edited_buffer[$0]=$1;
- },j,sample->tmp_data[j]);
- }
- }
- sample->tmp_data.clear();
- }
- EM_ASM( {
- _as_voices[$0].buffer=_as_samples[$1];
- _as_voices[$0].loopStart=$1;
- _as_voices[$0].loopEnd=$2;
- _as_voices[$0].loop=$3;
- _as_voices[$0].start();
- },voice->index,sample->index,sample->mix_rate*sample->loop_begin,sample->mix_rate*sample->loop_end,sample->loop_format!=SAMPLE_LOOP_NONE);
- voice->active=true;
- }
- void AudioServerJavascript::voice_set_volume(RID p_voice, float p_gain){
- }
- void AudioServerJavascript::voice_set_pan(RID p_voice, float p_pan, float p_depth,float height){
- }
- void AudioServerJavascript::voice_set_filter(RID p_voice, FilterType p_type, float p_cutoff, float p_resonance, float p_gain){
- }
- void AudioServerJavascript::voice_set_chorus(RID p_voice, float p_chorus ){
- }
- void AudioServerJavascript::voice_set_reverb(RID p_voice, ReverbRoomType p_room_type, float p_reverb){
- }
- void AudioServerJavascript::voice_set_mix_rate(RID p_voice, int p_mix_rate){
- }
- void AudioServerJavascript::voice_set_positional(RID p_voice, bool p_positional){
- }
- float AudioServerJavascript::voice_get_volume(RID p_voice) const{
- return 1;
- }
- float AudioServerJavascript::voice_get_pan(RID p_voice) const{
- return 0;
- }
- float AudioServerJavascript::voice_get_pan_depth(RID p_voice) const{
- return 0;
- }
- float AudioServerJavascript::voice_get_pan_height(RID p_voice) const{
- return 0;
- }
- AudioServerJavascript::FilterType AudioServerJavascript::voice_get_filter_type(RID p_voice) const{
- return FILTER_NONE;
- }
- float AudioServerJavascript::voice_get_filter_cutoff(RID p_voice) const{
- return 0;
- }
- float AudioServerJavascript::voice_get_filter_resonance(RID p_voice) const{
- return 0;
- }
- float AudioServerJavascript::voice_get_chorus(RID p_voice) const{
- return 0;
- }
- AudioServerJavascript::ReverbRoomType AudioServerJavascript::voice_get_reverb_type(RID p_voice) const{
- return REVERB_SMALL;
- }
- float AudioServerJavascript::voice_get_reverb(RID p_voice) const{
- return 0;
- }
- int AudioServerJavascript::voice_get_mix_rate(RID p_voice) const{
- return 44100;
- }
- bool AudioServerJavascript::voice_is_positional(RID p_voice) const{
- return false;
- }
- void AudioServerJavascript::voice_stop(RID p_voice){
- Voice* voice=voice_owner.get(p_voice);
- ERR_FAIL_COND(!voice);
- if (voice->active) {
- EM_ASM( {
- _as_voices[$0].stop();
- },voice->index);
- voice->active=false;
- }
- }
- bool AudioServerJavascript::voice_is_active(RID p_voice) const{
- Voice* voice=voice_owner.get(p_voice);
- ERR_FAIL_COND_V(!voice,false);
- return voice->active;
- }
- /* STREAM API */
- RID AudioServerJavascript::audio_stream_create(AudioStream *p_stream){
- return RID();
- }
- RID AudioServerJavascript::event_stream_create(EventStream *p_stream){
- return RID();
- }
- void AudioServerJavascript::stream_set_active(RID p_stream, bool p_active){
- }
- bool AudioServerJavascript::stream_is_active(RID p_stream) const{
- return false;
- }
- void AudioServerJavascript::stream_set_volume_scale(RID p_stream, float p_scale){
- }
- float AudioServerJavascript::stream_set_volume_scale(RID p_stream) const{
- return 0;
- }
- void AudioServerJavascript::free(RID p_id){
- }
- void AudioServerJavascript::init(){
- EM_ASM(
- console.log('server is '+audio_server);
- );
- }
- void AudioServerJavascript::finish(){
- }
- void AudioServerJavascript::update(){
- }
- /* MISC config */
- void AudioServerJavascript::lock(){
- }
- void AudioServerJavascript::unlock(){
- }
- int AudioServerJavascript::get_default_channel_count() const{
- return 1;
- }
- int AudioServerJavascript::get_default_mix_rate() const{
- return 44100;
- }
- void AudioServerJavascript::set_stream_global_volume_scale(float p_volume){
- }
- void AudioServerJavascript::set_fx_global_volume_scale(float p_volume){
- }
- void AudioServerJavascript::set_event_voice_global_volume_scale(float p_volume){
- }
- float AudioServerJavascript::get_stream_global_volume_scale() const{
- return 1;
- }
- float AudioServerJavascript::get_fx_global_volume_scale() const{
- return 1;
- }
- float AudioServerJavascript::get_event_voice_global_volume_scale() const{
- return 1;
- }
- uint32_t AudioServerJavascript::read_output_peak() const{
- return 0;
- }
- AudioServerJavascript *AudioServerJavascript::singleton=NULL;
- AudioServer *AudioServerJavascript::get_singleton() {
- return singleton;
- }
- double AudioServerJavascript::get_mix_time() const{
- return 0;
- }
- double AudioServerJavascript::get_output_delay() const {
- return 0;
- }
- AudioServerJavascript::AudioServerJavascript() {
- singleton=this;
- sample_base=1;
- voice_base=1;
- EM_ASM(
- _as_samples={};
- _as_voices={};
- _as_audioctx = new (window.AudioContext || window.webkitAudioContext)();
- );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement