unsafe void TapProcess(MTAudioProcessingTap tap, nint numberFrames, MTAudioProcessingTapFlags flags, AudioBuffers bufferList, out nint numberFramesOut, out MTAudioProcessingTapFlags flagsOut) { numberFramesOut = 0; flagsOut = (MTAudioProcessingTapFlags)0; // Skip processing when format not supported. if (!context.SupportedTapProcessingFormat) { Console.WriteLine("Unsupported tap processing format."); return; } if (IsBandpassFilterEnabled) { // Apply bandpass filter Audio Unit. if (context.AudioUnit != null) { var audioTimeStamp = new AudioTimeStamp { SampleTime = context.SampleCount, Flags = AudioTimeStamp.AtsFlags.SampleTimeValid }; var f = (AudioUnitRenderActionFlags)0; var status = context.AudioUnit.Render(ref f, audioTimeStamp, 0, (uint)numberFrames, bufferList); if (status != AudioUnitStatus.NoError) { Console.WriteLine("AudioUnitRender(): {0}", status); return; } // Increment sample count for audio unit. context.SampleCount += numberFrames; // Set number of frames out. numberFramesOut = numberFrames; } } else { // Get actual audio buffers from MTAudioProcessingTap (AudioUnitRender() will fill bufferListInOut otherwise). CMTimeRange tr; var status = tap.GetSourceAudio(numberFrames, bufferList, out flagsOut, out tr, out numberFramesOut); if (status != MTAudioProcessingTapError.None) { Console.WriteLine("MTAudioProcessingTapGetSourceAudio: {0}", status); return; } } try { UpdateVolumes(bufferList, numberFrames); } catch (Exception ex) { } }
AudioUnitStatus Render(AudioUnitRenderActionFlags actionFlags, AudioTimeStamp timeStamp, uint busNumber, uint numberFrames, AudioBuffers data) { // Just return audio buffers from MTAudioProcessingTap. MTAudioProcessingTapFlags flags; CMTimeRange range; nint n; var error = (AudioUnitStatus)(int)audioProcessingTap.GetSourceAudio((nint)numberFrames, data, out flags, out range, out n); if (error != AudioUnitStatus.NoError) { Console.WriteLine("{0} audioProcessingTap.GetSourceAudio failed", error); } return(error); }
unsafe void TapProcess (MTAudioProcessingTap tap, nint numberFrames, MTAudioProcessingTapFlags flags, AudioBuffers bufferList, out nint numberFramesOut, out MTAudioProcessingTapFlags flagsOut) { numberFramesOut = 0; flagsOut = (MTAudioProcessingTapFlags)0; // Skip processing when format not supported. if (!context.SupportedTapProcessingFormat) { Console.WriteLine ("Unsupported tap processing format."); return; } if (IsBandpassFilterEnabled) { // Apply bandpass filter Audio Unit. if (context.AudioUnit != null) { var audioTimeStamp = new AudioTimeStamp { SampleTime = context.SampleCount, Flags = AudioTimeStamp.AtsFlags.SampleTimeValid }; var f = (AudioUnitRenderActionFlags)0; var status = context.AudioUnit.Render (ref f, audioTimeStamp, 0, (uint)numberFrames, bufferList); if (status != AudioUnitStatus.NoError) { Console.WriteLine ("AudioUnitRender(): {0}", status); return; } // Increment sample count for audio unit. context.SampleCount += numberFrames; // Set number of frames out. numberFramesOut = numberFrames; } } else { // Get actual audio buffers from MTAudioProcessingTap (AudioUnitRender() will fill bufferListInOut otherwise). CMTimeRange tr; MTAudioProcessingTapError status = tap.GetSourceAudio (numberFrames, bufferList, out flagsOut, out tr, out numberFramesOut); if (status != MTAudioProcessingTapError.None) { Console.WriteLine ("MTAudioProcessingTapGetSourceAudio: {0}", status); return; } } UpdateVolumes (bufferList, numberFrames); }