From: <sag...@us...> - 2012-01-01 21:52:47
|
Revision: 1150 http://modplug.svn.sourceforge.net/modplug/?rev=1150&view=rev Author: saga-games Date: 2012-01-01 21:52:39 +0000 (Sun, 01 Jan 2012) Log Message: ----------- [Fix] VST Plugins with more than 32 outputs should now work better (at least I got told so). [Mod] OpenMPT: Version is now 1.20.00.59 Modified Paths: -------------- trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/Vstplug.h trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters trunk/OpenMPT/mptrack/version.h Added Paths: ----------- trunk/OpenMPT/soundlib/PluginMixBuffer.h Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2011-12-30 21:28:08 UTC (rev 1149) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2012-01-01 21:52:39 UTC (rev 1150) @@ -1327,20 +1327,18 @@ { m_hLibrary = hLibrary; m_nRefCount = 1; - m_pPrev = NULL; - m_pNext = NULL; + m_pPrev = nullptr; + m_pNext = nullptr; m_pFactory = pFactory; m_pMixStruct = pMixStruct; m_pEffect = pEffect; - m_pInputs = NULL; - m_pOutputs = NULL; - m_pEditor = NULL; + m_pEditor = nullptr; m_nInputs = m_nOutputs = 0; m_nEditorX = m_nEditorY = -1; - m_pEvList = NULL; - m_pModDoc = NULL; //rewbs.plugDocAware + m_pEvList = nullptr; + m_pModDoc = nullptr; //rewbs.plugDocAware m_nPreviousMidiChan = nInvalidMidiChan; //rewbs.VSTCompliance - m_pProcessFP = NULL; + m_pProcessFP = nullptr; // Insert ourselves in the beginning of the list if (m_pFactory) @@ -1356,14 +1354,9 @@ m_MixState.nVolDecayL = 0; m_MixState.nVolDecayR = 0; m_MixState.pMixBuffer = (int *)((((DWORD)m_MixBuffer)+7)&~7); - m_MixState.pOutBufferL = (float *)((((DWORD)&m_FloatBuffer[0]) + 7) & ~7); - m_MixState.pOutBufferR = (float *)((((DWORD)&m_FloatBuffer[MIXBUFFERSIZE]) + 7) & ~7); - MemsetZero(dummyBuffer_); + m_MixState.pOutBufferL = mixBuffer.GetInputBuffer(0); + m_MixState.pOutBufferR = mixBuffer.GetInputBuffer(1); - - //rewbs.dryRatio: we now initialise this in CVstPlugin::Initialize(). - //m_pTempBuffer = (float *)((((DWORD)&m_FloatBuffer[MIXBUFFERSIZE*2])+7)&~7); - m_bSongPlaying = false; //rewbs.VSTCompliance m_bPlugResumed = false; m_bModified = false; @@ -1474,34 +1467,12 @@ m_nInputs = m_pEffect->numInputs; m_nOutputs = m_pEffect->numOutputs; - //32 is the maximum output count due to the size of m_FloatBuffer. - //TODO: How to handle properly plugs with numOutputs > 32? - if(m_nOutputs > 32) - { - m_nOutputs = 32; - CString str; - str.Format("Plugin has unsupported number(=%d) of outputs; plugin may malfunction.", m_pEffect->numOutputs); - Reporting::Warning(str); - } + // Input pointer array size must be >= 2 for now - the input buffer assignment might write to non allocated mem. otherwise + mixBuffer.Initialize(max(m_nInputs, 2), m_nOutputs); + m_MixState.pOutBufferL = mixBuffer.GetInputBuffer(0); + m_MixState.pOutBufferR = mixBuffer.GetInputBuffer(1); - //input pointer array size must be >=2 for now - the input buffer assignment might write to non allocated mem. otherwise - m_pInputs = (m_nInputs >= 2) ? new (float *[m_nInputs]) : new (float*[2]); - m_pInputs[0] = m_MixState.pOutBufferL; - m_pInputs[1] = m_MixState.pOutBufferR; - // Assign dummy inputs - for(size_t i = 2; i < m_nInputs; i++) - { - m_pInputs[i] = dummyBuffer_; - } - m_pOutputs = new (float *[m_nOutputs]); - m_pTempBuffer = new (float *[m_nOutputs]); //rewbs.dryRatio - - for (UINT iOut=0; iOut<m_nOutputs; iOut++) - { - m_pTempBuffer[iOut]=(float *)((((DWORD_PTR)&m_FloatBuffer[MIXBUFFERSIZE*(2+iOut)])+7)&~7); //rewbs.dryRatio - } - #ifdef VST_LOG Log("%s: vst ver %d.0, flags=%04X, %d programs, %d parameters\n", m_pFactory->szLibraryName, (m_bIsVst2) ? 2 : 1, m_pEffect->flags, @@ -1565,17 +1536,8 @@ m_hLibrary = NULL; } - delete[] m_pTempBuffer; - m_pTempBuffer = NULL; - - delete[] m_pInputs; - m_pInputs = NULL; - - delete[] m_pOutputs; - m_pOutputs = NULL; - delete[] (char *)m_pEvList; - m_pEvList = NULL; + m_pEvList = nullptr; CloseHandle(processCalled); } @@ -2098,7 +2060,7 @@ // MIX_R += dryRatio * (WET_L - DRY_L) + wetRatio * (DRY_R - WET_R) //If the plug is found & ok, continue - if ((m_pEffect) && (m_pProcessFP) && (m_pInputs) && (m_pOutputs) && (m_pMixStruct)) + if ((m_pEffect) && (m_pProcessFP) && (mixBuffer.GetInputBufferArray()) && (mixBuffer.GetOutputBufferArray()) && (m_pMixStruct)) { int mixop; if (m_bIsInstrument) @@ -2114,24 +2076,21 @@ //Merge stereo input before sending to the plug if the plug can only handle one input. if (m_pEffect->numInputs == 1) { - for (UINT i=0; i<nSamples; i++) + for (size_t i = 0; i < nSamples; i++) { - m_MixState.pOutBufferL[i] = 0.5f*m_MixState.pOutBufferL[i] + 0.5f*m_MixState.pOutBufferR[i]; + m_MixState.pOutBufferL[i] = 0.5f * m_MixState.pOutBufferL[i] + 0.5f * m_MixState.pOutBufferR[i]; } } - for (UINT iOut=0; iOut<m_nOutputs; iOut++) - { - memset(m_pTempBuffer[iOut], 0, nSamples * sizeof(float)); - m_pOutputs[iOut] = m_pTempBuffer[iOut]; - } + float **outputBuffers = mixBuffer.GetOutputBufferArray(); + mixBuffer.ClearOutputBuffers(nSamples); m_dwTimeAtStartOfProcess = timeGetTime(); //Do the VST processing magic try { ASSERT(nSamples <= MIXBUFFERSIZE); - m_pProcessFP(m_pEffect, m_pInputs, m_pOutputs, nSamples); + m_pProcessFP(m_pEffect, mixBuffer.GetInputBufferArray(), outputBuffers, nSamples); } catch (...) { Bypass(); @@ -2141,7 +2100,7 @@ // SetEvent(processCalled); } - ASSERT(m_pTempBuffer != nullptr); + ASSERT(outputBuffers != nullptr); //mix outputs of multi-output VSTs: if(m_nOutputs>2) @@ -2155,7 +2114,7 @@ for(UINT iOut = 2; iOut < nOuts; iOut++) { for(UINT i = 0; i < nSamples; i++) - m_pTempBuffer[iOut % 2][i] += m_pTempBuffer[iOut][i]; //assumed stereo. + outputBuffers[iOut % 2][i] += outputBuffers[iOut][i]; //assumed stereo. } // if m_nOutputs is odd, mix half the signal of last output to each channel @@ -2164,9 +2123,9 @@ // trick : if we are here, nOuts = m_nOutputs - 1 !!! for(UINT i=0; i<nSamples; i++) { - float v = 0.5f * m_pTempBuffer[nOuts][i]; - m_pTempBuffer[0][i] += v; - m_pTempBuffer[1][i] += v; + float v = 0.5f * outputBuffers[nOuts][i]; + outputBuffers[0][i] += v; + outputBuffers[1][i] += v; } } } @@ -2183,8 +2142,8 @@ for (UINT i=0; i<nSamples; i++) { //rewbs.wetratio - added the factors. [20040123] - pOutL[i] += m_pTempBuffer[0][i]*wetRatio + m_MixState.pOutBufferL[i]*dryRatio; - pOutR[i] += m_pTempBuffer[0][i]*wetRatio + m_MixState.pOutBufferR[i]*dryRatio; + pOutL[i] += outputBuffers[0][i]*wetRatio + m_MixState.pOutBufferL[i]*dryRatio; + pOutR[i] += outputBuffers[0][i]*wetRatio + m_MixState.pOutBufferR[i]*dryRatio; //If dry mix is ticked we add the unprocessed buffer, //except if this is an instrument since this it already been done: @@ -2214,8 +2173,8 @@ for(UINT i = 0; i < nSamples; i++) { //rewbs.wetratio - added the factors. [20040123] - pOutL[i] += m_pTempBuffer[0][i]*wetRatio + m_MixState.pOutBufferL[i]*dryRatio; - pOutR[i] += m_pTempBuffer[0][i]*wetRatio + m_MixState.pOutBufferR[i]*dryRatio; + pOutL[i] += outputBuffers[0][i]*wetRatio + m_MixState.pOutBufferL[i]*dryRatio; + pOutR[i] += outputBuffers[0][i]*wetRatio + m_MixState.pOutBufferR[i]*dryRatio; } break; @@ -2223,8 +2182,8 @@ case 1: for(UINT i = 0; i < nSamples; i++) { - pOutL[i] += m_MixState.pOutBufferL[i] - m_pTempBuffer[0][i]*wetRatio; - pOutR[i] += m_MixState.pOutBufferR[i] - m_pTempBuffer[0][i]*wetRatio; + pOutL[i] += m_MixState.pOutBufferL[i] - outputBuffers[0][i]*wetRatio; + pOutR[i] += m_MixState.pOutBufferR[i] - outputBuffers[0][i]*wetRatio; } break; @@ -2232,8 +2191,8 @@ case 2: for(UINT i = 0; i < nSamples; i++) { - pOutL[i] += m_pTempBuffer[0][i] - m_MixState.pOutBufferL[i]*dryRatio; - pOutR[i] += m_pTempBuffer[0][i] - m_MixState.pOutBufferR[i]*dryRatio; + pOutL[i] += outputBuffers[0][i] - m_MixState.pOutBufferL[i]*dryRatio; + pOutR[i] += outputBuffers[0][i] - m_MixState.pOutBufferR[i]*dryRatio; } break; @@ -2241,8 +2200,8 @@ case 3: for(UINT i = 0; i < nSamples; i++) { - pOutL[i] -= m_pTempBuffer[0][i] - m_MixState.pOutBufferL[i]*wetRatio; - pOutR[i] -= m_pTempBuffer[0][i] - m_MixState.pOutBufferR[i]*wetRatio; + pOutL[i] -= outputBuffers[0][i] - m_MixState.pOutBufferL[i]*wetRatio; + pOutR[i] -= outputBuffers[0][i] - m_MixState.pOutBufferR[i]*wetRatio; } break; @@ -2251,8 +2210,8 @@ for(UINT i = 0; i < nSamples; i++) { float middle = ( pOutL[i] + m_MixState.pOutBufferL[i] + pOutR[i] + m_MixState.pOutBufferR[i] )/2.0f; - pOutL[i] -= middle - m_pTempBuffer[0][i]*wetRatio + middle - m_MixState.pOutBufferL[i]; - pOutR[i] -= middle - m_pTempBuffer[0][i]*wetRatio + middle - m_MixState.pOutBufferR[i]; + pOutL[i] -= middle - outputBuffers[0][i]*wetRatio + middle - m_MixState.pOutBufferL[i]; + pOutR[i] -= middle - outputBuffers[0][i]*wetRatio + middle - m_MixState.pOutBufferR[i]; } break; @@ -2265,8 +2224,8 @@ } for(UINT i = 0; i < nSamples; i++) { - pOutL[i] += wetRatio * (m_pTempBuffer[0][i] - m_MixState.pOutBufferL[i]) + dryRatio * (m_MixState.pOutBufferR[i] - m_pTempBuffer[0][i]); - pOutR[i] += dryRatio * (m_pTempBuffer[0][i] - m_MixState.pOutBufferL[i]) + wetRatio * (m_MixState.pOutBufferR[i] - m_pTempBuffer[0][i]); + pOutL[i] += wetRatio * (outputBuffers[0][i] - m_MixState.pOutBufferL[i]) + dryRatio * (m_MixState.pOutBufferR[i] - outputBuffers[0][i]); + pOutR[i] += dryRatio * (outputBuffers[0][i] - m_MixState.pOutBufferL[i]) + wetRatio * (m_MixState.pOutBufferR[i] - outputBuffers[0][i]); } break; } @@ -2298,8 +2257,8 @@ //rewbs.wetratio - added the factors. [20040123] - pOutL[i] += m_pTempBuffer[0][i]*wetRatio + m_MixState.pOutBufferL[i]*dryRatio; - pOutR[i] += m_pTempBuffer[1][i]*wetRatio + m_MixState.pOutBufferR[i]*dryRatio; + pOutL[i] += outputBuffers[0][i]*wetRatio + m_MixState.pOutBufferL[i]*dryRatio; + pOutR[i] += outputBuffers[1][i]*wetRatio + m_MixState.pOutBufferR[i]*dryRatio; //If dry mix is ticked, we add the unprocessed buffer, //except if this is an instrument since it has already been done: @@ -2328,8 +2287,8 @@ for(UINT i=0; i<nSamples; i++) { //rewbs.wetratio - added the factors. [20040123] - pOutL[i] += m_pTempBuffer[0][i]*wetRatio + m_MixState.pOutBufferL[i]*dryRatio; - pOutR[i] += m_pTempBuffer[1][i]*wetRatio + m_MixState.pOutBufferR[i]*dryRatio; + pOutL[i] += outputBuffers[0][i]*wetRatio + m_MixState.pOutBufferL[i]*dryRatio; + pOutR[i] += outputBuffers[1][i]*wetRatio + m_MixState.pOutBufferR[i]*dryRatio; } break; @@ -2337,8 +2296,8 @@ case 1: for(UINT i=0; i<nSamples; i++) { - pOutL[i] += m_MixState.pOutBufferL[i] - m_pTempBuffer[0][i]*wetRatio; - pOutR[i] += m_MixState.pOutBufferR[i] - m_pTempBuffer[1][i]*wetRatio; + pOutL[i] += m_MixState.pOutBufferL[i] - outputBuffers[0][i]*wetRatio; + pOutR[i] += m_MixState.pOutBufferR[i] - outputBuffers[1][i]*wetRatio; } break; @@ -2346,8 +2305,8 @@ case 2: for(UINT i=0; i<nSamples; i++) { - pOutL[i] += m_pTempBuffer[0][i] - m_MixState.pOutBufferL[i]*dryRatio; - pOutR[i] += m_pTempBuffer[1][i] - m_MixState.pOutBufferR[i]*dryRatio; + pOutL[i] += outputBuffers[0][i] - m_MixState.pOutBufferL[i]*dryRatio; + pOutR[i] += outputBuffers[1][i] - m_MixState.pOutBufferR[i]*dryRatio; } break; @@ -2355,8 +2314,8 @@ case 3: for(UINT i=0; i<nSamples; i++) { - pOutL[i] -= m_pTempBuffer[0][i] - m_MixState.pOutBufferL[i]*wetRatio; - pOutR[i] -= m_pTempBuffer[1][i] - m_MixState.pOutBufferR[i]*wetRatio; + pOutL[i] -= outputBuffers[0][i] - m_MixState.pOutBufferL[i]*wetRatio; + pOutR[i] -= outputBuffers[1][i] - m_MixState.pOutBufferR[i]*wetRatio; } break; @@ -2365,8 +2324,8 @@ for(UINT i=0; i<nSamples; i++) { float middle = ( pOutL[i] + m_MixState.pOutBufferL[i] + pOutR[i] + m_MixState.pOutBufferR[i] )/2.0f; - pOutL[i] -= middle - m_pTempBuffer[0][i]*wetRatio + middle - m_MixState.pOutBufferL[i]; - pOutR[i] -= middle - m_pTempBuffer[1][i]*wetRatio + middle - m_MixState.pOutBufferR[i]; + pOutL[i] -= middle - outputBuffers[0][i]*wetRatio + middle - m_MixState.pOutBufferL[i]; + pOutR[i] -= middle - outputBuffers[1][i]*wetRatio + middle - m_MixState.pOutBufferR[i]; } break; @@ -2379,8 +2338,8 @@ } for(UINT i=0; i<nSamples; i++) { - pOutL[i] += wetRatio * (m_pTempBuffer[0][i] - m_MixState.pOutBufferL[i]) + dryRatio * (m_MixState.pOutBufferR[i] - m_pTempBuffer[1][i]); - pOutR[i] += dryRatio * (m_pTempBuffer[0][i] - m_MixState.pOutBufferL[i]) + wetRatio * (m_MixState.pOutBufferR[i] - m_pTempBuffer[1][i]); + pOutL[i] += wetRatio * (outputBuffers[0][i] - m_MixState.pOutBufferL[i]) + dryRatio * (m_MixState.pOutBufferR[i] - outputBuffers[1][i]); + pOutR[i] += dryRatio * (outputBuffers[0][i] - m_MixState.pOutBufferL[i]) + wetRatio * (m_MixState.pOutBufferR[i] - outputBuffers[1][i]); } break; } Modified: trunk/OpenMPT/mptrack/Vstplug.h =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.h 2011-12-30 21:28:08 UTC (rev 1149) +++ trunk/OpenMPT/mptrack/Vstplug.h 2012-01-01 21:52:39 UTC (rev 1150) @@ -8,6 +8,8 @@ #include <vstfxstore.h> #endif +#include "../soundlib/PluginMixBuffer.h" + #define kBuzzMagic 'Buzz' #define kDmoMagic 'DXMO' @@ -79,12 +81,10 @@ VstEvents *m_pEvList; VSTINSTCH m_MidiCh[16]; short m_nMidiPitchBendPos[16]; - float **m_pTempBuffer; //rewbs.dryRatio: changed from * to ** - float **m_pInputs; - float **m_pOutputs; - int m_MixBuffer[MIXBUFFERSIZE*2+2]; // Stereo interleaved - float m_FloatBuffer[MIXBUFFERSIZE*(2+32)+34]; // 2ch separated + up to 32 VSTi outputs... - float dummyBuffer_[MIXBUFFERSIZE + 2]; // Other (unused) inputs + + int m_MixBuffer[MIXBUFFERSIZE*2+2]; // Stereo interleaved + PluginMixBuffer<float> mixBuffer; // Float buffers (input and output) for plugins + VstMidiEvent m_ev_queue[VSTEVENT_QUEUE_LEN]; CModDoc* m_pModDoc; //rewbs.plugDocAware CSoundFile* m_pSndFile; //rewbs.plugDocAware Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2011-12-30 21:28:08 UTC (rev 1149) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2012-01-01 21:52:39 UTC (rev 1150) @@ -849,6 +849,9 @@ RelativePath=".\PSRatioCalc.h"> </File> <File + RelativePath=".\soundlib\PluginMixBuffer.h"> + </File> + <File RelativePath="..\common\Reporting.h"> </File> <File Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2011-12-30 21:28:08 UTC (rev 1149) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2012-01-01 21:52:39 UTC (rev 1150) @@ -1127,6 +1127,10 @@ > </File> <File + RelativePath=".\soundlib\PluginMixBuffer.h" + > + </File> + <File RelativePath="..\common\Reporting.h" > </File> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2011-12-30 21:28:08 UTC (rev 1149) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2012-01-01 21:52:39 UTC (rev 1150) @@ -328,6 +328,7 @@ <ClInclude Include="..\common\StringFixer.h" /> <ClInclude Include="..\common\typedefs.h" /> <ClInclude Include="..\soundlib\MIDIMacros.h" /> + <ClInclude Include="..\soundlib\PluginMixBuffer.h" /> <ClInclude Include="ACMConvert.h" /> <ClInclude Include="Autotune.h" /> <ClInclude Include="ExceptionHandler.h" /> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2011-12-30 21:28:08 UTC (rev 1149) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2012-01-01 21:52:39 UTC (rev 1150) @@ -771,6 +771,9 @@ <ClInclude Include="..\soundlib\MIDIMacros.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="..\soundlib\PluginMixBuffer.h"> + <Filter>Header Files</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="res\bitmap1.bmp"> Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-12-30 21:28:08 UTC (rev 1149) +++ trunk/OpenMPT/mptrack/version.h 2012-01-01 21:52:39 UTC (rev 1150) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 58 +#define VER_MINORMINOR 59 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Added: trunk/OpenMPT/soundlib/PluginMixBuffer.h =================================================================== --- trunk/OpenMPT/soundlib/PluginMixBuffer.h (rev 0) +++ trunk/OpenMPT/soundlib/PluginMixBuffer.h 2012-01-01 21:52:39 UTC (rev 1150) @@ -0,0 +1,132 @@ +/* + * PluginMixBuffer.h + * ----------------- + * Purpose: Helper class for managing plugin audio input and output buffers. + * Notes : (currently none) + * Authors: OpenMPT Devs + */ + +#pragma once +#ifndef PLUGINMIXBUFFER_H +#define PLUGINMIXBUFFER_H + +// At least this part of the code is ready for double-precision rendering... :> +template<typename buffer_t> +//=================== +class PluginMixBuffer +//=================== +{ +protected: + + buffer_t *mixBuffer; // Actual buffer, contains all input and output buffers + buffer_t **inputsArray; // Pointers to input buffers + buffer_t **outputsArray; // Pointers to output buffers + + size_t inputs, outputs; // Number of input and output buffers + + // Buffers on 32-Bit platforms: Aligned to 32 bytes + // Buffers on 64-Bit platforms: Aligned to 64 bytes + static_assert(sizeof(intptr_t) * 8 >= sizeof(buffer_t), "Check buffer alignment code"); + static const size_t bufferAlignmentInBytes = (sizeof(intptr_t) * 8) - 1; + static const size_t additionalBuffer = ((sizeof(intptr_t) * 8) / sizeof(buffer_t)); + + // Return pointer to an aligned buffer + buffer_t *GetBuffer(size_t index) + //------------------------------- + { + ASSERT(index < inputs + outputs); + return reinterpret_cast<buffer_t *>((reinterpret_cast<intptr_t>(&mixBuffer[MIXBUFFERSIZE * index]) + bufferAlignmentInBytes) & ~bufferAlignmentInBytes); + } + +public: + + // Allocate input and output buffers + bool Initialize(size_t inputs, size_t outputs) + //-------------------------------------------- + { + Free(); + this->inputs = inputs; + this->outputs = outputs; + try + { + // Create inputs + outputs buffers with additional alignment. + const size_t bufferSize = MIXBUFFERSIZE * (inputs + outputs) + additionalBuffer; + mixBuffer = new buffer_t[bufferSize]; + memset(mixBuffer, 0, bufferSize * sizeof(buffer_t)); + + inputsArray = new (buffer_t *[inputs]); + outputsArray = new (buffer_t *[outputs]); + } catch(MPTMemoryException) + { + return false; + } + + for(size_t i = 0; i < inputs; i++) + { + inputsArray[i] = GetInputBuffer(i); + } + + for(size_t i = 0; i < outputs; i++) + { + outputsArray[i] = GetOutputBuffer(i); + } + + return true; + } + + // Free previously allocated buffers. + bool Free() + //--------- + { + delete[] mixBuffer; + mixBuffer = nullptr; + + delete[] inputsArray; + inputsArray = nullptr; + + delete[] outputsArray; + outputsArray = nullptr; + + inputs = outputs = 0; + + return true; + } + + // Silence all output buffers. + void ClearOutputBuffers(size_t numSamples) + //---------------------------------------- + { + ASSERT(numSamples <= MIXBUFFERSIZE); + for(size_t i = 0; i < outputs; i++) + { + memset(outputsArray[i], 0, numSamples * sizeof(buffer_t)); + } + } + + PluginMixBuffer() + //--------------- + { + mixBuffer = nullptr; + inputsArray = nullptr; + outputsArray = nullptr; + Initialize(2, 0); + } + + ~PluginMixBuffer() + //---------------- + { + Free(); + } + + // Return pointer to a given input or output buffer + buffer_t *GetInputBuffer(size_t index) { return GetBuffer(index); } + buffer_t *GetOutputBuffer(size_t index) { return GetBuffer(inputs + index); } + + // Return pointer array to all input or output buffers + buffer_t **GetInputBufferArray() { return inputsArray; } + buffer_t **GetOutputBufferArray() { return outputsArray; } + +}; + +#endif // PLUGINMIXBUFFER_H + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |