133
public delegate AudioUnitStatus RenderDelegate (AudioUnitRenderActionFlags actionFlags, AudioTimeStamp timeStamp, uint busNumber, uint numberFrames, AudioBuffers data);
135
delegate AudioUnitStatus RenderCallbackShared (IntPtr clientData, ref AudioUnitRenderActionFlags actionFlags, ref AudioTimeStamp timeStamp, uint busNumber, uint numberFrames, IntPtr data);
137
struct AURenderCallbackStruct
139
public RenderCallbackShared Proc;
140
public IntPtr ProcRefCon;
124
public class AudioUnit : IDisposable, MonoMac.ObjCRuntime.INativeObject {
143
public class AudioUnit : IDisposable, MonoMac.ObjCRuntime.INativeObject
145
static readonly RenderCallbackShared CreateRenderCallback = RenderCallbackImpl;
125
147
GCHandle gcHandle;
129
public IntPtr Handle { get { return handle; }}
131
public event EventHandler<AudioUnitEventArgs> RenderCallback;
132
//public event EventHandler<AudioUnitEventArgs> InputCallback;
133
public bool IsPlaying { get { return _isPlaying; } }
151
RenderDelegate render;
135
153
internal AudioUnit (IntPtr ptr)
156
gcHandle = GCHandle.Alloc(this);
140
159
public AudioUnit (AudioComponent component)
218
263
return audioFormat;
221
public void SetEnableIO(bool enableIO, AudioUnitScopeType scope, uint audioUnitElement)
266
public AudioUnitStatus SetEnableIO (bool enableIO, AudioUnitScopeType scope, uint audioUnitElement = 0)
223
uint flag = (uint)(enableIO ? 1 : 0);
224
int err = AudioUnitSetProperty(handle,
225
AudioUnitPropertyIDType.EnableIO,
229
(uint)Marshal.SizeOf(typeof(uint)));
231
throw new AudioUnitException (err);
268
uint flag = enableIO ? (uint)1 : 0;
269
return AudioUnitSetProperty (handle, AudioUnitPropertyIDType.EnableIO, scope, audioUnitElement, ref flag, sizeof (uint));
272
public AudioUnitStatus SetMaximumFramesPerSlice (uint value, AudioUnitScopeType scope, uint audioUnitElement = 0)
274
return AudioUnitSetProperty (handle, AudioUnitPropertyIDType.MaximumFramesPerSlice, scope, audioUnitElement, ref value, sizeof (uint));
277
#region SetRenderCallback
279
public AudioUnitStatus SetRenderCallback (RenderDelegate renderDelegate, AudioUnitScopeType scope, uint audioUnitElement = 0)
281
var cb = new AURenderCallbackStruct ();
282
cb.Proc = CreateRenderCallback;
283
cb.ProcRefCon = GCHandle.ToIntPtr (gcHandle);
285
this.render = renderDelegate;
287
return AudioUnitSetProperty (handle, AudioUnitPropertyIDType.SetRenderCallback, scope, audioUnitElement, ref cb, Marshal.SizeOf (cb));
290
[MonoPInvokeCallback (typeof (RenderCallbackShared))]
291
static AudioUnitStatus RenderCallbackImpl (IntPtr clientData, ref AudioUnitRenderActionFlags actionFlags, ref AudioTimeStamp timeStamp, uint busNumber, uint numberFrames, IntPtr data)
293
GCHandle gch = GCHandle.FromIntPtr (clientData);
294
var au = (AudioUnit) gch.Target;
296
return au.render (actionFlags, timeStamp, busNumber, numberFrames, new AudioBuffers (data));
234
301
public int Initialize ()
236
303
return AudioUnitInitialize(handle);
366
public AudioUnitStatus SetParameter (AudioUnitParameterType type, float value, AudioUnitScopeType scope, uint audioUnitElement = 0)
368
return AudioUnitSetParameter (handle, type, scope, audioUnitElement, value, 0);
288
#region IDisposable ć”ć³ć
289
371
public void Dispose()
292
374
GC.SuppressFinalize (this);
295
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "AudioComponentInstanceDispose")]
377
[DllImport(MonoMac.Constants.AudioUnitLibrary)]
296
378
static extern int AudioComponentInstanceDispose(IntPtr inInstance);
298
380
public void Dispose (bool disposing)
300
382
if (handle != IntPtr.Zero){
302
AudioUnitUnInitialize (handle);
384
AudioUnitUninitialize (handle);
303
385
AudioComponentInstanceDispose (handle);
305
387
handle = IntPtr.Zero;
310
/// AudioUnit call back method declaration
312
392
internal delegate int AURenderCallback(IntPtr inRefCon,
313
393
ref AudioUnitRenderActionFlags ioActionFlags,
314
394
ref AudioTimeStamp inTimeStamp,
324
405
public AURenderCallbackStrct() { }
327
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "AudioComponentInstanceNew")]
408
[DllImport(MonoMac.Constants.AudioUnitLibrary, EntryPoint = "AudioComponentInstanceNew")]
328
409
static extern int AudioComponentInstanceNew(IntPtr inComponent, out IntPtr inDesc);
330
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "AudioComponentInstanceNew")]
411
[DllImport(MonoMac.Constants.AudioUnitLibrary)]
331
412
static extern IntPtr AudioComponentInstanceGetComponent (IntPtr inComponent);
332
public AudioComponent Component {
334
return new AudioComponent (AudioComponentInstanceGetComponent (handle));
338
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
414
[DllImport(MonoMac.Constants.AudioUnitLibrary)]
339
415
static extern int AudioUnitInitialize(IntPtr inUnit);
341
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
342
static extern int AudioUnitUnInitialize(IntPtr inUnit);
417
[DllImport(MonoMac.Constants.AudioUnitLibrary)]
418
static extern int AudioUnitUninitialize(IntPtr inUnit);
344
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
420
[DllImport(MonoMac.Constants.AudioUnitLibrary)]
345
421
static extern int AudioOutputUnitStart(IntPtr ci);
347
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
423
[DllImport(MonoMac.Constants.AudioUnitLibrary)]
348
424
static extern int AudioOutputUnitStop(IntPtr ci);
350
[DllImport(MonoMac.Constants.AudioToolboxLibrary)]
427
[DllImport(MonoMac.Constants.AudioUnitLibrary)]
351
428
static extern int AudioUnitRender(IntPtr inUnit,
352
429
ref AudioUnitRenderActionFlags ioActionFlags,
353
430
ref AudioTimeStamp inTimeStamp,
371
454
ref MonoMac.AudioToolbox.AudioStreamBasicDescription inData,
372
455
uint inDataSize);
374
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "AudioUnitSetProperty")]
375
static extern int AudioUnitSetProperty(IntPtr inUnit,
376
[MarshalAs(UnmanagedType.U4)] AudioUnitPropertyIDType inID,
377
[MarshalAs(UnmanagedType.U4)] AudioUnitScopeType inScope,
378
[MarshalAs(UnmanagedType.U4)] uint inElement,
457
[DllImport(MonoMac.Constants.AudioUnitLibrary)]
458
static extern AudioUnitStatus AudioUnitSetProperty (IntPtr inUnit, AudioUnitPropertyIDType inID, AudioUnitScopeType inScope, uint inElement,
459
ref uint inData, uint inDataSize);
461
[DllImport(MonoMac.Constants.AudioUnitLibrary)]
462
static extern AudioUnitStatus AudioUnitSetProperty (IntPtr inUnit, AudioUnitPropertyIDType inID, AudioUnitScopeType inScope, uint inElement,
463
ref AURenderCallbackStruct inData, int inDataSize);
382
[DllImport(MonoMac.Constants.AudioToolboxLibrary, EntryPoint = "AudioUnitGetProperty")]
466
[DllImport(MonoMac.Constants.AudioUnitLibrary)]
383
467
static extern int AudioUnitGetProperty(IntPtr inUnit,
384
468
[MarshalAs(UnmanagedType.U4)] AudioUnitPropertyIDType inID,
385
469
[MarshalAs(UnmanagedType.U4)] AudioUnitScopeType inScope,
416
505
SetRenderCallback = 23,
417
506
FactoryPresets = 24,
418
507
RenderQuality = 26,
419
509
InPlaceProcessing = 29,
420
510
ElementName = 30,
421
511
SupportedChannelLayoutTags = 32,
422
512
PresentPreset = 36,
514
DependentParameters = 45,
515
InputSampleInOutput = 49,
423
516
ShouldAllocateBuffer = 51,
426
CurrentDevice = 2000,
427
ChannelMap = 2002, // this will also work with AUConverter
430
SetInputCallback = 2005,
432
StartTimestampsAtZero = 2007 // this will also work with AUConverter
517
ParameterHistoryInfo = 53,
521
SetExternalBuffer = 15,
522
GetUIComponentList = 18,
525
ParameterIDName = 34,
526
ParameterClumpName = 35,
527
ParameterStringFromValue = 33,
528
ParameterValueFromString = 38,
530
PresentationLatency = 40,
531
AUHostIdentifier = 46,
532
MIDIOutputCallbackInfo = 47,
533
MIDIOutputCallback = 48,
534
ClassInfoFromDocument = 50,
535
FrequencyResponse = 52,
538
CurrentDevice = 2000,
540
ChannelMap = 2002, // this will also work with AUConverter
543
SetInputCallback = 2005,
545
StartTimestampsAtZero = 2007, // this will also work with AUConverter
547
// TODO: Many more are missing but maybe we shold split it by AudioComponentType
550
public enum AudioUnitParameterType
552
// Reverb applicable to the 3DMixer
553
ReverbFilterFrequency = 14,
554
ReverbFilterBandwidth = 15,
555
ReverbFilterGain = 16,
557
// AUMultiChannelMixer
558
MultiChannelMixerVolume = 0,
559
MultiChannelMixerEnable = 1,
560
MultiChannelMixerPan = 2,
562
// AUMatrixMixer unit
563
MatrixMixerVolume = 0,
564
MatrixMixerEnable = 1,
566
// AudioDeviceOutput, DefaultOutputUnit, and SystemOutputUnit units
567
HALOutputVolume = 14,
569
// AUTimePitch, AUTimePitch (offline), AUPitch units
573
TimePitchEffectBlend = 2,
577
NewTimePitchRate = 0,
578
NewTimePitchPitch = 1,
579
NewTimePitchOverlap = 4,
580
NewTimePitchEnablePeakLocking = 6,
584
AUSamplerCoarseTuning = 901,
585
AUSamplerFineTuning = 902,
589
BandpassCenterFrequency = 0,
590
BandpassBandwidth = 1,
593
HipassCutoffFrequency = 0,
597
LowPassCutoffFrequency = 0,
598
LowPassResonance = 1,
601
HighShelfCutOffFrequency = 0,
605
AULowShelfCutoffFrequency = 0,
609
AUDCFilterDecayTime = 0,
612
ParametricEQCenterFreq = 0,
614
ParametricEQGain = 2,
617
LimiterAttackTime = 0,
618
LimiterDecayTime = 1,
621
// AUDynamicsProcessor
622
DynamicsProcessorThreshold = 0,
623
DynamicsProcessorHeadRoom = 1,
624
DynamicsProcessorExpansionRatio = 2,
625
DynamicsProcessorExpansionThreshold = 3,
626
DynamicsProcessorAttackTime = 4,
627
DynamicsProcessorReleaseTime = 5,
628
DynamicsProcessorMasterGain = 6,
629
DynamicsProcessorCompressionAmount = 1000,
630
DynamicsProcessorInputAmplitude = 2000,
631
DynamicsProcessorOutputAmplitude = 3000,
634
VarispeedPlaybackRate = 0,
635
VarispeedPlaybackCents = 1,
640
DistortionDelayMix = 2,
641
DistortionDecimation = 3,
642
DistortionRounding = 4,
643
DistortionDecimationMix = 5,
644
DistortionLinearTerm = 6,
645
DistortionSquaredTerm = 7,
646
DistortionCubicTerm = 8,
647
DistortionPolynomialMix = 9,
648
DistortionRingModFreq1 = 10,
649
DistortionRingModFreq2 = 11,
650
DistortionRingModBalance = 12,
651
DistortionRingModMix = 13,
652
DistortionSoftClipGain = 14,
653
DistortionFinalMix = 15,
659
DelayLopassCutoff = 3,
665
AUNBandEQGlobalGain = 0,
666
AUNBandEQBypassBand = 1000,
667
AUNBandEQFilterType = 2000,
668
AUNBandEQFrequency = 3000,
669
AUNBandEQGain = 4000,
670
AUNBandEQBandwidth = 5000,
673
Reverb2DryWetMix = 0,
675
Reverb2MinDelayTime = 2,
676
Reverb2MaxDelayTime = 3,
677
Reverb2DecayTimeAt0Hz = 4,
678
Reverb2DecayTimeAtNyquist = 5,
679
Reverb2RandomizeReflections = 6,
435
public enum AudioUnitScopeType {
683
public enum AudioUnitScopeType {
442
public enum AudioUnitRenderActionFlags {
695
public enum AudioUnitRenderActionFlags {
443
696
PreRender = (1 << 2),
444
697
PostRender = (1 << 3),
445
698
OutputIsSilence = (1 << 4),
446
699
OfflinePreflight = (1 << 5),
447
700
OfflineRender = (1 << 6),
448
701
OfflineComplete = (1 << 7),
449
PostRenderError = (1 << 8)
702
PostRenderError = (1 << 8),
703
DoNotCheckRenderArgs = (1 << 9)