/// <summary> /// driver buffer update callback to fill the wave buffer. /// </summary> /// <param name="inputChannels">The input channels.</param> /// <param name="outputChannels">The output channels.</param> void driver_BufferUpdate(IntPtr[] inputChannels, IntPtr[] outputChannels) { if (this.NumberOfInputChannels > 0) { var audioAvailable = AudioAvailable; if (audioAvailable != null) { var args = new AsioAudioAvailableEventArgs(inputChannels, outputChannels, nbSamples, driver.Capabilities.InputChannelInfos[0].type); audioAvailable(this, args); if (args.WrittenToOutputBuffers) { return; } } } if (this.NumberOfOutputChannels > 0) { int read = sourceStream.Read(waveBuffer, 0, waveBuffer.Length); if (read < waveBuffer.Length) { // we have stopped } // Call the convertor unsafe { // TODO : check if it's better to lock the buffer at initialization? fixed(void *pBuffer = &waveBuffer[0]) { convertor(new IntPtr(pBuffer), outputChannels, NumberOfOutputChannels, nbSamples); } } if (read == 0) { Stop(); } } }
/// <summary> /// driver buffer update callback to fill the wave buffer. /// </summary> /// <param name="inputChannels">The input channels.</param> /// <param name="outputChannels">The output channels.</param> void driver_BufferUpdate(IntPtr[] inputChannels, IntPtr[] outputChannels) { if (this.NumberOfInputChannels > 0) { var audioAvailable = AudioAvailable; if (audioAvailable != null) { var args = new AsioAudioAvailableEventArgs(inputChannels, outputChannels, nbSamples, driver.Capabilities.InputChannelInfos[0].type); audioAvailable(this, args); if (args.WrittenToOutputBuffers) return; } } if (this.NumberOfOutputChannels > 0) { int read = sourceStream.Read(waveBuffer, 0, waveBuffer.Length); if (read < waveBuffer.Length) { // we have stopped } // Call the convertor unsafe { // TODO : check if it's better to lock the buffer at initialization? fixed (void* pBuffer = &waveBuffer[0]) { convertor(new IntPtr(pBuffer), outputChannels, NumberOfOutputChannels, nbSamples); } } if (read == 0) { Stop(); } } }