2020-12-18 13:45:06 +03:00
|
|
|
#if __MACOS__
|
2016-05-26 16:06:52 +03:00
|
|
|
using System;
|
2020-07-17 09:51:53 +03:00
|
|
|
using System.Threading;
|
2016-05-26 16:06:52 +03:00
|
|
|
using NUnit.Framework;
|
|
|
|
|
|
|
|
using AppKit;
|
|
|
|
using AudioUnit;
|
|
|
|
using AudioToolbox;
|
2021-03-16 17:15:30 +03:00
|
|
|
using Foundation;
|
2016-05-26 16:06:52 +03:00
|
|
|
|
|
|
|
namespace Xamarin.Mac.Tests
|
|
|
|
{
|
|
|
|
[TestFixture]
|
2021-03-16 17:15:30 +03:00
|
|
|
[Preserve (AllMembers = true)]
|
2016-05-26 16:06:52 +03:00
|
|
|
public class AUGraphTests
|
|
|
|
{
|
|
|
|
int graphRenderCallbackCount = 0;
|
|
|
|
int mixerRenderCallbackCount = 0;
|
|
|
|
AUGraph graph;
|
|
|
|
AudioUnit.AudioUnit mMixer;
|
|
|
|
|
|
|
|
void SetupAUGraph ()
|
|
|
|
{
|
|
|
|
graph = new AUGraph ();
|
|
|
|
|
|
|
|
AudioComponentDescription mixerDescription = new AudioComponentDescription ();
|
|
|
|
mixerDescription.ComponentType = AudioComponentType.Mixer;
|
2022-01-21 23:30:55 +03:00
|
|
|
#if NET
|
|
|
|
mixerDescription.ComponentSubType = (AudioUnitSubType)AudioTypeMixer.MultiChannel;
|
|
|
|
#else
|
2016-05-26 16:06:52 +03:00
|
|
|
mixerDescription.ComponentSubType = (int)AudioTypeMixer.MultiChannel;
|
2022-01-21 23:30:55 +03:00
|
|
|
#endif
|
2016-05-26 16:06:52 +03:00
|
|
|
mixerDescription.ComponentFlags = 0;
|
|
|
|
mixerDescription.ComponentFlagsMask = 0;
|
|
|
|
mixerDescription.ComponentManufacturer = AudioComponentManufacturerType.Apple;
|
|
|
|
|
|
|
|
AudioComponentDescription outputDesciption = new AudioComponentDescription ();
|
|
|
|
outputDesciption.ComponentType = AudioComponentType.Output;
|
2022-01-21 23:30:55 +03:00
|
|
|
#if NET
|
|
|
|
outputDesciption.ComponentSubType = (AudioUnitSubType)AudioTypeOutput.System;
|
|
|
|
#else
|
2016-05-26 16:06:52 +03:00
|
|
|
outputDesciption.ComponentSubType = (int)AudioTypeOutput.System;
|
2022-01-21 23:30:55 +03:00
|
|
|
#endif
|
2016-05-26 16:06:52 +03:00
|
|
|
outputDesciption.ComponentFlags = 0;
|
|
|
|
outputDesciption.ComponentFlagsMask = 0;
|
|
|
|
outputDesciption.ComponentManufacturer = AudioComponentManufacturerType.Apple;
|
|
|
|
|
|
|
|
int mixerNode = graph.AddNode (mixerDescription);
|
|
|
|
int outputNode = graph.AddNode (outputDesciption);
|
|
|
|
|
|
|
|
AUGraphError error = graph.ConnnectNodeInput (mixerNode, 0, outputNode, 0);
|
|
|
|
Assert.AreEqual (AUGraphError.OK, error);
|
|
|
|
|
|
|
|
graph.Open ();
|
|
|
|
|
|
|
|
mMixer = graph.GetNodeInfo (mixerNode);
|
|
|
|
|
|
|
|
AudioUnitStatus status = mMixer.SetElementCount (AudioUnitScopeType.Input, 0);
|
|
|
|
Assert.AreEqual (AudioUnitStatus.OK, status);
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
2020-07-17 09:51:53 +03:00
|
|
|
public void DoTest ()
|
2016-05-26 16:06:52 +03:00
|
|
|
{
|
2021-05-31 16:25:08 +03:00
|
|
|
TestRuntime.AssertNotVirtualMachine ();
|
|
|
|
|
2016-05-26 16:06:52 +03:00
|
|
|
SetupAUGraph ();
|
|
|
|
|
|
|
|
// One of these has to be commented out depending on old\new build
|
|
|
|
graph.AddRenderNotify (GraphRenderCallback);
|
|
|
|
//graph.RenderCallback += HandleRenderCallback;
|
|
|
|
|
|
|
|
AudioUnitStatus status = mMixer.SetRenderCallback (MixerRenderCallback);
|
|
|
|
Assert.AreEqual (AudioUnitStatus.OK, status );
|
|
|
|
|
2020-07-17 09:51:53 +03:00
|
|
|
WaitOnGraphAndMixerCallbacks ();
|
2016-05-26 16:06:52 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
AudioUnitStatus GraphRenderCallback (AudioUnitRenderActionFlags actionFlags, AudioTimeStamp timeStamp, uint busNumber, uint numberFrames, AudioBuffers data)
|
|
|
|
{
|
|
|
|
graphRenderCallbackCount++;
|
|
|
|
return AudioUnitStatus.NoError;
|
|
|
|
}
|
|
|
|
|
|
|
|
AudioUnitStatus MixerRenderCallback (AudioUnitRenderActionFlags actionFlags, AudioTimeStamp timeStamp, uint busNumber, uint numberFrames, AudioBuffers data)
|
|
|
|
{
|
|
|
|
mixerRenderCallbackCount++;
|
|
|
|
return AudioUnitStatus.NoError;
|
|
|
|
}
|
|
|
|
|
2020-07-17 09:51:53 +03:00
|
|
|
void WaitOnGraphAndMixerCallbacks ()
|
2016-05-26 16:06:52 +03:00
|
|
|
{
|
|
|
|
graph.Initialize ();
|
|
|
|
graph.Start ();
|
|
|
|
|
|
|
|
// Wait for 1 second, then give up
|
|
|
|
try {
|
|
|
|
for (int i = 0; i < 100; ++i) {
|
|
|
|
if (graphRenderCallbackCount > 0 && mixerRenderCallbackCount > 0)
|
|
|
|
return;
|
2020-07-17 09:51:53 +03:00
|
|
|
Thread.Sleep (10);
|
2016-05-26 16:06:52 +03:00
|
|
|
}
|
|
|
|
Assert.Fail ("Did not see events after 1 second");
|
|
|
|
}
|
|
|
|
finally {
|
|
|
|
graph.Stop ();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-18 13:45:06 +03:00
|
|
|
#endif // __MACOS__
|