public Status ReleaseBuffer(int slot, ulong frameNumber, ref AndroidFence fence) { if (slot < 0 || slot >= Core.Slots.Length) { return(Status.BadValue); } IProducerListener listener = null; lock (Core.Lock) { if (Core.Slots[slot].FrameNumber != frameNumber) { return(Status.StaleBufferSlot); } foreach (BufferItem item in Core.Queue) { if (item.Slot == slot) { return(Status.BadValue); } } if (Core.Slots[slot].BufferState == BufferState.Acquired) { Core.Slots[slot].BufferState = BufferState.Free; Core.Slots[slot].Fence = fence; listener = Core.ProducerListener; } else if (Core.Slots[slot].NeedsCleanupOnRelease) { Core.Slots[slot].NeedsCleanupOnRelease = false; return(Status.StaleBufferSlot); } else { return(Status.BadValue); } Core.Slots[slot].GraphicBuffer.Object.DecrementNvMapHandleRefCount(Core.Owner); Core.CheckSystemEventsLocked(Core.GetMaxBufferCountLocked(true)); Core.SignalDequeueEvent(); } listener?.onBufferReleased(); return(Status.Success); }
public override Status Disconnect(NativeWindowApi api) { IProducerListener producerListener = null; Status status = Status.BadValue; lock (Core.Lock) { 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.FreeAllBuffersLocked(); producerListener = Core.ProducerListener; Core.ProducerListener = null; Core.ConnectedApi = NativeWindowApi.NoApi; Core.SignalDequeueEvent(); status = Status.Success; } break; } } producerListener?.onBufferReleased(); return(status); }