diff --git a/src/AudioToolbox/AudioFileStream.cs b/src/AudioToolbox/AudioFileStream.cs index 127d781fe891..5e3bd5ce72a2 100644 --- a/src/AudioToolbox/AudioFileStream.cs +++ b/src/AudioToolbox/AudioFileStream.cs @@ -32,6 +32,7 @@ using System; using System.IO; using System.Collections.Generic; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using ObjCRuntime; @@ -319,15 +320,18 @@ public AudioFileStreamStatus ParseBytes (byte [] bytes, int offset, int count, b } [DllImport (Constants.AudioToolboxLibrary)] - extern static AudioFileStreamStatus AudioFileStreamSeek (AudioFileStreamID inAudioFileStream, + unsafe extern static AudioFileStreamStatus AudioFileStreamSeek (AudioFileStreamID inAudioFileStream, long inPacketOffset, - out long outDataByteOffset, - ref int ioFlags); + long* outDataByteOffset, + int* ioFlags); public AudioFileStreamStatus Seek (long packetOffset, out long dataByteOffset, out bool isEstimate) { int v = 0; - LastError = AudioFileStreamSeek (handle, packetOffset, out dataByteOffset, ref v); + dataByteOffset = 0; + unsafe { + LastError = AudioFileStreamSeek (handle, packetOffset, (long*) Unsafe.AsPointer (ref dataByteOffset), &v); + } if (LastError != AudioFileStreamStatus.Ok) { isEstimate = false; } else { @@ -338,24 +342,42 @@ public AudioFileStreamStatus Seek (long packetOffset, out long dataByteOffset, o } [DllImport (Constants.AudioToolboxLibrary)] - extern static AudioFileStreamStatus AudioFileStreamGetPropertyInfo ( + unsafe extern static AudioFileStreamStatus AudioFileStreamGetPropertyInfo ( + AudioFileStreamID inAudioFileStream, + AudioFileStreamProperty inPropertyID, + int* outPropertyDataSize, + byte* isWritable); + + static AudioFileStreamStatus AudioFileStreamGetPropertyInfo ( AudioFileStreamID inAudioFileStream, AudioFileStreamProperty inPropertyID, out int outPropertyDataSize, - [MarshalAs (UnmanagedType.I1)] out bool isWritable); + out bool isWritable) + { + byte writable; + AudioFileStreamStatus rv; + outPropertyDataSize = 0; + unsafe { + rv = AudioFileStreamGetPropertyInfo (inAudioFileStream, inPropertyID, (int*) Unsafe.AsPointer (ref outPropertyDataSize), &writable); + } + isWritable = writable != 0; + return rv; + } [DllImport (Constants.AudioToolboxLibrary)] - extern static AudioFileStreamStatus AudioFileStreamGetProperty ( + unsafe extern static AudioFileStreamStatus AudioFileStreamGetProperty ( AudioFileStreamID inAudioFileStream, AudioFileStreamProperty inPropertyID, - ref int ioPropertyDataSize, + int* ioPropertyDataSize, IntPtr outPropertyData); public bool GetProperty (AudioFileStreamProperty property, ref int dataSize, IntPtr outPropertyData) { if (outPropertyData == IntPtr.Zero) ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (outPropertyData)); - return AudioFileStreamGetProperty (handle, property, ref dataSize, outPropertyData) == 0; + unsafe { + return AudioFileStreamGetProperty (handle, property, (int*) Unsafe.AsPointer (ref dataSize), outPropertyData) == 0; + } } public IntPtr GetProperty (AudioFileStreamProperty property, out int size) @@ -370,7 +392,9 @@ public IntPtr GetProperty (AudioFileStreamProperty property, out int size) if (buffer == IntPtr.Zero) return IntPtr.Zero; - LastError = AudioFileStreamGetProperty (handle, property, ref size, buffer); + unsafe { + LastError = AudioFileStreamGetProperty (handle, property, (int*) Unsafe.AsPointer (ref size), buffer); + } if (LastError == 0) return buffer; Marshal.FreeHGlobal (buffer); @@ -382,7 +406,7 @@ int GetInt (AudioFileStreamProperty property) unsafe { int val = 0; int size = 4; - LastError = AudioFileStreamGetProperty (handle, property, ref size, (IntPtr) (&val)); + LastError = AudioFileStreamGetProperty (handle, property, &size, (IntPtr) (&val)); if (LastError == 0) return val; return 0; @@ -394,7 +418,7 @@ double GetDouble (AudioFileStreamProperty property) unsafe { double val = 0; int size = 8; - LastError = AudioFileStreamGetProperty (handle, property, ref size, (IntPtr) (&val)); + LastError = AudioFileStreamGetProperty (handle, property, &size, (IntPtr) (&val)); if (LastError == 0) return val; return 0; @@ -406,7 +430,7 @@ long GetLong (AudioFileStreamProperty property) unsafe { long val = 0; int size = 8; - LastError = AudioFileStreamGetProperty (handle, property, ref size, (IntPtr) (&val)); + LastError = AudioFileStreamGetProperty (handle, property, &size, (IntPtr) (&val)); if (LastError == 0) return val; return 0; @@ -425,7 +449,7 @@ long GetLong (AudioFileStreamProperty property) if (buffer == IntPtr.Zero) return null; try { - LastError = AudioFileStreamGetProperty (handle, property, ref size, buffer); + LastError = AudioFileStreamGetProperty (handle, property, &size, buffer); if (LastError == 0) { return Marshal.PtrToStructure (buffer)!; } @@ -566,7 +590,7 @@ public long PacketToFrame (long packet) unsafe { AudioFramePacketTranslation* p = &buffer; int size = sizeof (AudioFramePacketTranslation); - LastError = AudioFileStreamGetProperty (handle, AudioFileStreamProperty.PacketToFrame, ref size, (IntPtr) p); + LastError = AudioFileStreamGetProperty (handle, AudioFileStreamProperty.PacketToFrame, &size, (IntPtr) p); if (LastError == 0) return buffer.Frame; return -1; @@ -581,7 +605,7 @@ public long FrameToPacket (long frame, out int frameOffsetInPacket) unsafe { AudioFramePacketTranslation* p = &buffer; int size = sizeof (AudioFramePacketTranslation); - LastError = AudioFileStreamGetProperty (handle, AudioFileStreamProperty.FrameToPacket, ref size, (IntPtr) p); + LastError = AudioFileStreamGetProperty (handle, AudioFileStreamProperty.FrameToPacket, &size, (IntPtr) p); if (LastError == 0) { frameOffsetInPacket = buffer.FrameOffsetInPacket; return buffer.Packet; @@ -599,7 +623,7 @@ public long PacketToByte (long packet, out bool isEstimate) unsafe { AudioBytePacketTranslation* p = &buffer; int size = sizeof (AudioBytePacketTranslation); - LastError = AudioFileStreamGetProperty (handle, AudioFileStreamProperty.PacketToByte, ref size, (IntPtr) p); + LastError = AudioFileStreamGetProperty (handle, AudioFileStreamProperty.PacketToByte, &size, (IntPtr) p); if (LastError == 0) { isEstimate = (buffer.Flags & BytePacketTranslationFlags.IsEstimate) != 0; return buffer.Byte; @@ -617,7 +641,7 @@ public long ByteToPacket (long byteval, out int byteOffsetInPacket, out bool isE unsafe { AudioBytePacketTranslation* p = &buffer; int size = sizeof (AudioBytePacketTranslation); - LastError = AudioFileStreamGetProperty (handle, AudioFileStreamProperty.ByteToPacket, ref size, (IntPtr) p); + LastError = AudioFileStreamGetProperty (handle, AudioFileStreamProperty.ByteToPacket, &size, (IntPtr) p); if (LastError == 0) { isEstimate = (buffer.Flags & BytePacketTranslationFlags.IsEstimate) != 0; byteOffsetInPacket = buffer.ByteOffsetInPacket; diff --git a/tests/cecil-tests/BlittablePInvokes.KnownFailures.cs b/tests/cecil-tests/BlittablePInvokes.KnownFailures.cs index 89b5572cd0ff..afe24b0bf362 100644 --- a/tests/cecil-tests/BlittablePInvokes.KnownFailures.cs +++ b/tests/cecil-tests/BlittablePInvokes.KnownFailures.cs @@ -33,9 +33,6 @@ public partial class BlittablePInvokes { "AudioToolbox.AudioFileError AudioToolbox.AudioFile::AudioFileOpenURL(System.IntPtr,System.Byte,AudioToolbox.AudioFileType,System.IntPtr&)", "AudioToolbox.AudioFileError AudioToolbox.AudioFile::AudioFileSetProperty(System.IntPtr,AudioToolbox.AudioFileProperty,System.Int32,AudioToolbox.AudioFilePacketTableInfo&)", "AudioToolbox.AudioFileError AudioToolbox.AudioFile::AudioFileWritePackets(System.IntPtr,System.Boolean,System.Int32,AudioToolbox.AudioStreamPacketDescription[],System.Int64,System.Int32&,System.IntPtr)", - "AudioToolbox.AudioFileStreamStatus AudioToolbox.AudioFileStream::AudioFileStreamGetProperty(System.IntPtr,AudioToolbox.AudioFileStreamProperty,System.Int32&,System.IntPtr)", - "AudioToolbox.AudioFileStreamStatus AudioToolbox.AudioFileStream::AudioFileStreamGetPropertyInfo(System.IntPtr,AudioToolbox.AudioFileStreamProperty,System.Int32&,System.Boolean&)", - "AudioToolbox.AudioFileStreamStatus AudioToolbox.AudioFileStream::AudioFileStreamSeek(System.IntPtr,System.Int64,System.Int64&,System.Int32&)", "AudioToolbox.AudioFormatError AudioToolbox.AudioFormatPropertyNative::AudioFormatGetProperty(AudioToolbox.AudioFormatProperty,System.Int32,AudioToolbox.AudioClassDescription*,System.Int32&,System.UInt32&)", "AudioToolbox.AudioFormatError AudioToolbox.AudioFormatPropertyNative::AudioFormatGetProperty(AudioToolbox.AudioFormatProperty,System.Int32,AudioToolbox.AudioFormat*,System.Int32&,System.UInt32&)", "AudioToolbox.AudioFormatError AudioToolbox.AudioFormatPropertyNative::AudioFormatGetProperty(AudioToolbox.AudioFormatProperty,System.Int32,AudioToolbox.AudioFormatInfo&,System.UInt32&,AudioToolbox.AudioFormat*)",