Signed-off-by: falkTX <falktx@falktx.com>pull/417/head
| @@ -21,6 +21,18 @@ | |||||
| #include "../../extra/RingBuffer.hpp" | #include "../../extra/RingBuffer.hpp" | ||||
| #if DISTRHO_PLUGIN_NUM_INPUTS > 2 | |||||
| # define DISTRHO_PLUGIN_NUM_INPUTS_2 2 | |||||
| #else | |||||
| # define DISTRHO_PLUGIN_NUM_INPUTS_2 DISTRHO_PLUGIN_NUM_INPUTS | |||||
| #endif | |||||
| #if DISTRHO_PLUGIN_NUM_OUTPUTS > 2 | |||||
| # define DISTRHO_PLUGIN_NUM_OUTPUTS_2 2 | |||||
| #else | |||||
| # define DISTRHO_PLUGIN_NUM_OUTPUTS_2 DISTRHO_PLUGIN_NUM_OUTPUTS | |||||
| #endif | |||||
| using DISTRHO_NAMESPACE::HeapRingBuffer; | using DISTRHO_NAMESPACE::HeapRingBuffer; | ||||
| struct NativeBridge { | struct NativeBridge { | ||||
| @@ -302,7 +302,7 @@ struct RtAudioBridge : NativeBridge { | |||||
| if (withInput) | if (withInput) | ||||
| { | { | ||||
| inParams.deviceId = rtAudio->getDefaultInputDevice(); | inParams.deviceId = rtAudio->getDefaultInputDevice(); | ||||
| inParams.nChannels = DISTRHO_PLUGIN_NUM_INPUTS; | |||||
| inParams.nChannels = DISTRHO_PLUGIN_NUM_INPUTS_2; | |||||
| inParamsPtr = &inParams; | inParamsPtr = &inParams; | ||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -310,7 +310,7 @@ struct RtAudioBridge : NativeBridge { | |||||
| #if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 | #if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 | ||||
| RtAudio::StreamParameters outParams; | RtAudio::StreamParameters outParams; | ||||
| outParams.deviceId = rtAudio->getDefaultOutputDevice(); | outParams.deviceId = rtAudio->getDefaultOutputDevice(); | ||||
| outParams.nChannels = DISTRHO_PLUGIN_NUM_OUTPUTS; | |||||
| outParams.nChannels = DISTRHO_PLUGIN_NUM_OUTPUTS_2; | |||||
| RtAudio::StreamParameters* const outParamsPtr = &outParams; | RtAudio::StreamParameters* const outParamsPtr = &outParams; | ||||
| #else | #else | ||||
| RtAudio::StreamParameters* const outParamsPtr = nullptr; | RtAudio::StreamParameters* const outParamsPtr = nullptr; | ||||
| @@ -359,14 +359,14 @@ struct RtAudioBridge : NativeBridge { | |||||
| if (self->jackProcessCallback == nullptr) | if (self->jackProcessCallback == nullptr) | ||||
| { | { | ||||
| if (outputBuffer != nullptr) | if (outputBuffer != nullptr) | ||||
| std::memset((float*)outputBuffer, 0, sizeof(float)*numFrames*DISTRHO_PLUGIN_NUM_OUTPUTS); | |||||
| std::memset((float*)outputBuffer, 0, sizeof(float)*numFrames*DISTRHO_PLUGIN_NUM_OUTPUTS_2); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| #if DISTRHO_PLUGIN_NUM_INPUTS > 0 | #if DISTRHO_PLUGIN_NUM_INPUTS > 0 | ||||
| if (float* const insPtr = static_cast<float*>(inputBuffer)) | if (float* const insPtr = static_cast<float*>(inputBuffer)) | ||||
| { | { | ||||
| for (uint i=0; i<DISTRHO_PLUGIN_NUM_INPUTS; ++i) | |||||
| for (uint i=0; i<DISTRHO_PLUGIN_NUM_INPUTS_2; ++i) | |||||
| self->audioBuffers[i] = insPtr + (i * numFrames); | self->audioBuffers[i] = insPtr + (i * numFrames); | ||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -374,7 +374,7 @@ struct RtAudioBridge : NativeBridge { | |||||
| #if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 | #if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 | ||||
| if (float* const outsPtr = static_cast<float*>(outputBuffer)) | if (float* const outsPtr = static_cast<float*>(outputBuffer)) | ||||
| { | { | ||||
| for (uint i=0; i<DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) | |||||
| for (uint i=0; i<DISTRHO_PLUGIN_NUM_OUTPUTS_2; ++i) | |||||
| self->audioBuffers[DISTRHO_PLUGIN_NUM_INPUTS + i] = outsPtr + (i * numFrames); | self->audioBuffers[DISTRHO_PLUGIN_NUM_INPUTS + i] = outsPtr + (i * numFrames); | ||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -68,7 +68,7 @@ struct SDL2Bridge : NativeBridge { | |||||
| #if DISTRHO_PLUGIN_NUM_INPUTS > 0 | #if DISTRHO_PLUGIN_NUM_INPUTS > 0 | ||||
| SDL_SetHint(SDL_HINT_AUDIO_DEVICE_STREAM_NAME, "Capure"); | SDL_SetHint(SDL_HINT_AUDIO_DEVICE_STREAM_NAME, "Capure"); | ||||
| requested.channels = DISTRHO_PLUGIN_NUM_INPUTS; | |||||
| requested.channels = DISTRHO_PLUGIN_NUM_INPUTS_2; | |||||
| requested.callback = AudioInputCallback; | requested.callback = AudioInputCallback; | ||||
| SDL_AudioSpec receivedCapture; | SDL_AudioSpec receivedCapture; | ||||
| @@ -81,7 +81,7 @@ struct SDL2Bridge : NativeBridge { | |||||
| return false; | return false; | ||||
| #endif | #endif | ||||
| } | } | ||||
| else if (receivedCapture.channels != DISTRHO_PLUGIN_NUM_INPUTS) | |||||
| else if (receivedCapture.channels != DISTRHO_PLUGIN_NUM_INPUTS_2) | |||||
| { | { | ||||
| SDL_CloseAudioDevice(captureDeviceId); | SDL_CloseAudioDevice(captureDeviceId); | ||||
| captureDeviceId = 0; | captureDeviceId = 0; | ||||
| @@ -93,7 +93,7 @@ struct SDL2Bridge : NativeBridge { | |||||
| #if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 | #if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 | ||||
| SDL_AudioSpec receivedPlayback; | SDL_AudioSpec receivedPlayback; | ||||
| SDL_SetHint(SDL_HINT_AUDIO_DEVICE_STREAM_NAME, "Playback"); | SDL_SetHint(SDL_HINT_AUDIO_DEVICE_STREAM_NAME, "Playback"); | ||||
| requested.channels = DISTRHO_PLUGIN_NUM_OUTPUTS; | |||||
| requested.channels = DISTRHO_PLUGIN_NUM_OUTPUTS_2; | |||||
| requested.callback = AudioOutputCallback; | requested.callback = AudioOutputCallback; | ||||
| playbackDeviceId = SDL_OpenAudioDevice(nullptr, 0, &requested, &receivedPlayback, | playbackDeviceId = SDL_OpenAudioDevice(nullptr, 0, &requested, &receivedPlayback, | ||||
| @@ -104,7 +104,7 @@ struct SDL2Bridge : NativeBridge { | |||||
| return false; | return false; | ||||
| } | } | ||||
| if (receivedPlayback.channels != DISTRHO_PLUGIN_NUM_OUTPUTS) | |||||
| if (receivedPlayback.channels != DISTRHO_PLUGIN_NUM_OUTPUTS_2) | |||||
| { | { | ||||
| SDL_CloseAudioDevice(playbackDeviceId); | SDL_CloseAudioDevice(playbackDeviceId); | ||||
| playbackDeviceId = 0; | playbackDeviceId = 0; | ||||
| @@ -211,15 +211,15 @@ struct SDL2Bridge : NativeBridge { | |||||
| if (self->jackProcessCallback == nullptr) | if (self->jackProcessCallback == nullptr) | ||||
| return; | return; | ||||
| const uint numFrames = static_cast<uint>(len / sizeof(float) / DISTRHO_PLUGIN_NUM_INPUTS); | |||||
| const uint numFrames = static_cast<uint>(len / sizeof(float) / DISTRHO_PLUGIN_NUM_INPUTS_2); | |||||
| DISTRHO_SAFE_ASSERT_UINT2_RETURN(numFrames == self->bufferSize, numFrames, self->bufferSize,); | DISTRHO_SAFE_ASSERT_UINT2_RETURN(numFrames == self->bufferSize, numFrames, self->bufferSize,); | ||||
| const float* const fstream = (const float*)stream; | const float* const fstream = (const float*)stream; | ||||
| for (uint i=0; i<DISTRHO_PLUGIN_NUM_INPUTS; ++i) | |||||
| for (uint i=0; i<DISTRHO_PLUGIN_NUM_INPUTS_2; ++i) | |||||
| { | { | ||||
| for (uint j=0; j<numFrames; ++j) | for (uint j=0; j<numFrames; ++j) | ||||
| self->audioBuffers[i][j] = fstream[j * DISTRHO_PLUGIN_NUM_INPUTS + i]; | |||||
| self->audioBuffers[i][j] = fstream[j * DISTRHO_PLUGIN_NUM_INPUTS_2 + i]; | |||||
| } | } | ||||
| #if DISTRHO_PLUGIN_NUM_OUTPUTS == 0 | #if DISTRHO_PLUGIN_NUM_OUTPUTS == 0 | ||||
| @@ -245,7 +245,7 @@ struct SDL2Bridge : NativeBridge { | |||||
| return; | return; | ||||
| } | } | ||||
| const uint numFrames = static_cast<uint>(len / sizeof(float) / DISTRHO_PLUGIN_NUM_OUTPUTS); | |||||
| const uint numFrames = static_cast<uint>(len / sizeof(float) / DISTRHO_PLUGIN_NUM_OUTPUTS_2); | |||||
| DISTRHO_SAFE_ASSERT_UINT2_RETURN(numFrames == self->bufferSize, numFrames, self->bufferSize,); | DISTRHO_SAFE_ASSERT_UINT2_RETURN(numFrames == self->bufferSize, numFrames, self->bufferSize,); | ||||
| const ScopedDenormalDisable sdd; | const ScopedDenormalDisable sdd; | ||||
| @@ -253,10 +253,10 @@ struct SDL2Bridge : NativeBridge { | |||||
| float* const fstream = (float*)stream; | float* const fstream = (float*)stream; | ||||
| for (uint i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) | |||||
| for (uint i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS_2; ++i) | |||||
| { | { | ||||
| for (uint j=0; j < numFrames; ++j) | for (uint j=0; j < numFrames; ++j) | ||||
| fstream[j * DISTRHO_PLUGIN_NUM_OUTPUTS + i] = self->audioBuffers[DISTRHO_PLUGIN_NUM_INPUTS + i][j]; | |||||
| fstream[j * DISTRHO_PLUGIN_NUM_OUTPUTS_2 + i] = self->audioBuffers[DISTRHO_PLUGIN_NUM_INPUTS + i][j]; | |||||
| } | } | ||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -163,7 +163,7 @@ struct WebBridge : NativeBridge { | |||||
| if (WAB.audioContext.state === 'suspended') | if (WAB.audioContext.state === 'suspended') | ||||
| WAB.audioContext.resume(); | WAB.audioContext.resume(); | ||||
| }); | }); | ||||
| }, DISTRHO_PLUGIN_NUM_INPUTS, DISTRHO_PLUGIN_NUM_OUTPUTS, bufferSize, audioBufferStorage, WebAudioCallback, this); | |||||
| }, DISTRHO_PLUGIN_NUM_INPUTS_2, DISTRHO_PLUGIN_NUM_OUTPUTS_2, bufferSize, audioBufferStorage, WebAudioCallback, this); | |||||
| return true; | return true; | ||||
| } | } | ||||
| @@ -247,7 +247,7 @@ struct WebBridge : NativeBridge { | |||||
| } else if (navigator.webkitGetUserMedia !== undefined) { | } else if (navigator.webkitGetUserMedia !== undefined) { | ||||
| navigator.webkitGetUserMedia(constraints, success, fail); | navigator.webkitGetUserMedia(constraints, success, fail); | ||||
| } | } | ||||
| }, DISTRHO_PLUGIN_NUM_INPUTS); | |||||
| }, DISTRHO_PLUGIN_NUM_INPUTS_2); | |||||
| return true; | return true; | ||||
| } | } | ||||
| @@ -279,7 +279,7 @@ struct WebBridge : NativeBridge { | |||||
| WAB.captureStreamNode.disconnect(WAB.processor); | WAB.captureStreamNode.disconnect(WAB.processor); | ||||
| return 1; | return 1; | ||||
| }, DISTRHO_PLUGIN_NUM_INPUTS, DISTRHO_PLUGIN_NUM_OUTPUTS, newBufferSize) != 0; | |||||
| }, DISTRHO_PLUGIN_NUM_INPUTS_2, DISTRHO_PLUGIN_NUM_OUTPUTS_2, newBufferSize) != 0; | |||||
| if (!success) | if (!success) | ||||
| return false; | return false; | ||||
| @@ -292,9 +292,10 @@ struct WebBridge : NativeBridge { | |||||
| bufferSizeCallback(newBufferSize, jackBufferSizeArg); | bufferSizeCallback(newBufferSize, jackBufferSizeArg); | ||||
| EM_ASM({ | EM_ASM({ | ||||
| var numInputs = $0; | |||||
| var numOutputs = $1; | |||||
| var bufferSize = $2; | |||||
| var numInputsR = $0; | |||||
| var numInputs = $1; | |||||
| var numOutputs = $2; | |||||
| var bufferSize = $3; | |||||
| var WAB = Module['WebAudioBridge']; | var WAB = Module['WebAudioBridge']; | ||||
| // store the new processor | // store the new processor | ||||
| @@ -309,13 +310,13 @@ struct WebBridge : NativeBridge { | |||||
| var buffer = e['inputBuffer']['getChannelData'](i); | var buffer = e['inputBuffer']['getChannelData'](i); | ||||
| for (var j = 0; j < bufferSize; ++j) { | for (var j = 0; j < bufferSize; ++j) { | ||||
| // setValue($3 + ((bufferSize * i) + j) * 4, buffer[j], 'float'); | // setValue($3 + ((bufferSize * i) + j) * 4, buffer[j], 'float'); | ||||
| HEAPF32[$3 + (((bufferSize * i) + j) << 2) >> 2] = buffer[j]; | |||||
| HEAPF32[$4 + (((bufferSize * i) + j) << 2) >> 2] = buffer[j]; | |||||
| } | } | ||||
| } | } | ||||
| dynCall('vi', $4, [$5]); | |||||
| dynCall('vi', $5, [$6]); | |||||
| for (var i = 0; i < numOutputs; ++i) { | for (var i = 0; i < numOutputs; ++i) { | ||||
| var buffer = e['outputBuffer']['getChannelData'](i); | var buffer = e['outputBuffer']['getChannelData'](i); | ||||
| var offset = bufferSize * (numInputs + i); | |||||
| var offset = bufferSize * (numInputsR + i); | |||||
| for (var j = 0; j < bufferSize; ++j) { | for (var j = 0; j < bufferSize; ++j) { | ||||
| buffer[j] = HEAPF32[$3 + ((offset + j) << 2) >> 2]; | buffer[j] = HEAPF32[$3 + ((offset + j) << 2) >> 2]; | ||||
| } | } | ||||
| @@ -329,7 +330,7 @@ struct WebBridge : NativeBridge { | |||||
| if (WAB.captureStreamNode) | if (WAB.captureStreamNode) | ||||
| WAB.captureStreamNode.connect(WAB.processor); | WAB.captureStreamNode.connect(WAB.processor); | ||||
| }, DISTRHO_PLUGIN_NUM_INPUTS, DISTRHO_PLUGIN_NUM_OUTPUTS, bufferSize, audioBufferStorage, WebAudioCallback, this); | |||||
| }, DISTRHO_PLUGIN_NUM_INPUTS, DISTRHO_PLUGIN_NUM_INPUTS_2, DISTRHO_PLUGIN_NUM_OUTPUTS_2, bufferSize, audioBufferStorage, WebAudioCallback, this); | |||||
| return true; | return true; | ||||
| } | } | ||||
| @@ -452,7 +453,7 @@ struct WebBridge : NativeBridge { | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| for (uint i=0; i<DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) | |||||
| for (uint i=0; i<DISTRHO_PLUGIN_NUM_OUTPUTS_2; ++i) | |||||
| std::memset(self->audioBuffers[DISTRHO_PLUGIN_NUM_INPUTS + i], 0, sizeof(float)*numFrames); | std::memset(self->audioBuffers[DISTRHO_PLUGIN_NUM_INPUTS + i], 0, sizeof(float)*numFrames); | ||||
| } | } | ||||
| } | } | ||||