| | |
| | | /* |
| | | Simple DirectMedia Layer |
| | | Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org> |
| | | Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> |
| | | |
| | | This software is provided 'as-is', without any express or implied |
| | | warranty. In no event will the authors be held liable for any damages |
| | |
| | | { |
| | | const int framelen = (SDL_AUDIO_BITSIZE(this->spec.format) / 8) * this->spec.channels; |
| | | EM_ASM_ARGS({ |
| | | var SDL2 = Module['SDL2']; |
| | | var numChannels = SDL2.audio.currentOutputBuffer['numberOfChannels']; |
| | | for (var c = 0; c < numChannels; ++c) { |
| | | var channelData = SDL2.audio.currentOutputBuffer['getChannelData'](c); |
| | |
| | | } |
| | | |
| | | EM_ASM_ARGS({ |
| | | var SDL2 = Module['SDL2']; |
| | | var numChannels = SDL2.capture.currentCaptureBuffer.numberOfChannels; |
| | | for (var c = 0; c < numChannels; ++c) { |
| | | var channelData = SDL2.capture.currentCaptureBuffer.getChannelData(c); |
| | |
| | | EMSCRIPTENAUDIO_CloseDevice(_THIS) |
| | | { |
| | | EM_ASM_({ |
| | | var SDL2 = Module['SDL2']; |
| | | if ($0) { |
| | | if (SDL2.capture.silenceTimer !== undefined) { |
| | | clearTimeout(SDL2.capture.silenceTimer); |
| | |
| | | |
| | | /* based on parts of library_sdl.js */ |
| | | |
| | | /* create context (TODO: this puts stuff in the global namespace...)*/ |
| | | /* create context */ |
| | | result = EM_ASM_INT({ |
| | | if(typeof(SDL2) === 'undefined') { |
| | | SDL2 = {}; |
| | | if(typeof(Module['SDL2']) === 'undefined') { |
| | | Module['SDL2'] = {}; |
| | | } |
| | | var SDL2 = Module['SDL2']; |
| | | if (!$0) { |
| | | SDL2.audio = {}; |
| | | } else { |
| | |
| | | } |
| | | SDL_zerop(this->hidden); |
| | | #endif |
| | | this->hidden = (struct SDL_PrivateAudioData *)0x1; |
| | | |
| | | /* limit to native freq */ |
| | | this->spec.freq = EM_ASM_INT_V({ return SDL2.audioContext.sampleRate; }); |
| | | this->spec.freq = EM_ASM_INT_V({ |
| | | var SDL2 = Module['SDL2']; |
| | | return SDL2.audioContext.sampleRate; |
| | | }); |
| | | |
| | | SDL_CalculateAudioSpec(&this->spec); |
| | | |
| | |
| | | to be honest. */ |
| | | |
| | | EM_ASM_({ |
| | | var SDL2 = Module['SDL2']; |
| | | var have_microphone = function(stream) { |
| | | //console.log('SDL audio capture: we have a microphone! Replacing silence callback.'); |
| | | if (SDL2.capture.silenceTimer !== undefined) { |
| | |
| | | if ((SDL2 === undefined) || (SDL2.capture === undefined)) { return; } |
| | | audioProcessingEvent.outputBuffer.getChannelData(0).fill(0.0); |
| | | SDL2.capture.currentCaptureBuffer = audioProcessingEvent.inputBuffer; |
| | | Runtime.dynCall('vi', $2, [$3]); |
| | | dynCall('vi', $2, [$3]); |
| | | }; |
| | | SDL2.capture.mediaStreamNode.connect(SDL2.capture.scriptProcessorNode); |
| | | SDL2.capture.scriptProcessorNode.connect(SDL2.audioContext.destination); |
| | |
| | | SDL2.capture.silenceBuffer.getChannelData(0).fill(0.0); |
| | | var silence_callback = function() { |
| | | SDL2.capture.currentCaptureBuffer = SDL2.capture.silenceBuffer; |
| | | Runtime.dynCall('vi', $2, [$3]); |
| | | dynCall('vi', $2, [$3]); |
| | | }; |
| | | |
| | | SDL2.capture.silenceTimer = setTimeout(silence_callback, ($1 / SDL2.audioContext.sampleRate) * 1000); |
| | |
| | | } else { |
| | | /* setup a ScriptProcessorNode */ |
| | | EM_ASM_ARGS({ |
| | | var SDL2 = Module['SDL2']; |
| | | SDL2.audio.scriptProcessorNode = SDL2.audioContext['createScriptProcessor']($1, 0, $0); |
| | | SDL2.audio.scriptProcessorNode['onaudioprocess'] = function (e) { |
| | | if ((SDL2 === undefined) || (SDL2.audio === undefined)) { return; } |
| | | SDL2.audio.currentOutputBuffer = e['outputBuffer']; |
| | | Runtime.dynCall('vi', $2, [$3]); |
| | | dynCall('vi', $2, [$3]); |
| | | }; |
| | | SDL2.audio.scriptProcessorNode['connect'](SDL2.audioContext['destination']); |
| | | }, this->spec.channels, this->spec.samples, HandleAudioProcess, this); |