Advertisement
Guest User

Untitled

a guest
Sep 7th, 2015
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.98 KB | None | 0 0
  1. #include "audio_server_javascript.h"
  2.  
  3. #include "emscripten.h"
  4.  
  5. AudioMixer *AudioServerJavascript::get_mixer() {
  6.  
  7.     return NULL;
  8. }
  9.  
  10. void AudioServerJavascript::audio_mixer_chunk_callback(int p_frames){
  11.  
  12.  
  13. }
  14.  
  15.  
  16. RID AudioServerJavascript::sample_create(SampleFormat p_format, bool p_stereo, int p_length) {
  17.  
  18.     Sample *sample = memnew( Sample );
  19.     sample->format=p_format;
  20.     sample->sterero=p_stereo;
  21.     sample->length=p_length;
  22.     sample->loop_begin=0;
  23.     sample->loop_end=p_length;
  24.     sample->loop_format=SAMPLE_LOOP_NONE;
  25.     sample->mix_rate=44100;
  26.     sample->index=-1;
  27.  
  28.     return sample_owner.make_rid(sample);
  29.  
  30. }
  31.  
  32. void AudioServerJavascript::sample_set_description(RID p_sample, const String& p_description){
  33.  
  34.  
  35. }
  36. String AudioServerJavascript::sample_get_description(RID p_sample, const String& p_description) const{
  37.  
  38.     return String();
  39. }
  40.  
  41. AudioServerJavascript::SampleFormat AudioServerJavascript::sample_get_format(RID p_sample) const{
  42.  
  43.     return SAMPLE_FORMAT_PCM8;
  44. }
  45. bool AudioServerJavascript::sample_is_stereo(RID p_sample) const{
  46.  
  47.     const Sample *sample = sample_owner.get(p_sample);
  48.     ERR_FAIL_COND_V(!sample,false);
  49.     return sample->sterero;
  50.  
  51. }
  52. int AudioServerJavascript::sample_get_length(RID p_sample) const{
  53.     const Sample *sample = sample_owner.get(p_sample);
  54.     ERR_FAIL_COND_V(!sample,0);
  55.     return sample->length;
  56. }
  57. const void* AudioServerJavascript::sample_get_data_ptr(RID p_sample) const{
  58.  
  59.     return NULL;
  60. }
  61.  
  62. void AudioServerJavascript::sample_set_data(RID p_sample, const DVector<uint8_t>& p_buffer){
  63.  
  64.     Sample *sample = sample_owner.get(p_sample);
  65.     ERR_FAIL_COND(!sample);
  66.     int chans = sample->sterero?2:1;
  67.  
  68.     Vector<float> buffer;
  69.     buffer.resize(sample->length*chans);
  70.     DVector<uint8_t>::Read r=p_buffer.read();
  71.     if (sample->format==SAMPLE_FORMAT_PCM8) {
  72.         const int8_t*ptr = (const int8_t*)r.ptr();
  73.         for(int i=0;i<sample->length*chans;i++) {
  74.             buffer[i]=ptr[i]/128.0;
  75.         }
  76.     } else if (sample->format==SAMPLE_FORMAT_PCM16){
  77.         const int16_t*ptr = (const int16_t*)r.ptr();
  78.         for(int i=0;i<sample->length*chans;i++) {
  79.             buffer[i]=ptr[i]/32768.0;
  80.         }
  81.     } else {
  82.         ERR_EXPLAIN("Unsupported for now");
  83.         ERR_FAIL();
  84.     }
  85.  
  86.     sample->tmp_data=buffer;
  87.  
  88.  
  89.  
  90. }
  91. const DVector<uint8_t> AudioServerJavascript::sample_get_data(RID p_sample) const{
  92.  
  93.  
  94.     return DVector<uint8_t>();
  95. }
  96.  
  97. void AudioServerJavascript::sample_set_mix_rate(RID p_sample,int p_rate){
  98.     Sample *sample = sample_owner.get(p_sample);
  99.     ERR_FAIL_COND(!sample);
  100.     sample->mix_rate=p_rate;
  101.  
  102. }
  103.  
  104. int AudioServerJavascript::sample_get_mix_rate(RID p_sample) const{
  105.     const Sample *sample = sample_owner.get(p_sample);
  106.     ERR_FAIL_COND_V(!sample,0);
  107.     return sample->mix_rate;
  108. }
  109.  
  110.  
  111. void AudioServerJavascript::sample_set_loop_format(RID p_sample,SampleLoopFormat p_format){
  112.  
  113.     Sample *sample = sample_owner.get(p_sample);
  114.     ERR_FAIL_COND(!sample);
  115.     sample->loop_format=p_format;
  116.  
  117. }
  118.  
  119. AudioServerJavascript::SampleLoopFormat AudioServerJavascript::sample_get_loop_format(RID p_sample) const {
  120.  
  121.     const Sample *sample = sample_owner.get(p_sample);
  122.     ERR_FAIL_COND_V(!sample,SAMPLE_LOOP_NONE);
  123.     return sample->loop_format;
  124. }
  125.  
  126. void AudioServerJavascript::sample_set_loop_begin(RID p_sample,int p_pos){
  127.  
  128.     Sample *sample = sample_owner.get(p_sample);
  129.     ERR_FAIL_COND(!sample);
  130.     sample->loop_begin=p_pos;
  131.  
  132. }
  133. int AudioServerJavascript::sample_get_loop_begin(RID p_sample) const{
  134.  
  135.     const Sample *sample = sample_owner.get(p_sample);
  136.     ERR_FAIL_COND_V(!sample,0);
  137.     return sample->loop_begin;
  138. }
  139.  
  140. void AudioServerJavascript::sample_set_loop_end(RID p_sample,int p_pos){
  141.  
  142.     Sample *sample = sample_owner.get(p_sample);
  143.     ERR_FAIL_COND(!sample);
  144.     sample->loop_end=p_pos;
  145.  
  146. }
  147. int AudioServerJavascript::sample_get_loop_end(RID p_sample) const{
  148.  
  149.     const Sample *sample = sample_owner.get(p_sample);
  150.     ERR_FAIL_COND_V(!sample,0);
  151.     return sample->loop_end;
  152. }
  153.  
  154.  
  155. /* VOICE API */
  156.  
  157. RID AudioServerJavascript::voice_create(){
  158.  
  159.     Voice *voice = memnew( Voice );
  160.  
  161.     voice->index=voice_base;
  162.     voice->volume=1.0;
  163.     voice->pan=0.0;
  164.     voice->pan_depth=.0;
  165.     voice->pan_height=0.0;
  166.     voice->chorus=0;
  167.     voice->reverb_type=REVERB_SMALL;
  168.     voice->reverb=0;
  169.     voice->mix_rate=-1;
  170.     voice->positional=false;
  171.     voice->active=false;
  172.  
  173.     EM_ASM( {
  174.             _as_voices[$0]=_as_audioctx.createBufferSource();
  175.             _as_voices[$0].connect(audioCtx.destination);
  176.         },voice_base);
  177.  
  178.     voice_base++;
  179.  
  180.     return voice_owner.make_rid( voice );
  181. }
  182.  
  183. void AudioServerJavascript::voice_play(RID p_voice, RID p_sample){
  184.  
  185.     Voice* voice=voice_owner.get(p_voice);
  186.     ERR_FAIL_COND(!voice);
  187.     Sample *sample=sample_owner.get(p_sample);
  188.     ERR_FAIL_COND(!sample);
  189.  
  190.     // due to how webaudio works, sample cration is deferred until used
  191.     // sorry! WebAudio absolutely sucks
  192.  
  193.  
  194.     if (sample->index==-1) {
  195.         //create sample if not created
  196.         ERR_FAIL_COND(sample->tmp_data.size()==0);
  197.         sample->index=sample_base;
  198.         EM_ASM( {
  199.             _as_samples[$0]=_as_audioctx.createBuffer($1,$2,$3);
  200.             },sample_base,p_stereo?2:1,p_length,sample->mix_rate);
  201.  
  202.         sample_base++;
  203.         int chans = sample->sterero?2:1;
  204.  
  205.  
  206.         for(int i=0;i<chans;i++) {
  207.  
  208.  
  209.             EM_ASM({
  210.                        _as_edited_buffer=_as_samples[$0].getChannelData($1);
  211.                    },sample->index,i);
  212.  
  213.  
  214.             for(int j=0;j<sample->length;j++) {
  215.  
  216.                 EM_ASM({
  217.                            _as_edited_buffer[$0]=$1;
  218.                        },j,sample->tmp_data[j]);
  219.             }
  220.         }
  221.  
  222.         sample->tmp_data.clear();
  223.     }
  224.  
  225.  
  226.     EM_ASM( {
  227.             _as_voices[$0].buffer=_as_samples[$1];
  228.             _as_voices[$0].loopStart=$1;
  229.             _as_voices[$0].loopEnd=$2;
  230.             _as_voices[$0].loop=$3;
  231.             _as_voices[$0].start();
  232.         },voice->index,sample->index,sample->mix_rate*sample->loop_begin,sample->mix_rate*sample->loop_end,sample->loop_format!=SAMPLE_LOOP_NONE);
  233.  
  234.     voice->active=true;
  235. }
  236.  
  237. void AudioServerJavascript::voice_set_volume(RID p_voice, float p_gain){
  238.  
  239. }
  240. void AudioServerJavascript::voice_set_pan(RID p_voice, float p_pan, float p_depth,float height){
  241.  
  242. }
  243. void AudioServerJavascript::voice_set_filter(RID p_voice, FilterType p_type, float p_cutoff, float p_resonance, float p_gain){
  244.  
  245. }
  246. void AudioServerJavascript::voice_set_chorus(RID p_voice, float p_chorus ){
  247.  
  248. }
  249. void AudioServerJavascript::voice_set_reverb(RID p_voice, ReverbRoomType p_room_type, float p_reverb){
  250.  
  251. }
  252. void AudioServerJavascript::voice_set_mix_rate(RID p_voice, int p_mix_rate){
  253.  
  254. }
  255. void AudioServerJavascript::voice_set_positional(RID p_voice, bool p_positional){
  256.  
  257. }
  258.  
  259. float AudioServerJavascript::voice_get_volume(RID p_voice) const{
  260.  
  261.     return 1;
  262. }
  263. float AudioServerJavascript::voice_get_pan(RID p_voice) const{
  264.     return 0;
  265. }
  266. float AudioServerJavascript::voice_get_pan_depth(RID p_voice) const{
  267.     return 0;
  268. }
  269. float AudioServerJavascript::voice_get_pan_height(RID p_voice) const{
  270.  
  271.     return 0;
  272. }
  273. AudioServerJavascript::FilterType AudioServerJavascript::voice_get_filter_type(RID p_voice) const{
  274.  
  275.     return FILTER_NONE;
  276. }
  277. float AudioServerJavascript::voice_get_filter_cutoff(RID p_voice) const{
  278.  
  279.     return 0;
  280. }
  281. float AudioServerJavascript::voice_get_filter_resonance(RID p_voice) const{
  282.  
  283.     return 0;
  284. }
  285. float AudioServerJavascript::voice_get_chorus(RID p_voice) const{
  286.  
  287.     return 0;
  288. }
  289. AudioServerJavascript::ReverbRoomType AudioServerJavascript::voice_get_reverb_type(RID p_voice) const{
  290.  
  291.     return REVERB_SMALL;
  292. }
  293. float AudioServerJavascript::voice_get_reverb(RID p_voice) const{
  294.  
  295.     return 0;
  296. }
  297.  
  298. int AudioServerJavascript::voice_get_mix_rate(RID p_voice) const{
  299.  
  300.     return 44100;
  301. }
  302.  
  303. bool AudioServerJavascript::voice_is_positional(RID p_voice) const{
  304.  
  305.     return false;
  306. }
  307.  
  308. void AudioServerJavascript::voice_stop(RID p_voice){
  309.  
  310.     Voice* voice=voice_owner.get(p_voice);
  311.     ERR_FAIL_COND(!voice);
  312.  
  313.     if (voice->active) {
  314.  
  315.         EM_ASM( {
  316.                 _as_voices[$0].stop();
  317.             },voice->index);
  318.  
  319.         voice->active=false;
  320.     }
  321.  
  322.  
  323. }
  324. bool AudioServerJavascript::voice_is_active(RID p_voice) const{
  325.     Voice* voice=voice_owner.get(p_voice);
  326.     ERR_FAIL_COND_V(!voice,false);
  327.  
  328.     return voice->active;
  329. }
  330.  
  331. /* STREAM API */
  332.  
  333. RID AudioServerJavascript::audio_stream_create(AudioStream *p_stream){
  334.  
  335.     return RID();
  336. }
  337. RID AudioServerJavascript::event_stream_create(EventStream *p_stream){
  338.  
  339.     return RID();
  340. }
  341.  
  342. void AudioServerJavascript::stream_set_active(RID p_stream, bool p_active){
  343.  
  344.  
  345. }
  346.  
  347. bool AudioServerJavascript::stream_is_active(RID p_stream) const{
  348.  
  349.     return false;
  350. }
  351.  
  352. void AudioServerJavascript::stream_set_volume_scale(RID p_stream, float p_scale){
  353.  
  354. }
  355. float AudioServerJavascript::stream_set_volume_scale(RID p_stream) const{
  356.     return 0;
  357. }
  358.  
  359.  
  360.  
  361. void AudioServerJavascript::free(RID p_id){
  362.  
  363. }
  364.  
  365. void AudioServerJavascript::init(){
  366.  
  367.     EM_ASM(
  368.         console.log('server is '+audio_server);
  369.     );
  370.  
  371. }
  372. void AudioServerJavascript::finish(){
  373.  
  374. }
  375. void AudioServerJavascript::update(){
  376.  
  377. }
  378.  
  379. /* MISC config */
  380.  
  381. void AudioServerJavascript::lock(){
  382.  
  383. }
  384. void AudioServerJavascript::unlock(){
  385.  
  386. }
  387. int AudioServerJavascript::get_default_channel_count() const{
  388.  
  389.     return 1;
  390. }
  391. int AudioServerJavascript::get_default_mix_rate() const{
  392.  
  393.     return 44100;
  394. }
  395.  
  396. void AudioServerJavascript::set_stream_global_volume_scale(float p_volume){
  397.  
  398.  
  399. }
  400. void AudioServerJavascript::set_fx_global_volume_scale(float p_volume){
  401.  
  402. }
  403. void AudioServerJavascript::set_event_voice_global_volume_scale(float p_volume){
  404.  
  405. }
  406.  
  407. float AudioServerJavascript::get_stream_global_volume_scale() const{
  408.     return 1;
  409. }
  410. float AudioServerJavascript::get_fx_global_volume_scale() const{
  411.  
  412.     return 1;
  413. }
  414. float AudioServerJavascript::get_event_voice_global_volume_scale() const{
  415.  
  416.     return 1;
  417. }
  418.  
  419. uint32_t AudioServerJavascript::read_output_peak() const{
  420.  
  421.     return 0;
  422. }
  423.  
  424. AudioServerJavascript *AudioServerJavascript::singleton=NULL;
  425.  
  426. AudioServer *AudioServerJavascript::get_singleton() {
  427.     return singleton;
  428. }
  429.  
  430. double AudioServerJavascript::get_mix_time() const{
  431.  
  432.     return 0;
  433. }
  434. double AudioServerJavascript::get_output_delay() const {
  435.  
  436.     return 0;
  437. }
  438.  
  439. AudioServerJavascript::AudioServerJavascript() {
  440.  
  441.     singleton=this;
  442.     sample_base=1;
  443.     voice_base=1;
  444.     EM_ASM(
  445.         _as_samples={};
  446.         _as_voices={};
  447.         _as_audioctx = new (window.AudioContext || window.webkitAudioContext)();
  448.     );
  449.  
  450.  
  451. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement