Skip to content

Commit

Permalink
remote io play through sample code is added. this do not work. compil…
Browse files Browse the repository at this point in the history
…ation fails with an error code 134.
  • Loading branch information
reinforce-lab committed Jul 31, 2010
1 parent a1ab573 commit 80b4b96
Show file tree
Hide file tree
Showing 70 changed files with 7,969 additions and 417 deletions.
178 changes: 178 additions & 0 deletions MonoTouch_AudioUnit/AUGraph.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
using System;
using System.Text;
using System.Runtime.InteropServices;

namespace MonoTouch.AudioToolbox
{
public class AUGraph: IDisposable
{
#region Variables
readonly GCHandle _handle;
readonly IntPtr _auGraph;
#endregion

#region Properties
public event EventHandler<AudioGraphEventArgs> RenderCallback;
public IntPtr Handler { get { return _auGraph; } }
#endregion

#region Constructor
private AUGraph(IntPtr ptr)
{
_auGraph = ptr;

_handle = GCHandle.Alloc(this);
int err = AUGraphAddRenderNotify(_auGraph, renderCallback, GCHandle.ToIntPtr(_handle));
if (err != 0)
throw new ArgumentException(String.Format("Error code: {0}", err));
}
#endregion

#region Private methods
// callback funtion should be static method and be attatched a MonoPInvokeCallback attribute.
[MonoTouch.MonoPInvokeCallback(typeof(AudioUnit.AURenderCallback))]
static int renderCallback(IntPtr inRefCon,
ref AudioUnit.AudioUnitRenderActionFlags _ioActionFlags,
MonoTouch.AudioToolbox.AudioTimeStamp _inTimeStamp,
uint _inBusNumber,
uint _inNumberFrames,
AudioBufferList _ioData)
{
// getting audiounit instance
var handler = GCHandle.FromIntPtr(inRefCon);
var inst = (AUGraph)handler.Target;

// evoke event handler with an argument
if (inst.RenderCallback != null)
{
var args = new AudioGraphEventArgs(
_ioActionFlags,
_inTimeStamp,
_inBusNumber,
_inNumberFrames,
_ioData);
inst.RenderCallback(inst, args);
}

return 0; // noerror
}
#endregion

#region Public methods
public static AUGraph CreateInstance()
{
var ptr = new IntPtr();
int err = NewAUGraph(ref ptr);
if (err != 0)
throw new InvalidOperationException(String.Format("Cannot create new AUGraph. Error code:", err));

err = AUGraphOpen(ptr);
if (err != 0)
throw new InvalidOperationException(String.Format("Cannot open AUGraph. Error code:", err));

return new AUGraph(ptr);
}
public int AddNode(AudioComponentDescription cd)
{
int node = 0;
int err = AUGraphAddNode(_auGraph, cd, ref node);
if (err != 0)
throw new ArgumentException(String.Format("Error code:", err));

return node;
}
public AudioUnit GetNodeInfo(int node)
{
int err;
IntPtr ptr = new IntPtr();
unsafe
{
err = AUGraphNodeInfo(_auGraph, node, null, (IntPtr)(&ptr));
}
if (err != 0)
{
throw new ArgumentException(String.Format("Error code:{0}", err));
}
if (ptr == IntPtr.Zero)
{
throw new InvalidOperationException("Can not get object instance");
}

return new AudioUnit(ptr);
}
public void ConnnectNodeInput(int inSourceNode, uint inSourceOutputNumber, int inDestNode, uint inDestInputNumber)
{
int err = AUGraphConnectNodeInput(_auGraph,
inSourceNode, inSourceOutputNumber,
inDestNode, inDestInputNumber
);
if (err != 0)
throw new ArgumentException(String.Format("Error code:", err));
}
public void Start()
{
AUGraphStart(_auGraph);
}
public void Stop()
{
AUGraphStop(_auGraph);
}
public void Initialize()
{
int err = AUGraphInitialize(_auGraph);
if (err != 0)
throw new ArgumentException(String.Format("Error code:", err));
}
#endregion

#region IDisposable メンバ
public void Dispose()
{
AUGraphUninitialize(_auGraph);
AUGraphClose(_auGraph);
DisposeAUGraph(_auGraph);

_handle.Free();
}
#endregion

#region Interop
[DllImport(MonoTouch.Constants.AudioToolboxLibrary, EntryPoint = "NewAUGraph")]
static extern int NewAUGraph(ref IntPtr outGraph);

[DllImport(MonoTouch.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphOpen")]
static extern int AUGraphOpen(IntPtr inGraph);

[DllImport(MonoTouch.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphAddNode")]
static extern int AUGraphAddNode(IntPtr inGraph, AudioComponentDescription inDescription, ref int outNode);

[DllImport(MonoTouch.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphNodeInfo")]
static extern int AUGraphNodeInfo(IntPtr inGraph, int inNode, AudioComponentDescription outDescription, IntPtr outAudioUnit);

[DllImport(MonoTouch.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphConnectNodeInput")]
static extern int AUGraphConnectNodeInput(IntPtr inGraph, int inSourceNode, uint inSourceOutputNumber, int inDestNode, uint inDestInputNumber);

[DllImport(MonoTouch.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphInitialize")]
static extern int AUGraphInitialize(IntPtr inGraph);

[DllImport(MonoTouch.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphAddRenderNotify")]
static extern int AUGraphAddRenderNotify(IntPtr inGraph, AudioUnit.AURenderCallback inCallback, IntPtr inRefCon );

[DllImport(MonoTouch.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphStart")]
static extern int AUGraphStart(IntPtr inGraph);

[DllImport(MonoTouch.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphStop")]
static extern int AUGraphStop(IntPtr inGraph);

[DllImport(MonoTouch.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphUninitialize")]
static extern int AUGraphUninitialize(IntPtr inGraph);

[DllImport(MonoTouch.Constants.AudioToolboxLibrary, EntryPoint = "AUGraphClose")]
static extern int AUGraphClose(IntPtr inGraph);

[DllImport(MonoTouch.Constants.AudioToolboxLibrary, EntryPoint = "DisposeAUGraph")]
static extern int DisposeAUGraph(IntPtr inGraph);
#endregion

}
}
2 changes: 1 addition & 1 deletion MonoTouch_AudioUnit/AudioBuffer.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System;
using System.Runtime.InteropServices;

namespace MonoTouch.AudioUnitWrapper
namespace MonoTouch.AudioToolbox
{
[StructLayout(LayoutKind.Sequential)]
public struct AudioBuffer
Expand Down
4 changes: 2 additions & 2 deletions MonoTouch_AudioUnit/AudioBufferList.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System;
using System.Runtime.InteropServices;

namespace MonoTouch.AudioUnitWrapper
namespace MonoTouch.AudioToolbox
{
[StructLayout(LayoutKind.Sequential)]
public class AudioBufferList
Expand Down
2 changes: 1 addition & 1 deletion MonoTouch_AudioUnit/AudioComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
using System.Runtime.InteropServices;


namespace MonoTouch.AudioUnitWrapper
namespace MonoTouch.AudioToolbox
{
public class AudioComponent : IDisposable
{
Expand Down
2 changes: 1 addition & 1 deletion MonoTouch_AudioUnit/AudioComponentDescription.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
using System.Text;
using System.Runtime.InteropServices;

namespace MonoTouch.AudioUnitWrapper
namespace MonoTouch.AudioToolbox
{
[StructLayout(LayoutKind.Sequential)]
public class AudioComponentDescription
Expand Down
21 changes: 21 additions & 0 deletions MonoTouch_AudioUnit/AudioGraphEventArgs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MonoTouch.AudioToolbox
{
public class AudioGraphEventArgs : AudioUnitEventArgs
{
#region Constructor
public AudioGraphEventArgs(AudioUnit.AudioUnitRenderActionFlags _ioActionFlags,
MonoTouch.AudioToolbox.AudioTimeStamp _inTimeStamp,
uint _inBusNumber,
uint _inNumberFrames,
AudioBufferList _ioData)
: base(_ioActionFlags, _inTimeStamp, _inBusNumber, _inNumberFrames, _ioData)
{
}
#endregion
}
}
Loading

0 comments on commit 80b4b96

Please sign in to comment.