32
34
using System.Runtime.InteropServices;
33
35
using MonoMac.AudioToolbox;
36
using MonoMac.Foundation;
37
using System.Collections.Generic;
35
39
namespace MonoMac.AudioUnit
41
public enum AUGraphError
44
NodeNotFound = -10860,
45
InvalidConnection = -10861,
46
OutputNodeError = -10862,
47
CannotDoInCurrentContext = -10863,
48
InvalidAudioUnit = -10864,
50
// Values returned & shared with other error enums
51
FormatNotSupported = -10868,
52
InvalidElement = -10877,
37
55
public class AUGraph: IDisposable
40
57
readonly GCHandle gcHandle;
41
readonly IntPtr handle;
45
public event EventHandler<AudioGraphEventArgs> RenderCallback;
46
public IntPtr Handler { get { return handle; } }
50
private AUGraph(IntPtr ptr)
60
internal AUGraph (IntPtr ptr)
54
gcHandle = GCHandle.Alloc(this);
55
64
int err = AUGraphAddRenderNotify(handle, renderCallback, GCHandle.ToIntPtr(gcHandle));
57
66
throw new ArgumentException(String.Format("Error code: {0}", err));
68
gcHandle = GCHandle.Alloc (this);
71
public event EventHandler<AudioGraphEventArgs> RenderCallback;
73
[Advice ("Use Handle property instead")]
74
public IntPtr Handler {
80
public IntPtr Handle {
62
int err = NewAUGraph (ref handle);
88
int err = NewAUGraph (ref handle);
64
90
throw new InvalidOperationException(String.Format("Cannot create new AUGraph. Error code:", err));
93
public bool IsInitialized {
96
return AUGraphIsInitialized (handle, out b) == AUGraphError.OK && b;
103
return AUGraphIsOpen (handle, out b) == AUGraphError.OK && b;
107
public bool IsRunning {
110
return AUGraphIsRunning (handle, out b) == AUGraphError.OK && b;
69
#region Private methods
70
114
// callback funtion should be static method and be attatched a MonoPInvokeCallback attribute.
71
115
[MonoMac.MonoPInvokeCallback(typeof(AudioUnit.AURenderCallback))]
72
116
static int renderCallback(IntPtr inRefCon,
112
public int AddNode(AudioComponentDescription cd)
154
public int AddNode (AudioComponentDescription description)
115
int err = AUGraphAddNode(handle, cd, ref node);
157
var err = AUGraphAddNode (handle, description, out node);
117
159
throw new ArgumentException(String.Format("Error code:", err));
164
public AUGraphError RemoveNode (int node)
166
return AUGraphRemoveNode (handle, node);
169
public AUGraphError GetCPULoad (out float averageCPULoad)
171
return AUGraphGetCPULoad (handle, out averageCPULoad);
174
public AUGraphError GetMaxCPULoad (out float maxCPULoad)
176
return AUGraphGetMaxCPULoad (handle, out maxCPULoad);
179
public AUGraphError GetNode (uint index, out int node)
181
return AUGraphGetIndNode (handle, index, out node);
184
public AUGraphError GetNodeCount (out int count)
186
return AUGraphGetNodeCount (handle, out count);
122
public AudioUnit GetNodeInfo(int node)
189
public AudioUnit GetNodeInfo (int node)
125
IntPtr ptr = new IntPtr();
127
err = AUGraphNodeInfo(handle, node, null, (IntPtr)(&ptr));
192
var err = AUGraphNodeInfo(handle, node, IntPtr.Zero, out ptr);
130
194
throw new ArgumentException(String.Format("Error code:{0}", err));
132
196
if (ptr == IntPtr.Zero)
133
197
throw new InvalidOperationException("Can not get object instance");
135
return new AudioUnit(ptr);
138
public void ConnnectNodeInput(int inSourceNode, uint inSourceOutputNumber, int inDestNode, uint inDestInputNumber)
140
int err = AUGraphConnectNodeInput(handle,
141
inSourceNode, inSourceOutputNumber,
142
inDestNode, inDestInputNumber
145
throw new ArgumentException(String.Format("Error code:", err));
150
AUGraphStart(handle);
199
return new AudioUnit (ptr);
202
public AUGraphError GetNumberOfInteractions (out uint interactionsCount)
204
return AUGraphGetNumberOfInteractions (handle, out interactionsCount);
207
public AUGraphError GetNumberOfInteractions (int node, out uint interactionsCount)
209
return AUGraphCountNodeInteractions (handle, node, out interactionsCount);
213
// TODO: requires AudioComponentDescription type to be fixed
214
public AUGraphError GetNodeInfo (int node, out AudioComponentDescription description, out AudioUnit audioUnit)
217
var res = AUGraphNodeInfo (handle, node, out description, out au);
218
if (res != AUGraphError.OK) {
223
audioUnit = new AudioUnit (au);
227
public AUGraphError ConnnectNodeInput (int sourceNode, uint sourceOutputNumber, int destNode, uint destInputNumber)
229
return AUGraphConnectNodeInput (handle,
230
sourceNode, sourceOutputNumber,
231
destNode, destInputNumber);
234
public AUGraphError DisconnectNodeInput (int destNode, uint destInputNumber)
236
return AUGraphDisconnectNodeInput (handle, destNode, destInputNumber);
240
// Don't know how to test it yet
242
Dictionary<int, RenderDelegate> nodesCallbacks;
243
static readonly RenderCallbackShared CreateRenderCallback = RenderCallbackImpl;
245
public AUGraphError SetNodeInputCallback (int destNode, uint destInputNumber, RenderDelegate renderDelegate)
247
var cb = new AURenderCallbackStruct ();
248
cb.Proc = CreateRenderCallback;
249
cb.ProcRefCon = GCHandle.ToIntPtr (gcHandle);
252
if (nodesCallbacks == null) {
253
nodesCallbacks = new Dictionary<int, RenderDelegate> ();
255
res = AUGraphSetNodeInputCallback (handle, destNode, destInputNumber, ref cb);
257
res = AUGraphError.OK;
260
nodesCallbacks [destNode] = renderDelegate;
264
[MonoPInvokeCallback (typeof (RenderCallbackShared))]
265
static AudioUnitStatus RenderCallbackImpl (IntPtr clientData, ref AudioUnitRenderActionFlags actionFlags, ref AudioTimeStamp timeStamp, uint busNumber, uint numberFrames, IntPtr data)
267
GCHandle gch = GCHandle.FromIntPtr (clientData);
268
var au = (AUGraph) gch.Target;
272
public AUGraphError ClearConnections ()
274
return AUGraphClearConnections (handle);
277
public AUGraphError Start()
279
return AUGraphStart (handle);
282
public AUGraphError Stop()
284
return AUGraphStop (handle);
158
public void Initialize()
160
int err = AUGraphInitialize(handle);
162
throw new ArgumentException(String.Format("Error code:", err));
166
#region IDisposable メンバ (Members)
287
public AUGraphError Initialize()
289
return AUGraphInitialize (handle);
292
public bool Update ()
295
return AUGraphUpdate (handle, out isUpdated) == AUGraphError.OK && isUpdated;
167
298
public void Dispose()
191
321
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "NewAUGraph")]
192
322
static extern int NewAUGraph(ref IntPtr outGraph);
194
324
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphOpen")]
195
325
static extern int AUGraphOpen(IntPtr inGraph);
197
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphAddNode")]
198
static extern int AUGraphAddNode(IntPtr inGraph, AudioComponentDescription inDescription, ref int outNode);
200
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphNodeInfo")]
201
static extern int AUGraphNodeInfo(IntPtr inGraph, int inNode, AudioComponentDescription outDescription, IntPtr outAudioUnit);
203
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphConnectNodeInput")]
204
static extern int AUGraphConnectNodeInput(IntPtr inGraph, int inSourceNode, uint inSourceOutputNumber, int inDestNode, uint inDestInputNumber);
206
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphInitialize")]
207
static extern int AUGraphInitialize(IntPtr inGraph);
327
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
328
static extern AUGraphError AUGraphAddNode(IntPtr inGraph, AudioComponentDescription inDescription, out int outNode);
330
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
331
static extern AUGraphError AUGraphRemoveNode (IntPtr inGraph, int inNode);
333
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
334
static extern AUGraphError AUGraphGetNodeCount (IntPtr inGraph, out int outNumberOfNodes);
336
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
337
static extern AUGraphError AUGraphGetIndNode (IntPtr inGraph, uint inIndex, out int outNode);
339
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
340
static extern AUGraphError AUGraphNodeInfo(IntPtr inGraph, int inNode, IntPtr outDescription, out IntPtr outAudioUnit);
342
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
343
static extern AUGraphError AUGraphNodeInfo (IntPtr inGraph, int inNode, out AudioComponentDescription outDescription, out IntPtr outAudioUnit);
345
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
346
static extern AUGraphError AUGraphClearConnections (IntPtr inGraph);
348
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
349
static extern AUGraphError AUGraphConnectNodeInput (IntPtr inGraph, int inSourceNode, uint inSourceOutputNumber, int inDestNode, uint inDestInputNumber);
351
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
352
static extern AUGraphError AUGraphDisconnectNodeInput (IntPtr inGraph, int inDestNode, uint inDestInputNumber);
354
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
355
static extern AUGraphError AUGraphGetNumberOfInteractions (IntPtr inGraph, out uint outNumInteractions);
357
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
358
static extern AUGraphError AUGraphCountNodeInteractions (IntPtr inGraph, int inNode, out uint outNumInteractions);
360
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
361
static extern AUGraphError AUGraphInitialize (IntPtr inGraph);
209
363
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphAddRenderNotify")]
210
364
static extern int AUGraphAddRenderNotify(IntPtr inGraph, AudioUnit.AURenderCallback inCallback, IntPtr inRefCon );
212
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphStart")]
213
static extern int AUGraphStart(IntPtr inGraph);
215
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphStop")]
216
static extern int AUGraphStop(IntPtr inGraph);
218
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphUninitialize")]
219
static extern int AUGraphUninitialize(IntPtr inGraph);
366
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
367
static extern AUGraphError AUGraphStart (IntPtr inGraph);
369
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
370
static extern AUGraphError AUGraphStop (IntPtr inGraph);
372
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
373
static extern AUGraphError AUGraphUninitialize (IntPtr inGraph);
221
375
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphClose")]
222
376
static extern int AUGraphClose(IntPtr inGraph);
224
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "DisposeAUGraph")]
225
static extern int DisposeAUGraph(IntPtr inGraph);
378
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
379
static extern int DisposeAUGraph(IntPtr inGraph);
381
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
382
static extern AUGraphError AUGraphIsOpen (IntPtr inGraph, out bool outIsOpen);
384
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
385
static extern AUGraphError AUGraphIsInitialized (IntPtr inGraph, out bool outIsInitialized);
387
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
388
static extern AUGraphError AUGraphIsRunning (IntPtr inGraph, out bool outIsRunning);
390
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
391
static extern AUGraphError AUGraphGetCPULoad (IntPtr inGraph, out float outAverageCPULoad);
393
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
394
static extern AUGraphError AUGraphGetMaxCPULoad (IntPtr inGraph, out float outMaxLoad);
396
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
397
static extern AUGraphError AUGraphSetNodeInputCallback (IntPtr inGraph, int inDestNode, uint inDestInputNumber, ref AURenderCallbackStruct inInputCallback);
399
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
400
static extern AUGraphError AUGraphUpdate (IntPtr inGraph, out bool outIsUpdated);