Skip to content
Merged
Show file tree
Hide file tree
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
60 changes: 42 additions & 18 deletions src/AudioToolbox/AudioFileStream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
using System;
using System.IO;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

using ObjCRuntime;
Expand Down Expand Up @@ -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<long> (ref dataByteOffset), &v);
}
if (LastError != AudioFileStreamStatus.Ok) {
isEstimate = false;
} else {
Expand All @@ -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<int> (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<int> (ref dataSize), outPropertyData) == 0;
}
}

public IntPtr GetProperty (AudioFileStreamProperty property, out int size)
Expand All @@ -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<int> (ref size), buffer);
}
if (LastError == 0)
return buffer;
Marshal.FreeHGlobal (buffer);
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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<T> (buffer)!;
}
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down
3 changes: 0 additions & 3 deletions tests/cecil-tests/BlittablePInvokes.KnownFailures.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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*)",
Expand Down