/// <summary>
            /// Creates an initialized AudioSink object.
            /// </summary>
            /// <param name="result">The MLResult object of the inner platform call(s).</param>
            /// <returns> An initialized AudioSink object.</returns>
            public static AudioSink Create(out MLResult result, BufferNotifyMode mode = BufferNotifyMode.None)
            {
                AudioSink audioSink = null;

#if PLATFORM_LUMIN
                List <MLWebRTC.Sink> sinks = MLWebRTC.Instance.sinks;
                ulong handle = MagicLeapNativeBindings.InvalidHandle;
                // We have a chicken-and-egg problem here. We need the audioSink object in order to create the
                // userContext ptr from it GCHandle, which will later be used in the audio data callback to
                // invoke the delegate on this particular object.
                // So, create the AudioSink obj with an invalid handle for now, and then update it if the
                // native sink creation is successful.
                audioSink = new AudioSink(handle, mode);

                NativeBindings.MLWebRTCAudioSinkParams sinkParams = new NativeBindings.MLWebRTCAudioSinkParams(audioSink);
                MLResult.Code resultCode = NativeBindings.MLWebRTCAudioSinkCreateEx(ref sinkParams, out handle);
                if (!DidNativeCallSucceed(resultCode, "MLWebRTCAudioSinkCreateEx()"))
                {
                    result = MLResult.Create(resultCode);
                    return(null);
                }

                audioSink.Handle = handle;

                if (MagicLeapNativeBindings.MLHandleIsValid(audioSink.Handle))
                {
                    sinks.Add(audioSink);
                }

                result = MLResult.Create(resultCode);
#else
                result = new MLResult();
#endif
                return(audioSink);
            }
 private Task StopAudioStream()
 {
     if (AudioDepacketizer != null)
     {
         AudioDepacketizer.Destroy();
         AudioDepacketizer = null;
     }
     if (AudioDecoder != null)
     {
         AudioDecoder.Destroy();
         AudioDecoder = null;
     }
     if (AudioConverter != null)
     {
         AudioConverter.Destroy();
         AudioConverter = null;
     }
     if (ResetAudioPipe != null)
     {
         ResetAudioPipe.Destroy();
         ResetAudioPipe = null;
     }
     if (AudioEncoder != null)
     {
         AudioEncoder.Destroy();
         AudioEncoder = null;
     }
     if (AudioPacketizer != null)
     {
         AudioPacketizer.Destroy();
         AudioPacketizer = null;
     }
     if (AudioSink != null)
     {
         AudioSink.Destroy();
         AudioSink = null;
     }
     return(Task.CompletedTask);
 }