예제 #1
0
            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);
		}