2010-06-21 2 views
0

s'il vous plaît aidez-moi comment convertir VSTaudiobuffer à PCMStream Buffer j'ai essayé de http://vstnet.codeplex.com/Thread/View.aspx?ThreadId=216682 mais en vain.VST.NET vs NAUDIO (vstaudiobuffer vs tampon pcmstream)

   int inputCount = PluginContext.PluginInfo.AudioInputCount; 
       int outputCount = PluginContext.PluginInfo.AudioOutputCount; 
       int blockSize = bytesWritten;      

       VstAudioBufferManager inputMgr = new VstAudioBufferManager(inputCount, blockSize); 
       VstAudioBufferManager outputMgr = new VstAudioBufferManager(outputCount, blockSize); 

       foreach (VstAudioBuffer buffer in inputMgr.ToArray()) 
       { 
        for (int i = 0; i < blockSize; i++) 
        { 
         buffer[i] = (float)destBuffer[i]/128.0f - 1.0f; 
        } 
       } 

       PluginContext.PluginCommandStub.SetBlockSize(blockSize); 
       PluginContext.PluginCommandStub.SetSampleRate(44.8f); 

       PluginContext.PluginCommandStub.StartProcess(); 
       PluginContext.PluginCommandStub.ProcessReplacing(inputMgr.ToArray(), outputMgr.ToArray()); 
       PluginContext.PluginCommandStub.StopProcess();     

       foreach (VstAudioBuffer buffer in outputMgr.ToArray()) 
       { 
        for (int i = 0; i < blockSize; i++) 
        { 
         destBuffer[i] = Convert.ToByte(((float)buffer[i] + 1.0f) * 128.0f);       
        }       
       } 
       inputMgr.ClearBuffer(inputMgr.ToArray()[0]); 
       inputMgr.ClearBuffer(inputMgr.ToArray()[1]); 
       inputMgr.Dispose(); 
       outputMgr.ClearBuffer(outputMgr.ToArray()[0]); 
       outputMgr.ClearBuffer(outputMgr.ToArray()[1]); 
       outputMgr.Dispose(); 
+0

C'est un taux d'échantillonnage très bizarre que vous avez là - 44,8? Voulez-vous dire 44100 ou 48000? –

Répondre

1

Le problème est que vos tampons d'entrée sont des nombres entiers de 16 bits, qui sont dans la gamme de {-32767,0 .. 32767,0}. Vous devez diviser/multiplier par cette valeur, pas 128, ce qui serait pour 7 bits. De plus, lorsque vous soustrayez/ajoutez 1,0f à votre valeur convertie, vous le faites dans le mauvais ordre et cela provoque un écrêtage. La conversion devrait être:

buffer[i] = ((float)destBuffer[i])/32767.0f; 

Et

destBuffer[i] = Convert.ToByte(buffer[i] * 32768.0f); 
+0

ne devrait pas la deuxième partie de cela être Convert.ToShort? –