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 MusicSequence.cs have blittable signatures. #19839

Merged
Merged
Show file tree
Hide file tree
Changes from 2 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
120 changes: 80 additions & 40 deletions src/AudioToolbox/MusicSequence.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;

Expand Down Expand Up @@ -62,14 +63,17 @@ internal MusicSequence (NativeHandle handle, bool owns)
#endif

[DllImport (Constants.AudioToolboxLibrary)]
extern static /* OSStatus */ MusicPlayerStatus NewMusicSequence (/* MusicSequence* */ out IntPtr outSequence);
unsafe extern static /* OSStatus */ MusicPlayerStatus NewMusicSequence (/* MusicSequence* */ IntPtr* outSequence);

[DllImport (Constants.AudioToolboxLibrary)]
extern static /* OSStatus */ MusicPlayerStatus DisposeMusicSequence (/* MusicSequence */ IntPtr inSequence);

static IntPtr Create ()
{
NewMusicSequence (out var handle);
IntPtr handle;
unsafe {
NewMusicSequence (&handle);
}
return handle;
}

Expand Down Expand Up @@ -127,12 +131,15 @@ internal static MusicSequence Lookup (IntPtr handle)
extern static /* OSStatus */ MusicPlayerStatus MusicSequenceSetAUGraph (/* MusicSequence */ IntPtr inSequence, /* AUGraph */ IntPtr inGraph);

[DllImport (Constants.AudioToolboxLibrary)]
extern static /* OSStatus */ MusicPlayerStatus MusicSequenceGetAUGraph (/* MusicSequence */ IntPtr inSequence, /* AUGraph* */ out IntPtr outGraph);
unsafe extern static /* OSStatus */ MusicPlayerStatus MusicSequenceGetAUGraph (/* MusicSequence */ IntPtr inSequence, /* AUGraph* */ IntPtr* outGraph);

public AUGraph? AUGraph {
get {
if (MusicSequenceGetAUGraph (Handle, out var h) != MusicPlayerStatus.Success)
return null;
IntPtr h;
unsafe {
if (MusicSequenceGetAUGraph (Handle, &h) != MusicPlayerStatus.Success)
return null;
}

return new AUGraph (h, false);
}
Expand All @@ -148,11 +155,14 @@ public AUGraph? AUGraph {
extern static /* OSStatus */ MusicPlayerStatus MusicSequenceSetSequenceType (/* MusicSequence */ IntPtr inSequence, MusicSequenceType inType);

[DllImport (Constants.AudioToolboxLibrary)]
extern static /* OSStatus */ MusicPlayerStatus MusicSequenceGetSequenceType (/* MusicSequence */ IntPtr inSequence, out MusicSequenceType outType);
unsafe extern static /* OSStatus */ MusicPlayerStatus MusicSequenceGetSequenceType (/* MusicSequence */ IntPtr inSequence, MusicSequenceType* outType);

public MusicSequenceType SequenceType {
get {
MusicSequenceGetSequenceType (Handle, out var type);
MusicSequenceType type;
unsafe {
MusicSequenceGetSequenceType (Handle, &type);
}
return type;
}
set {
Expand Down Expand Up @@ -184,59 +194,74 @@ public short SetSmpteResolution (sbyte fps, byte ticks)
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static /* OSStatus */ MusicPlayerStatus MusicSequenceNewTrack (/* MusicSequence */ IntPtr inSequence, /* MusicTrack* */ out IntPtr outTrack);
unsafe extern static /* OSStatus */ MusicPlayerStatus MusicSequenceNewTrack (/* MusicSequence */ IntPtr inSequence, /* MusicTrack* */ IntPtr* outTrack);

public MusicTrack? CreateTrack ()
{
if (MusicSequenceNewTrack (Handle, out var trackHandle) == MusicPlayerStatus.Success)
return new MusicTrack (this, trackHandle, owns: true);
else
return null;
IntPtr trackHandle;
unsafe {
if (MusicSequenceNewTrack (Handle, &trackHandle) == MusicPlayerStatus.Success)
return new MusicTrack (this, trackHandle, owns: true);
}

return null;
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static /* OSStatus */ MusicPlayerStatus MusicSequenceGetTrackCount (/* MusicSequence */ IntPtr inSequence, /* UInt32* */ out int outNumberOfTracks);
unsafe extern static /* OSStatus */ MusicPlayerStatus MusicSequenceGetTrackCount (/* MusicSequence */ IntPtr inSequence, /* UInt32* */ int* outNumberOfTracks);

// an `uint` but we keep `int` for compatibility (should be enough tracks)
public int TrackCount {
get {
if (MusicSequenceGetTrackCount (Handle, out var count) == MusicPlayerStatus.Success)
return count;
int count;
unsafe {
if (MusicSequenceGetTrackCount (Handle, &count) == MusicPlayerStatus.Success)
return count;
}
return 0;
}
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static /* OSStatus */ MusicPlayerStatus MusicSequenceGetIndTrack (/* MusicSequence */ IntPtr inSequence, /* Uint32 */ int inTrackIndex, /* MusicTrack* */ out IntPtr outTrack);
unsafe extern static /* OSStatus */ MusicPlayerStatus MusicSequenceGetIndTrack (/* MusicSequence */ IntPtr inSequence, /* Uint32 */ int inTrackIndex, /* MusicTrack* */ IntPtr* outTrack);

public MusicTrack? GetTrack (int trackIndex)
{
if (MusicSequenceGetIndTrack (Handle, trackIndex, out var outTrack) == MusicPlayerStatus.Success)
return new MusicTrack (this, outTrack, owns: false);
else
return null;
IntPtr outTrack;
unsafe {
if (MusicSequenceGetIndTrack (Handle, trackIndex, &outTrack) == MusicPlayerStatus.Success)
return new MusicTrack (this, outTrack, owns: false);
}

return null;
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static /* OSStatus */ MusicPlayerStatus MusicSequenceGetTrackIndex (/* MusicSequence */ IntPtr inSequence, /* MusicTrack */ IntPtr inTrack, /* UInt32* */ out int outTrackIndex);
unsafe extern static /* OSStatus */ MusicPlayerStatus MusicSequenceGetTrackIndex (/* MusicSequence */ IntPtr inSequence, /* MusicTrack */ IntPtr inTrack, /* UInt32* */ int* outTrackIndex);

public MusicPlayerStatus GetTrackIndex (MusicTrack track, out int index)
{
if (track is null)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (track));

return MusicSequenceGetTrackIndex (Handle, track.Handle, out index);
index = 0;
unsafe {
return MusicSequenceGetTrackIndex (Handle, track.Handle, (int*) Unsafe.AsPointer<int> (ref index));
}
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static /* OSStatus */ MusicPlayerStatus MusicSequenceGetTempoTrack (/* MusicSequence */ IntPtr sequence, /* MusicTrack */ out IntPtr outTrack);
unsafe extern static /* OSStatus */ MusicPlayerStatus MusicSequenceGetTempoTrack (/* MusicSequence */ IntPtr sequence, /* MusicTrack */ IntPtr* outTrack);

public MusicTrack? GetTempoTrack ()
{
if (MusicSequenceGetTempoTrack (Handle, out var outTrack) == MusicPlayerStatus.Success)
return new MusicTrack (this, outTrack, owns: false);
else
return null;
IntPtr outTrack;
unsafe {
if (MusicSequenceGetTempoTrack (Handle, &outTrack) == MusicPlayerStatus.Success)
return new MusicTrack (this, outTrack, owns: false);
}

return null;
}

#if IOS
Expand All @@ -252,22 +277,28 @@ public MusicPlayerStatus SetMidiEndpoint (MidiEndpoint endpoint)
#endif // IOS

[DllImport (Constants.AudioToolboxLibrary)]
extern static /* OSStatus */ MusicPlayerStatus MusicSequenceGetSecondsForBeats (/* MusicSequence */ IntPtr inSequence, /* MusicTimeStamp */ double inBeats, /* Float64* */ out double outSeconds);
unsafe extern static /* OSStatus */ MusicPlayerStatus MusicSequenceGetSecondsForBeats (/* MusicSequence */ IntPtr inSequence, /* MusicTimeStamp */ double inBeats, /* Float64* */ double* outSeconds);

public double GetSecondsForBeats (double beats)
{
if (MusicSequenceGetSecondsForBeats (Handle, beats, out var sec) == MusicPlayerStatus.Success)
return sec;
double sec;
unsafe {
if (MusicSequenceGetSecondsForBeats (Handle, beats, &sec) == MusicPlayerStatus.Success)
return sec;
}
return 0;
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static /* OSStatus */ MusicPlayerStatus MusicSequenceGetBeatsForSeconds (/* MusicSequence */ IntPtr inSequence, /* Float64 */ double inSeconds, /* MusicTimeStamp* */ out double outBeats);
unsafe extern static /* OSStatus */ MusicPlayerStatus MusicSequenceGetBeatsForSeconds (/* MusicSequence */ IntPtr inSequence, /* Float64 */ double inSeconds, /* MusicTimeStamp* */ double* outBeats);

public double GetBeatsForSeconds (double seconds)
{
if (MusicSequenceGetBeatsForSeconds (Handle, seconds, out var beats) == MusicPlayerStatus.Success)
return beats;
double beats;
unsafe {
if (MusicSequenceGetBeatsForSeconds (Handle, seconds, &beats) == MusicPlayerStatus.Success)
return beats;
}
return 0;
}

Expand Down Expand Up @@ -316,18 +347,24 @@ static void UserCallbackProxy (IntPtr inClientData, IntPtr inSequence, IntPtr in
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static /* OSStatus */ MusicPlayerStatus MusicSequenceBeatsToBarBeatTime (/* MusicSequence */ IntPtr inSequence, /* MusicTimeStamp */ double inBeats, /* UInt32 */ int inSubbeatDivisor, out CABarBeatTime outBarBeatTime);
unsafe extern static /* OSStatus */ MusicPlayerStatus MusicSequenceBeatsToBarBeatTime (/* MusicSequence */ IntPtr inSequence, /* MusicTimeStamp */ double inBeats, /* UInt32 */ int inSubbeatDivisor, CABarBeatTime* outBarBeatTime);

public MusicPlayerStatus BeatsToBarBeatTime (double beats, int subbeatDivisor, out CABarBeatTime barBeatTime)
{
return MusicSequenceBeatsToBarBeatTime (Handle, beats, subbeatDivisor, out barBeatTime);
barBeatTime = default (CABarBeatTime);
unsafe {
return MusicSequenceBeatsToBarBeatTime (Handle, beats, subbeatDivisor, (CABarBeatTime*) Unsafe.AsPointer<CABarBeatTime> (ref barBeatTime));
}
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static /* OSStatus */ MusicPlayerStatus MusicSequenceBarBeatTimeToBeats (/* MusicSequence */ IntPtr inSequence, CABarBeatTime inBarBeatTime, /* MusicTimeStamp*/ out double outBeats);
unsafe extern static /* OSStatus */ MusicPlayerStatus MusicSequenceBarBeatTimeToBeats (/* MusicSequence */ IntPtr inSequence, CABarBeatTime inBarBeatTime, /* MusicTimeStamp*/ double* outBeats);
public MusicPlayerStatus BarBeatTimeToBeats (CABarBeatTime barBeatTime, out double beats)
{
return MusicSequenceBarBeatTimeToBeats (Handle, barBeatTime, out beats);
beats = 0;
unsafe {
return MusicSequenceBarBeatTimeToBeats (Handle, barBeatTime, (double*) Unsafe.AsPointer<double> (ref beats));
}
}

[DllImport (Constants.AudioToolboxLibrary)]
Expand Down Expand Up @@ -374,13 +411,16 @@ public MusicPlayerStatus CreateFile (NSUrl url, MusicSequenceFileTypeID fileType
}

[DllImport (Constants.AudioToolboxLibrary)]
extern static /* OSStatus */ MusicPlayerStatus MusicSequenceFileCreateData (/* MusicSequence */ IntPtr inSequence, MusicSequenceFileTypeID inFileType, MusicSequenceFileFlags inFlags, /* SInt16 */ ushort resolution, /* CFDataRef* */ out IntPtr outData);
unsafe extern static /* OSStatus */ MusicPlayerStatus MusicSequenceFileCreateData (/* MusicSequence */ IntPtr inSequence, MusicSequenceFileTypeID inFileType, MusicSequenceFileFlags inFlags, /* SInt16 */ ushort resolution, /* CFDataRef* */ IntPtr* outData);

// note: resolution should be short instead of ushort
public NSData? CreateData (MusicSequenceFileTypeID fileType, MusicSequenceFileFlags flags = 0, ushort resolution = 0)
{
if (MusicSequenceFileCreateData (Handle, fileType, flags, resolution, out var theData) == MusicPlayerStatus.Success)
return Runtime.GetNSObject<NSData> (theData);
IntPtr theData;
unsafe {
if (MusicSequenceFileCreateData (Handle, fileType, flags, resolution, &theData) == MusicPlayerStatus.Success)
return Runtime.GetNSObject<NSData> (theData);
}
return null;
}
#endif // !COREBUILD
Expand Down
13 changes: 0 additions & 13 deletions tests/cecil-tests/BlittablePInvokes.KnownFailures.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,19 +78,6 @@ public partial class BlittablePInvokes {
"AudioToolbox.AudioQueueStatus AudioToolbox.OutputAudioQueue::AudioQueueSetOfflineRenderFormat(System.IntPtr,AudioToolbox.AudioStreamBasicDescription&,System.IntPtr)",
"AudioToolbox.AudioServicesError AudioToolbox.AudioServices::AudioServicesGetProperty(AudioToolbox.AudioServicesPropertyKey,System.UInt32,System.UInt32&,System.UInt32&,System.UInt32&)",
"AudioToolbox.AudioServicesError AudioToolbox.AudioServices::AudioServicesSetProperty(AudioToolbox.AudioServicesPropertyKey,System.UInt32,System.UInt32&,System.UInt32,System.UInt32&)",
"AudioToolbox.MusicPlayerStatus AudioToolbox.MusicSequence::MusicSequenceBarBeatTimeToBeats(System.IntPtr,AudioToolbox.CABarBeatTime,System.Double&)",
"AudioToolbox.MusicPlayerStatus AudioToolbox.MusicSequence::MusicSequenceBeatsToBarBeatTime(System.IntPtr,System.Double,System.Int32,AudioToolbox.CABarBeatTime&)",
"AudioToolbox.MusicPlayerStatus AudioToolbox.MusicSequence::MusicSequenceFileCreateData(System.IntPtr,AudioToolbox.MusicSequenceFileTypeID,AudioToolbox.MusicSequenceFileFlags,System.UInt16,System.IntPtr&)",
"AudioToolbox.MusicPlayerStatus AudioToolbox.MusicSequence::MusicSequenceGetAUGraph(System.IntPtr,System.IntPtr&)",
"AudioToolbox.MusicPlayerStatus AudioToolbox.MusicSequence::MusicSequenceGetBeatsForSeconds(System.IntPtr,System.Double,System.Double&)",
"AudioToolbox.MusicPlayerStatus AudioToolbox.MusicSequence::MusicSequenceGetIndTrack(System.IntPtr,System.Int32,System.IntPtr&)",
"AudioToolbox.MusicPlayerStatus AudioToolbox.MusicSequence::MusicSequenceGetSecondsForBeats(System.IntPtr,System.Double,System.Double&)",
"AudioToolbox.MusicPlayerStatus AudioToolbox.MusicSequence::MusicSequenceGetSequenceType(System.IntPtr,AudioToolbox.MusicSequenceType&)",
"AudioToolbox.MusicPlayerStatus AudioToolbox.MusicSequence::MusicSequenceGetTempoTrack(System.IntPtr,System.IntPtr&)",
"AudioToolbox.MusicPlayerStatus AudioToolbox.MusicSequence::MusicSequenceGetTrackCount(System.IntPtr,System.Int32&)",
"AudioToolbox.MusicPlayerStatus AudioToolbox.MusicSequence::MusicSequenceGetTrackIndex(System.IntPtr,System.IntPtr,System.Int32&)",
"AudioToolbox.MusicPlayerStatus AudioToolbox.MusicSequence::MusicSequenceNewTrack(System.IntPtr,System.IntPtr&)",
"AudioToolbox.MusicPlayerStatus AudioToolbox.MusicSequence::NewMusicSequence(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)",
Expand Down
Loading