Example #1
0
        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);
        }
Example #2
0
        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);