public override Status Disconnect(NativeWindowApi api) { IProducerListener producerListener = null; Status status = Status.BadValue; lock (Core.Lock) { Core.WaitWhileAllocatingLocked(); if (Core.IsAbandoned) { return(Status.Success); } switch (api) { case NativeWindowApi.NVN: case NativeWindowApi.CPU: case NativeWindowApi.Media: case NativeWindowApi.Camera: if (Core.ConnectedApi == api) { Core.Queue.Clear(); Core.FreeAllBuffersLocked(); Core.SignalDequeueEvent(); producerListener = Core.ProducerListener; Core.ProducerListener = null; Core.ConnectedApi = NativeWindowApi.NoApi; Core.SignalWaitBufferFreeEvent(); Core.SignalFrameAvailableEvent(); status = Status.Success; } break; } } producerListener?.OnBufferReleased(); return(status); }
public override Status Connect(IProducerListener listener, NativeWindowApi api, bool producerControlledByApp, out QueueBufferOutput output) { output = new QueueBufferOutput(); lock (Core.Lock) { if (Core.IsAbandoned || Core.ConsumerListener == null) { return(Status.NoInit); } if (Core.ConnectedApi != NativeWindowApi.NoApi) { return(Status.BadValue); } Core.BufferHasBeenQueued = false; Core.DequeueBufferCannotBlock = Core.ConsumerControlledByApp && producerControlledByApp; switch (api) { case NativeWindowApi.NVN: case NativeWindowApi.CPU: case NativeWindowApi.Media: case NativeWindowApi.Camera: Core.ProducerListener = listener; Core.ConnectedApi = api; output.Width = (uint)Core.DefaultWidth; output.Height = (uint)Core.DefaultHeight; output.TransformHint = Core.TransformHint; output.NumPendingBuffers = (uint)Core.Queue.Count; if (NxSettings.Settings.TryGetValue("nv!nvn_no_vsync_capability", out object noVSyncCapability) && (bool)noVSyncCapability) { output.TransformHint |= NativeWindowTransform.NoVSyncCapability; } return(Status.Success); default: return(Status.BadValue); } } }
public abstract Status Disconnect(NativeWindowApi api);
public abstract Status Connect(IProducerListener listener, NativeWindowApi api, bool producerControlledByApp, out QueueBufferOutput output);