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

[.NET/AudioSession] Use [UnmanagedCallersOnly] instead of [MonoPInvokeCallback] for the managed callbacks called from native code. #13567

Merged
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
33 changes: 33 additions & 0 deletions src/AudioToolbox/AudioSession.cs
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,11 @@ public static class AudioSession {
static NSString OutputDestinationKey_Description;

[DllImport (Constants.AudioToolboxLibrary)]
#if NET
unsafe extern static OSStatus AudioSessionInitialize(IntPtr cfRunLoop, IntPtr cfstr_runMode, delegate* unmanaged<IntPtr, uint, void> listener, IntPtr userData);
#else
extern static OSStatus AudioSessionInitialize(IntPtr cfRunLoop, IntPtr cfstr_runMode, InterruptionListener listener, IntPtr userData);
#endif

public static void Initialize ()
{
Expand All @@ -265,7 +269,14 @@ public static void Initialize ()
public static void Initialize (CFRunLoop runLoop, string runMode)
{
CFString s = runMode == null ? null : new CFString (runMode);
#if NET
int k;
unsafe {
k = AudioSessionInitialize (runLoop.GetHandle (), s.GetHandle (), &Interruption, IntPtr.Zero);
}
#else
int k = AudioSessionInitialize (runLoop == null ? IntPtr.Zero : runLoop.Handle, s == null ? IntPtr.Zero : s.Handle, Interruption, IntPtr.Zero);
#endif
if (k != 0 && k != (int)AudioSessionErrors.AlreadyInitialized)
throw new AudioSessionException (k);

Expand Down Expand Up @@ -303,9 +314,15 @@ public static void Initialize (CFRunLoop runLoop, string runMode)
initialized = true;
}

#if !NET
delegate void InterruptionListener (IntPtr userData, uint state);
#endif

#if NET
[UnmanagedCallersOnly]
#else
[MonoPInvokeCallback (typeof (InterruptionListener))]
#endif
static void Interruption (IntPtr userData, uint state)
{
EventHandler h;
Expand Down Expand Up @@ -731,10 +748,16 @@ static public float InputGainScalar {
}
}

#if !NET
delegate void _PropertyListener (IntPtr userData, AudioSessionProperty prop, int size, IntPtr data);
#endif
public delegate void PropertyListener (AudioSessionProperty prop, int size, IntPtr data);

#if NET
[UnmanagedCallersOnly]
#else
[MonoPInvokeCallback (typeof (_PropertyListener))]
#endif
static void Listener (IntPtr userData, AudioSessionProperty prop, int size, IntPtr data)
{
ArrayList a = (ArrayList) listeners [prop];
Expand All @@ -749,7 +772,11 @@ static void Listener (IntPtr userData, AudioSessionProperty prop, int size, IntP
}

[DllImport (Constants.AudioToolboxLibrary)]
#if NET
unsafe extern static AudioSessionErrors AudioSessionAddPropertyListener(AudioSessionProperty id, delegate* unmanaged<IntPtr, AudioSessionProperty, int, IntPtr, void> inProc, IntPtr userData);
#else
extern static AudioSessionErrors AudioSessionAddPropertyListener(AudioSessionProperty id, _PropertyListener inProc, IntPtr userData);
#endif

static Hashtable listeners;

Expand All @@ -768,7 +795,13 @@ public static AudioSessionErrors AddListener (AudioSessionProperty property, Pro
a.Add (listener);

if (a.Count == 1) {
#if NET
unsafe {
return AudioSessionAddPropertyListener (property, &Listener, IntPtr.Zero);
}
#else
return AudioSessionAddPropertyListener (property, Listener, IntPtr.Zero);
#endif
}

return AudioSessionErrors.None;
Expand Down