diff --git a/src/AudioUnit/AudioUnit.cs b/src/AudioUnit/AudioUnit.cs index 272ca5532f..2401c20851 100644 --- a/src/AudioUnit/AudioUnit.cs +++ b/src/AudioUnit/AudioUnit.cs @@ -642,6 +642,9 @@ namespace AudioUnit inputs [audioUnitElement] = inputDelegate; + if (!gcHandle.IsAllocated) + gcHandle = GCHandle.Alloc (this); + var cb = new AURenderCallbackStruct (); cb.Proc = CreateInputCallback; cb.ProcRefCon = GCHandle.ToIntPtr (gcHandle); diff --git a/tests/monotouch-test/AudioToolbox/AudioUnitTest.cs b/tests/monotouch-test/AudioToolbox/AudioUnitTest.cs new file mode 100644 index 0000000000..cee68d256d --- /dev/null +++ b/tests/monotouch-test/AudioToolbox/AudioUnitTest.cs @@ -0,0 +1,53 @@ +// +// Unit tests for AudioUnit +// +// Authors: +// Rolf Bjarne Kvinge (rolf@xamarin.com) +// +// Copyright 2022 Microsoft Corp. All rights reserved. +// + +#if __MACOS__ && NET + +using System; +using System.Threading; + +using Foundation; +using AudioToolbox; +using AudioUnit; + +using NUnit.Framework; + +namespace MonoTouchFixtures.AudioToolbox { + [TestFixture] + [Preserve (AllMembers = true)] + public class AudioUnitTest + { + ManualResetEvent inputCallbackEvent = new ManualResetEvent (false); + + // This test currently only works on macOS, probably due to missing microphone entitlements/permissions for mobile platforms. + [Test] + public void Callbacks () + { + var audioComponent = AudioComponent.FindComponent (AudioTypeOutput.VoiceProcessingIO); + using var audioUnit = new global::AudioUnit.AudioUnit (audioComponent); + + audioUnit.SetInputCallback (InputCallback, AudioUnitScopeType.Input, 1); + audioUnit.Initialize (); + try { + audioUnit.Start (); + Assert.IsTrue (inputCallbackEvent.WaitOne (TimeSpan.FromSeconds (1)), "No input callback for 1 second"); + } finally { + audioUnit.Stop (); + } + } + + AudioUnitStatus InputCallback (AudioUnitRenderActionFlags actionFlags, AudioTimeStamp timeStamp, uint busNumber, uint numberFrames, global::AudioUnit.AudioUnit audioUnit) + { + inputCallbackEvent.Set (); + return AudioUnitStatus.NoError; + } + } +} + +#endif // __MACOS__ && NET