Skip to content

Commit

Permalink
[.NET/AudioUnit] Use [UnmanagedCallersOnly] instead of [MonoPInvokeCa…
Browse files Browse the repository at this point in the history
…llback] for the ScheduledAudioFileRegionCallback function.

Ref xamarin#10470.
  • Loading branch information
rolfbjarne committed Oct 6, 2021
1 parent 63de01c commit cdebbf2
Showing 1 changed file with 18 additions and 1 deletion.
19 changes: 18 additions & 1 deletion src/AudioUnit/AUScheduledAudioFileRegion.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@ public class AUScheduledAudioFileRegion : IDisposable {
internal struct ScheduledAudioFileRegion
{
public AudioTimeStamp TimeStamp;
#if NET
public unsafe delegate* unmanaged<IntPtr, ref ScheduledAudioFileRegion, AudioUnitStatus, void> CompletionHandler;
#else
public ScheduledAudioFileRegionCompletionHandler CompletionHandler;
#endif
public /* void * */ IntPtr CompletionHandlerUserData;
public IntPtr AudioFile;
public uint LoopCount;
Expand All @@ -51,6 +55,7 @@ public AUScheduledAudioFileRegion (AudioFile audioFile, AUScheduledAudioFileRegi
this.completionHandler = completionHandler;
}

#if !NET
internal delegate void ScheduledAudioFileRegionCompletionHandler (
/* void * */IntPtr userData,
/* ScheduledAudioFileRegion * */ref ScheduledAudioFileRegion fileRegion,
Expand All @@ -60,6 +65,9 @@ internal delegate void ScheduledAudioFileRegionCompletionHandler (

#if !MONOMAC
[MonoPInvokeCallback (typeof (ScheduledAudioFileRegionCompletionHandler))]
#endif
#else
[UnmanagedCallersOnly]
#endif
static void ScheduledAudioFileRegionCallback (IntPtr userData, ref ScheduledAudioFileRegion fileRegion, AudioUnitStatus status)
{
Expand All @@ -85,13 +93,22 @@ internal ScheduledAudioFileRegion GetAudioFileRegion ()
var ret = new ScheduledAudioFileRegion {
TimeStamp = TimeStamp,
CompletionHandlerUserData = ptr,
CompletionHandler = ptr != IntPtr.Zero ? static_ScheduledAudioFileRegionCompletionHandler : null,
AudioFile = AudioFile.Handle,
LoopCount = LoopCount,
StartFrame = StartFrame,
FramesToPlay = FramesToPlay
};

if (ptr != IntPtr.Zero) {
unsafe {
#if NET
ret.CompletionHandler = &ScheduledAudioFileRegionCallback;
#else
ret.CompletionHandler = static_ScheduledAudioFileRegionCompletionHandler;
#endif
}
}

alreadyUsed = true;
return ret;
}
Expand Down

0 comments on commit cdebbf2

Please sign in to comment.