Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[AudioToolbox] Make P/Invokes in AudioQueue.cs have blittable signatures. #19933

Merged
merged 2 commits into from
Jan 29, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
291 changes: 180 additions & 111 deletions src/AudioToolbox/AudioQueue.cs
Original file line number Diff line number Diff line change
@@ -34,6 +34,7 @@
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using CoreFoundation;
using Foundation;
@@ -421,7 +422,7 @@ public void QueueDispose ()
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static OSStatus AudioQueueDispose (IntPtr AQ, [MarshalAs (UnmanagedType.I1)] bool immediate);
extern static OSStatus AudioQueueDispose (IntPtr AQ, byte immediate);

protected virtual void Dispose (bool disposing)
{
@@ -445,7 +446,7 @@ void Dispose (bool disposing, bool immediate)
}
}

AudioQueueDispose (handle, immediate);
AudioQueueDispose (handle, immediate ? (byte) 1 : (byte) 0);
handle = IntPtr.Zero;
}

@@ -454,14 +455,16 @@ void Dispose (bool disposing, bool immediate)
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueueStart (IntPtr AQ, ref AudioTimeStamp startTime);
unsafe extern static AudioQueueStatus AudioQueueStart (IntPtr AQ, AudioTimeStamp* startTime);

[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueueStart (IntPtr AQ, IntPtr startTime);

public AudioQueueStatus Start (AudioTimeStamp startTime)
{
return AudioQueueStart (handle, ref startTime);
unsafe {
return AudioQueueStart (handle, &startTime);
}
}

public AudioQueueStatus Start ()
@@ -470,10 +473,13 @@ public AudioQueueStatus Start ()
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueuePrime (IntPtr AQ, int toPrepare, out int prepared);
unsafe extern static AudioQueueStatus AudioQueuePrime (IntPtr AQ, int toPrepare, int* prepared);
public AudioQueueStatus Prime (int toPrepare, out int prepared)
{
return AudioQueuePrime (handle, toPrepare, out prepared);
prepared = 0;
unsafe {
return AudioQueuePrime (handle, toPrepare, AsPointer<int> (ref prepared));
}
}

[DllImport (Constants.AudioToolboxLibrary)]
@@ -484,10 +490,10 @@ public AudioQueueStatus Flush ()
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueueStop (IntPtr aq, [MarshalAs (UnmanagedType.I1)] bool immediate);
unsafe extern static AudioQueueStatus AudioQueueStop (IntPtr aq, byte immediate);
public AudioQueueStatus Stop (bool immediate)
{
return AudioQueueStop (handle, immediate);
return AudioQueueStop (handle, immediate ? (byte) 1 : (byte) 0);
}

[DllImport (Constants.AudioToolboxLibrary)]
@@ -505,26 +511,32 @@ public AudioQueueStatus Reset ()
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueueAllocateBuffer (AudioQueueRef AQ, int bufferSize, out IntPtr audioQueueBuffer);
unsafe extern static AudioQueueStatus AudioQueueAllocateBuffer (AudioQueueRef AQ, int bufferSize, IntPtr* audioQueueBuffer);
public AudioQueueStatus AllocateBuffer (int bufferSize, out IntPtr audioQueueBuffer)
{
return AudioQueueAllocateBuffer (handle, bufferSize, out audioQueueBuffer);
audioQueueBuffer = default (IntPtr);
unsafe {
return AudioQueueAllocateBuffer (handle, bufferSize, AsPointer<IntPtr> (ref audioQueueBuffer));
}
}

public unsafe AudioQueueStatus AllocateBuffer (int bufferSize, out AudioQueueBuffer* audioQueueBuffer)
{
IntPtr buf;
AudioQueueStatus result;
result = AudioQueueAllocateBuffer (handle, bufferSize, out buf);
result = AudioQueueAllocateBuffer (handle, bufferSize, &buf);
audioQueueBuffer = (AudioQueueBuffer*) buf;
return result;
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueueAllocateBufferWithPacketDescriptions (IntPtr AQ, int bufferSize, int nPackets, out IntPtr audioQueueBuffer);
unsafe extern static AudioQueueStatus AudioQueueAllocateBufferWithPacketDescriptions (IntPtr AQ, int bufferSize, int nPackets, IntPtr* audioQueueBuffer);
public AudioQueueStatus AllocateBufferWithPacketDescriptors (int bufferSize, int nPackets, out IntPtr audioQueueBuffer)
{
return AudioQueueAllocateBufferWithPacketDescriptions (handle, bufferSize, nPackets, out audioQueueBuffer);
audioQueueBuffer = default (IntPtr);
unsafe {
return AudioQueueAllocateBufferWithPacketDescriptions (handle, bufferSize, nPackets, AsPointer<IntPtr> (ref audioQueueBuffer));
}
}

[DllImport (Constants.AudioToolboxLibrary)]
@@ -545,7 +557,7 @@ public static void FillAudioData (IntPtr audioQueueBuffer, int offset, IntPtr so
}

[DllImport (Constants.AudioToolboxLibrary)]
internal extern unsafe static AudioQueueStatus AudioQueueEnqueueBuffer (IntPtr AQ, AudioQueueBuffer* audioQueueBuffer, int nPackets, AudioStreamPacketDescription []? desc);
internal extern unsafe static AudioQueueStatus AudioQueueEnqueueBuffer (IntPtr AQ, AudioQueueBuffer* audioQueueBuffer, int nPackets, AudioStreamPacketDescription* desc);

public AudioQueueStatus EnqueueBuffer (IntPtr audioQueueBuffer, int bytes, AudioStreamPacketDescription [] desc)
{
@@ -564,42 +576,33 @@ public unsafe AudioQueueStatus EnqueueBuffer (AudioQueueBuffer* audioQueueBuffer
if (audioQueueBuffer is null)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (audioQueueBuffer));

return AudioQueueEnqueueBuffer (handle, audioQueueBuffer, desc?.Length ?? 0, desc);
fixed (AudioStreamPacketDescription* descPtr = desc) {
return AudioQueueEnqueueBuffer (handle, audioQueueBuffer, desc?.Length ?? 0, descPtr);
}
}

public unsafe AudioQueueStatus EnqueueBuffer (IntPtr audioQueueBuffer, AudioStreamPacketDescription [] desc)
{
if (audioQueueBuffer == IntPtr.Zero)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (audioQueueBuffer));

return AudioQueueEnqueueBuffer (handle, (AudioQueueBuffer*) audioQueueBuffer, desc?.Length ?? 0, desc);
fixed (AudioStreamPacketDescription* descPtr = desc) {
return AudioQueueEnqueueBuffer (handle, (AudioQueueBuffer*) audioQueueBuffer, desc?.Length ?? 0, descPtr);
}
}

[DllImport (Constants.AudioToolboxLibrary)]
extern unsafe static AudioQueueStatus AudioQueueEnqueueBufferWithParameters (
IntPtr AQ,
AudioQueueBuffer* audioQueueBuffer,
int nPackets,
AudioStreamPacketDescription []? desc,
AudioStreamPacketDescription* desc,
int trimFramesAtStart,
int trimFramesAtEnd,
int nParam,
AudioQueueParameterEvent []? parameterEvents,
ref AudioTimeStamp startTime,
out AudioTimeStamp actualStartTime);

[DllImport (Constants.AudioToolboxLibrary)]
extern unsafe static AudioQueueStatus AudioQueueEnqueueBufferWithParameters (
IntPtr AQ,
AudioQueueBuffer* audioQueueBuffer,
int nPackets,
AudioStreamPacketDescription []? desc,
int trimFramesAtStart,
int trimFramesAtEnd,
int nParam,
AudioQueueParameterEvent []? parameterEvents,
AudioQueueParameterEvent* parameterEvents,
AudioTimeStamp* startTime,
out AudioTimeStamp actualStartTime);
AudioTimeStamp* actualStartTime);

public AudioQueueStatus EnqueueBuffer (IntPtr audioQueueBuffer, int bytes, AudioStreamPacketDescription [] desc,
int trimFramesAtStart, int trimFramesAtEnd, AudioQueueParameterEvent [] parameterEvents,
@@ -608,16 +611,21 @@ public AudioQueueStatus EnqueueBuffer (IntPtr audioQueueBuffer, int bytes, Audio
if (audioQueueBuffer == IntPtr.Zero)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (audioQueueBuffer));

actualStartTime = default (AudioTimeStamp);

unsafe {
AudioQueueBuffer* buffer = (AudioQueueBuffer*) audioQueueBuffer;
buffer->AudioDataByteSize = (uint) bytes;

return AudioQueueEnqueueBufferWithParameters (
handle, buffer, desc?.Length ?? 0, desc,
trimFramesAtStart, trimFramesAtEnd, parameterEvents?.Length ?? 0,
parameterEvents,
ref startTime,
out actualStartTime);
fixed (AudioStreamPacketDescription* descPtr = desc)
fixed (AudioQueueParameterEvent* parameterEventsPtr = parameterEvents) {
return AudioQueueEnqueueBufferWithParameters (
handle, buffer, desc?.Length ?? 0, descPtr,
trimFramesAtStart, trimFramesAtEnd, parameterEvents?.Length ?? 0,
parameterEventsPtr,
AsPointer<AudioTimeStamp> (ref startTime),
AsPointer<AudioTimeStamp> (ref actualStartTime));
}
}
}
public AudioQueueStatus EnqueueBuffer (IntPtr audioQueueBuffer, int bytes, AudioStreamPacketDescription [] desc,
@@ -627,16 +635,21 @@ public AudioQueueStatus EnqueueBuffer (IntPtr audioQueueBuffer, int bytes, Audio
if (audioQueueBuffer == IntPtr.Zero)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (audioQueueBuffer));

actualStartTime = default (AudioTimeStamp);

unsafe {
AudioQueueBuffer* buffer = (AudioQueueBuffer*) audioQueueBuffer;
buffer->AudioDataByteSize = (uint) bytes;

return AudioQueueEnqueueBufferWithParameters (
handle, buffer, desc?.Length ?? 0, desc,
trimFramesAtStart, trimFramesAtEnd, parameterEvents?.Length ?? 0,
parameterEvents,
null,
out actualStartTime);
fixed (AudioStreamPacketDescription* descPtr = desc)
fixed (AudioQueueParameterEvent* parameterEventsPtr = parameterEvents) {
return AudioQueueEnqueueBufferWithParameters (
handle, buffer, desc?.Length ?? 0, descPtr,
trimFramesAtStart, trimFramesAtEnd, parameterEvents?.Length ?? 0,
parameterEventsPtr,
null,
AsPointer<AudioTimeStamp> (ref actualStartTime));
}
}
}

@@ -647,12 +660,17 @@ public unsafe AudioQueueStatus EnqueueBuffer (AudioQueueBuffer* audioQueueBuffer
if (audioQueueBuffer is null)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (audioQueueBuffer));

return AudioQueueEnqueueBufferWithParameters (
handle, audioQueueBuffer, desc?.Length ?? 0, desc,
trimFramesAtStart, trimFramesAtEnd, parameterEvents?.Length ?? 0,
parameterEvents,
ref startTime,
out actualStartTime);
fixed (AudioStreamPacketDescription* descPtr = desc)
fixed (AudioQueueParameterEvent* parameterEventsPtr = parameterEvents) {
startTime = default;
actualStartTime = default;
return AudioQueueEnqueueBufferWithParameters (
handle, audioQueueBuffer, desc?.Length ?? 0, descPtr,
trimFramesAtStart, trimFramesAtEnd, parameterEvents?.Length ?? 0,
parameterEventsPtr,
AsPointer<AudioTimeStamp> (ref startTime),
AsPointer<AudioTimeStamp> (ref actualStartTime));
}
}

public unsafe AudioQueueStatus EnqueueBuffer (AudioQueueBuffer* audioQueueBuffer, int bytes, AudioStreamPacketDescription [] desc,
@@ -662,30 +680,36 @@ public unsafe AudioQueueStatus EnqueueBuffer (AudioQueueBuffer* audioQueueBuffer
if (audioQueueBuffer is null)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (audioQueueBuffer));

return AudioQueueEnqueueBufferWithParameters (
handle, audioQueueBuffer, desc?.Length ?? 0, desc,
trimFramesAtStart, trimFramesAtEnd, parameterEvents?.Length ?? 0,
parameterEvents,
null,
out actualStartTime);
fixed (AudioStreamPacketDescription* descPtr = desc)
fixed (AudioQueueParameterEvent* parameterEventsPtr = parameterEvents) {
actualStartTime = default;
return AudioQueueEnqueueBufferWithParameters (
handle, audioQueueBuffer, desc?.Length ?? 0, descPtr,
trimFramesAtStart, trimFramesAtEnd, parameterEvents?.Length ?? 0,
parameterEventsPtr,
null,
AsPointer<AudioTimeStamp> (ref actualStartTime));
}
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueueCreateTimeline (IntPtr AQ, out IntPtr timeline);
unsafe extern static AudioQueueStatus AudioQueueCreateTimeline (IntPtr AQ, IntPtr* timeline);

public AudioQueueTimeline? CreateTimeline ()
{
IntPtr thandle;

if (AudioQueueCreateTimeline (handle, out thandle) == AudioQueueStatus.Ok)
return new AudioQueueTimeline (handle, thandle);
unsafe {
if (AudioQueueCreateTimeline (handle, &thandle) == AudioQueueStatus.Ok)
return new AudioQueueTimeline (handle, thandle);
}
return null;
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueueGetCurrentTime (IntPtr AQ, IntPtr timelineHandle, ref AudioTimeStamp time, [MarshalAs (UnmanagedType.I1)] ref bool discontinuty);
unsafe extern static AudioQueueStatus AudioQueueGetCurrentTime (IntPtr AQ, IntPtr timelineHandle, AudioTimeStamp* time, byte* discontinuty);

public AudioQueueStatus GetCurrentTime (AudioQueueTimeline timeline, ref AudioTimeStamp time, ref bool timelineDiscontinuty)
public AudioQueueStatus GetCurrentTime (AudioQueueTimeline? timeline, ref AudioTimeStamp time, ref bool timelineDiscontinuty)
{
IntPtr arg;
if (timeline is null)
@@ -696,61 +720,74 @@ public AudioQueueStatus GetCurrentTime (AudioQueueTimeline timeline, ref AudioTi
throw new ObjectDisposedException ("timeline");
}

return AudioQueueGetCurrentTime (handle, arg, ref time, ref timelineDiscontinuty);
byte timelineDiscontinuityPtr;
AudioQueueStatus rv;
unsafe {
rv = AudioQueueGetCurrentTime (handle, arg, AsPointer<AudioTimeStamp> (ref time), &timelineDiscontinuityPtr);
}
timelineDiscontinuty = timelineDiscontinuityPtr != 0;
return rv;
}


[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueueDeviceGetCurrentTime (IntPtr AQ, ref AudioTimeStamp time);
unsafe extern static AudioQueueStatus AudioQueueDeviceGetCurrentTime (IntPtr AQ, AudioTimeStamp* time);

public AudioTimeStamp CurrentTime {
get {
AudioTimeStamp stamp = new AudioTimeStamp ();

if (AudioQueueDeviceGetCurrentTime (handle, ref stamp) != AudioQueueStatus.Ok) {
// Set no values as valid
stamp.Flags = 0;
unsafe {
if (AudioQueueDeviceGetCurrentTime (handle, &stamp) != AudioQueueStatus.Ok) {
// Set no values as valid
stamp.Flags = 0;
}
}

return stamp;
}
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueueDeviceGetNearestStartTime (IntPtr AQ, ref AudioTimeStamp data, int flags);
unsafe extern static AudioQueueStatus AudioQueueDeviceGetNearestStartTime (IntPtr AQ, AudioTimeStamp* data, int flags);

public AudioTimeStamp GetNearestStartTime (AudioTimeStamp requestedStartTime)
{
var k = AudioQueueDeviceGetNearestStartTime (handle, ref requestedStartTime, 0);
if (k != 0)
throw new AudioQueueException (k);
unsafe {
var k = AudioQueueDeviceGetNearestStartTime (handle, &requestedStartTime, 0);
if (k != 0)
throw new AudioQueueException (k);
}

return requestedStartTime;
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueueDeviceTranslateTime (IntPtr AQ, ref AudioTimeStamp inTime, out AudioTimeStamp translatedTime);
unsafe extern static AudioQueueStatus AudioQueueDeviceTranslateTime (IntPtr AQ, AudioTimeStamp* inTime, AudioTimeStamp* translatedTime);

public AudioTimeStamp TranslateTime (AudioTimeStamp timeToTranslate)
{
AudioTimeStamp ret;

AudioQueueDeviceTranslateTime (handle, ref timeToTranslate, out ret);
unsafe {
AudioQueueDeviceTranslateTime (handle, &timeToTranslate, &ret);
}
return ret;
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static OSStatus AudioQueueGetParameter (IntPtr AQ, AudioQueueParameter parameterId, out float result);
unsafe extern static OSStatus AudioQueueGetParameter (IntPtr AQ, AudioQueueParameter parameterId, float* result);

[DllImport (Constants.AudioToolboxLibrary)]
extern static OSStatus AudioQueueSetParameter (IntPtr AQ, AudioQueueParameter parameterId, float value);

public float Volume {
get {
float r;
var res = AudioQueueGetParameter (handle, AudioQueueParameter.Volume, out r);
if (res != 0)
throw new AudioQueueException (res);
unsafe {
var res = AudioQueueGetParameter (handle, AudioQueueParameter.Volume, &r);
if (res != 0)
throw new AudioQueueException (res);
}

return r;
}
@@ -765,9 +802,11 @@ public float Volume {
public float VolumeRampTime {
get {
float r;
var res = AudioQueueGetParameter (handle, AudioQueueParameter.VolumeRampTime, out r);
if (res != 0)
throw new AudioQueueException (res);
unsafe {
var res = AudioQueueGetParameter (handle, AudioQueueParameter.VolumeRampTime, &r);
if (res != 0)
throw new AudioQueueException (res);
}

return r;
}
@@ -782,9 +821,11 @@ public float VolumeRampTime {
public float Pan {
get {
float r;
var res = AudioQueueGetParameter (handle, AudioQueueParameter.Pan, out r);
if (res != 0)
throw new AudioQueueException (res);
unsafe {
var res = AudioQueueGetParameter (handle, AudioQueueParameter.Pan, &r);
if (res != 0)
throw new AudioQueueException (res);
}

return r;
}
@@ -892,10 +933,16 @@ public void RemoveListener (AudioQueueProperty property, AudioQueuePropertyChang
#endif

[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueueGetProperty (IntPtr AQ, uint id, IntPtr outdata, ref int dataSize);
unsafe extern static AudioQueueStatus AudioQueueGetProperty (IntPtr AQ, uint id, IntPtr outdata, int* dataSize);

[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueueGetPropertySize (IntPtr AQ, uint id, out int size);
unsafe extern static AudioQueueStatus AudioQueueGetPropertySize (IntPtr AQ, uint id, int* size);

unsafe static AudioQueueStatus AudioQueueGetPropertySize (IntPtr AQ, uint id, out int size)
{
size = 0;
return AudioQueueGetPropertySize (AQ, id, AsPointer<int> (ref size));
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueueSetProperty (
@@ -906,7 +953,9 @@ public bool GetProperty (AudioQueueProperty property, ref int dataSize, IntPtr o
{
if (outdata == IntPtr.Zero)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (outdata));
return AudioQueueGetProperty (handle, (uint) property, outdata, ref dataSize) == 0;
unsafe {
return AudioQueueGetProperty (handle, (uint) property, outdata, AsPointer<int> (ref dataSize)) == 0;
}
}

// Should be private
@@ -928,7 +977,9 @@ public IntPtr GetProperty (AudioQueueProperty property, out int size)
if (buffer == IntPtr.Zero)
return IntPtr.Zero;

r = AudioQueueGetProperty (handle, (uint) property, buffer, ref size);
unsafe {
r = AudioQueueGetProperty (handle, (uint) property, buffer, AsPointer<int> (ref size));
}
if (r == 0)
return buffer;
Marshal.FreeHGlobal (buffer);
@@ -948,7 +999,7 @@ public unsafe T GetProperty<T> (AudioQueueProperty property) where T : struct
if (buffer == IntPtr.Zero)
return default (T);
try {
r = AudioQueueGetProperty (handle, (uint) property, buffer, ref size);
r = AudioQueueGetProperty (handle, (uint) property, buffer, &size);
if (r == 0) {
T result = Marshal.PtrToStructure<T> (buffer)!;
return result;
@@ -972,7 +1023,7 @@ unsafe T GetProperty<T> (AudioConverterPropertyID property) where T : struct
if (buffer == IntPtr.Zero)
return default (T);
try {
r = AudioQueueGetProperty (handle, (uint) property, buffer, ref size);
r = AudioQueueGetProperty (handle, (uint) property, buffer, &size);
if (r == 0) {
T result = Marshal.PtrToStructure<T> (buffer)!;
return result;
@@ -989,7 +1040,7 @@ int GetInt (AudioQueueProperty property)
unsafe {
int val = 0;
int size = 4;
var k = AudioQueueGetProperty (handle, (uint) property, (IntPtr) (&val), ref size);
var k = AudioQueueGetProperty (handle, (uint) property, (IntPtr) (&val), &size);
if (k == 0)
return val;
throw new AudioQueueException (k);
@@ -1012,7 +1063,7 @@ double GetDouble (AudioQueueProperty property)
unsafe {
double val = 0;
int size = 8;
var k = AudioQueueGetProperty (handle, (uint) property, (IntPtr) (&val), ref size);
var k = AudioQueueGetProperty (handle, (uint) property, (IntPtr) (&val), &size);
if (k == 0)
return val;
throw new AudioQueueException (k);
@@ -1263,6 +1314,11 @@ extern static AudioQueueStatus AudioQueueProcessingTapNew (IntPtr inAQ, AudioQue
aqpt.ProcessingFormat = processingFormat;
return aqpt;
}

internal unsafe static T* AsPointer<T> (ref T value) where T : unmanaged
{
return (T*) Unsafe.AsPointer<T> (ref value);
}
}

#if !NET
@@ -1332,8 +1388,8 @@ protected virtual void Dispose (bool disposing)
extern static OSStatus AudioQueueProcessingTapDispose (IntPtr inAQTap);

[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueueProcessingTapGetSourceAudio (IntPtr inAQTap, uint inNumberFrames, ref AudioTimeStamp ioTimeStamp,
out AudioQueueProcessingTapFlags outFlags, out uint outNumberFrames,
unsafe extern static AudioQueueStatus AudioQueueProcessingTapGetSourceAudio (IntPtr inAQTap, uint inNumberFrames, AudioTimeStamp* ioTimeStamp,
AudioQueueProcessingTapFlags* outFlags, uint* outNumberFrames,
IntPtr ioData);

public AudioQueueStatus GetSourceAudio (uint numberOfFrames, ref AudioTimeStamp timeStamp,
@@ -1342,16 +1398,27 @@ public AudioQueueStatus GetSourceAudio (uint numberOfFrames, ref AudioTimeStamp
if (data is null)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (data));

return AudioQueueProcessingTapGetSourceAudio (TapHandle, numberOfFrames, ref timeStamp,
out flags, out parentNumberOfFrames, (IntPtr) data);
parentNumberOfFrames = 0;
flags = default (AudioQueueProcessingTapFlags);
unsafe {
return AudioQueueProcessingTapGetSourceAudio (TapHandle, numberOfFrames,
AudioQueue.AsPointer<AudioTimeStamp> (ref timeStamp),
AudioQueue.AsPointer<AudioQueueProcessingTapFlags> (ref flags),
AudioQueue.AsPointer<uint> (ref parentNumberOfFrames),
(IntPtr) data);
}
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueueProcessingTapGetQueueTime (IntPtr inAQTap, out double outQueueSampleTime, out uint outQueueFrameCount);
unsafe extern static AudioQueueStatus AudioQueueProcessingTapGetQueueTime (IntPtr inAQTap, double* outQueueSampleTime, uint* outQueueFrameCount);

public AudioQueueStatus GetQueueTime (out double sampleTime, out uint frameCount)
{
return AudioQueueProcessingTapGetQueueTime (TapHandle, out sampleTime, out frameCount);
sampleTime = 0;
frameCount = 0;
unsafe {
return AudioQueueProcessingTapGetQueueTime (TapHandle, AudioQueue.AsPointer<double> (ref sampleTime), AudioQueue.AsPointer<uint> (ref frameCount));
}
}

#if NET
@@ -1399,9 +1466,9 @@ extern unsafe static OSStatus AudioQueueNewOutput (AudioStreamBasicDescription*
static readonly AudioQueueOutputCallback dOutputCallback = output_callback;

[DllImport (Constants.AudioToolboxLibrary)]
extern static OSStatus AudioQueueNewOutput (ref AudioStreamBasicDescription format, AudioQueueOutputCallback callback,
unsafe extern static OSStatus AudioQueueNewOutput (AudioStreamBasicDescription* format, AudioQueueOutputCallback callback,
IntPtr userData, IntPtr cfrunLoop_callbackRunloop, IntPtr cfstr_runMode,
uint flags, out IntPtr audioQueue);
uint flags, IntPtr* audioQueue);
#endif

#if NET
@@ -1439,18 +1506,18 @@ public OutputAudioQueue (AudioStreamBasicDescription desc, CFRunLoop? runLoop, C
IntPtr h;
GCHandle gch = GCHandle.Alloc (this);

#if NET
OSStatus code = 0;
unsafe {
code = AudioQueueNewOutput (&desc, &output_callback,
GCHandle.ToIntPtr (gch), runLoop.GetHandle (),
runMode.GetHandle (), 0, &h);
}
code = AudioQueueNewOutput (&desc,
#if NET
&output_callback,
#else
var code = AudioQueueNewOutput (ref desc, dOutputCallback, GCHandle.ToIntPtr (gch),
runLoop.GetHandle (),
runMode.GetHandle (), 0, out h);
dOutputCallback,
#endif
GCHandle.ToIntPtr (gch),
runLoop.GetHandle (),
runMode.GetHandle (), 0, &h);
}

if (code != 0) {
gch.Free ();
@@ -1465,14 +1532,16 @@ public OutputAudioQueue (AudioStreamBasicDescription desc, CFRunLoop? runLoop, C
extern static AudioQueueStatus AudioQueueSetOfflineRenderFormat2 (IntPtr aq, IntPtr format, IntPtr layout);

[DllImport (Constants.AudioToolboxLibrary)]
extern static AudioQueueStatus AudioQueueSetOfflineRenderFormat (IntPtr aq, ref AudioStreamBasicDescription format, IntPtr layout);
unsafe extern static AudioQueueStatus AudioQueueSetOfflineRenderFormat (IntPtr aq, AudioStreamBasicDescription* format, IntPtr layout);

public AudioQueueStatus SetOfflineRenderFormat (AudioStreamBasicDescription desc, AudioChannelLayout layout)
{
int size;
var h = layout is null ? IntPtr.Zero : layout.ToBlock (out size);
try {
return AudioQueueSetOfflineRenderFormat (handle, ref desc, h);
unsafe {
return AudioQueueSetOfflineRenderFormat (handle, &desc, h);
}
} finally {
Marshal.FreeHGlobal (h);
}
@@ -1484,7 +1553,7 @@ public AudioQueueStatus DisableOfflineRender ()
}

[DllImport (Constants.AudioToolboxLibrary)]
extern unsafe static AudioQueueStatus AudioQueueOfflineRender (IntPtr aq, ref AudioTimeStamp stamp, AudioQueueBuffer* buffer, int frames);
extern unsafe static AudioQueueStatus AudioQueueOfflineRender (IntPtr aq, AudioTimeStamp* stamp, AudioQueueBuffer* buffer, int frames);

public unsafe AudioQueueStatus RenderOffline (double timeStamp, AudioQueueBuffer* audioQueueBuffer, int frameCount)
{
@@ -1495,7 +1564,7 @@ public unsafe AudioQueueStatus RenderOffline (double timeStamp, AudioQueueBuffer
SampleTime = timeStamp,
Flags = AudioTimeStamp.AtsFlags.SampleTimeValid
};
return AudioQueueOfflineRender (handle, ref stamp, audioQueueBuffer, frameCount);
return AudioQueueOfflineRender (handle, &stamp, audioQueueBuffer, frameCount);
}
}

20 changes: 0 additions & 20 deletions tests/cecil-tests/BlittablePInvokes.KnownFailures.cs
Original file line number Diff line number Diff line change
@@ -42,24 +42,6 @@ public partial class BlittablePInvokes {
"AudioToolbox.AudioFormatError AudioToolbox.AudioFormatPropertyNative::AudioFormatGetPropertyInfo(AudioToolbox.AudioFormatProperty,System.Int32,AudioToolbox.AudioStreamBasicDescription&,System.UInt32&)",
"AudioToolbox.AudioFormatError AudioToolbox.AudioFormatPropertyNative::AudioFormatGetPropertyInfo(AudioToolbox.AudioFormatProperty,System.Int32,System.Int32&,System.Int32&)",
"AudioToolbox.AudioFormatError AudioToolbox.AudioFormatPropertyNative::AudioFormatGetPropertyInfo(AudioToolbox.AudioFormatProperty,System.Int32,System.IntPtr,System.Int32&)",
"AudioToolbox.AudioQueueStatus AudioToolbox.AudioQueue::AudioQueueAllocateBuffer(System.IntPtr,System.Int32,System.IntPtr&)",
"AudioToolbox.AudioQueueStatus AudioToolbox.AudioQueue::AudioQueueAllocateBufferWithPacketDescriptions(System.IntPtr,System.Int32,System.Int32,System.IntPtr&)",
"AudioToolbox.AudioQueueStatus AudioToolbox.AudioQueue::AudioQueueCreateTimeline(System.IntPtr,System.IntPtr&)",
"AudioToolbox.AudioQueueStatus AudioToolbox.AudioQueue::AudioQueueDeviceGetCurrentTime(System.IntPtr,AudioToolbox.AudioTimeStamp&)",
"AudioToolbox.AudioQueueStatus AudioToolbox.AudioQueue::AudioQueueDeviceGetNearestStartTime(System.IntPtr,AudioToolbox.AudioTimeStamp&,System.Int32)",
"AudioToolbox.AudioQueueStatus AudioToolbox.AudioQueue::AudioQueueDeviceTranslateTime(System.IntPtr,AudioToolbox.AudioTimeStamp&,AudioToolbox.AudioTimeStamp&)",
"AudioToolbox.AudioQueueStatus AudioToolbox.AudioQueue::AudioQueueEnqueueBufferWithParameters(System.IntPtr,AudioToolbox.AudioQueueBuffer*,System.Int32,AudioToolbox.AudioStreamPacketDescription[],System.Int32,System.Int32,System.Int32,AudioToolbox.AudioQueueParameterEvent[],AudioToolbox.AudioTimeStamp*,AudioToolbox.AudioTimeStamp&)",
"AudioToolbox.AudioQueueStatus AudioToolbox.AudioQueue::AudioQueueEnqueueBufferWithParameters(System.IntPtr,AudioToolbox.AudioQueueBuffer*,System.Int32,AudioToolbox.AudioStreamPacketDescription[],System.Int32,System.Int32,System.Int32,AudioToolbox.AudioQueueParameterEvent[],AudioToolbox.AudioTimeStamp&,AudioToolbox.AudioTimeStamp&)",
"AudioToolbox.AudioQueueStatus AudioToolbox.AudioQueue::AudioQueueGetCurrentTime(System.IntPtr,System.IntPtr,AudioToolbox.AudioTimeStamp&,System.Boolean&)",
"AudioToolbox.AudioQueueStatus AudioToolbox.AudioQueue::AudioQueueGetProperty(System.IntPtr,System.UInt32,System.IntPtr,System.Int32&)",
"AudioToolbox.AudioQueueStatus AudioToolbox.AudioQueue::AudioQueueGetPropertySize(System.IntPtr,System.UInt32,System.Int32&)",
"AudioToolbox.AudioQueueStatus AudioToolbox.AudioQueue::AudioQueuePrime(System.IntPtr,System.Int32,System.Int32&)",
"AudioToolbox.AudioQueueStatus AudioToolbox.AudioQueue::AudioQueueStart(System.IntPtr,AudioToolbox.AudioTimeStamp&)",
"AudioToolbox.AudioQueueStatus AudioToolbox.AudioQueue::AudioQueueStop(System.IntPtr,System.Boolean)",
"AudioToolbox.AudioQueueStatus AudioToolbox.AudioQueueProcessingTap::AudioQueueProcessingTapGetQueueTime(System.IntPtr,System.Double&,System.UInt32&)",
"AudioToolbox.AudioQueueStatus AudioToolbox.AudioQueueProcessingTap::AudioQueueProcessingTapGetSourceAudio(System.IntPtr,System.UInt32,AudioToolbox.AudioTimeStamp&,AudioToolbox.AudioQueueProcessingTapFlags&,System.UInt32&,System.IntPtr)",
"AudioToolbox.AudioQueueStatus AudioToolbox.OutputAudioQueue::AudioQueueOfflineRender(System.IntPtr,AudioToolbox.AudioTimeStamp&,AudioToolbox.AudioQueueBuffer*,System.Int32)",
"AudioToolbox.AudioQueueStatus AudioToolbox.OutputAudioQueue::AudioQueueSetOfflineRenderFormat(System.IntPtr,AudioToolbox.AudioStreamBasicDescription&,System.IntPtr)",
"AudioUnit.AudioComponentDescription ObjCRuntime.Messaging::AudioComponentDescription_objc_msgSend_stret(System.IntPtr,System.IntPtr)",
"AudioUnit.AudioComponentDescription ObjCRuntime.Messaging::AudioComponentDescription_objc_msgSend(System.IntPtr,System.IntPtr)",
"AudioUnit.AudioComponentDescription ObjCRuntime.Messaging::AudioComponentDescription_objc_msgSendSuper_stret(System.IntPtr,System.IntPtr)",
@@ -513,8 +495,6 @@ public partial class BlittablePInvokes {
"System.Int32 AudioToolbox.AudioFile::AudioFileReadBytes(System.IntPtr,System.Boolean,System.Int64,System.Int32&,System.IntPtr)",
"System.Int32 AudioToolbox.AudioFile::AudioFileReadPacketData(System.IntPtr,System.Boolean,System.Int32&,AudioToolbox.AudioStreamPacketDescription*,System.Int64,System.Int32&,System.IntPtr)",
"System.Int32 AudioToolbox.AudioFile::AudioFileWriteBytes(System.IntPtr,System.Boolean,System.Int64,System.Int32&,System.IntPtr)",
"System.Int32 AudioToolbox.AudioQueue::AudioQueueDispose(System.IntPtr,System.Boolean)",
"System.Int32 AudioToolbox.AudioQueue::AudioQueueGetParameter(System.IntPtr,AudioToolbox.AudioQueueParameter,System.Single&)",
"System.Int32 AudioUnit.AudioComponent::AudioComponentCopyConfigurationInfo(System.IntPtr,System.IntPtr&)",
"System.Int32 AudioUnit.AudioComponent::AudioComponentCopyName(System.IntPtr,System.IntPtr&)",
"System.Int32 AudioUnit.AudioComponent::AudioComponentGetDescription(System.IntPtr,AudioUnit.AudioComponentDescription&)",