15d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall/*
25d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * Copyright (C) 2014 The Android Open Source Project
35d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall *
45d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * Licensed under the Apache License, Version 2.0 (the "License");
55d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * you may not use this file except in compliance with the License.
65d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * You may obtain a copy of the License at
75d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall *
85d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall *      http://www.apache.org/licenses/LICENSE-2.0
95d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall *
105d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * Unless required by applicable law or agreed to in writing, software
115d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * distributed under the License is distributed on an "AS IS" BASIS,
125d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * See the License for the specific language governing permissions and
145d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * limitations under the License.
155d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall */
165d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall
17de15a5ad14da2e9069642e6f616b66b4ae660e01Puneet Lallpackage com.android.camera.async;
185d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall
195d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lallimport java.util.concurrent.TimeUnit;
205d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lallimport java.util.concurrent.TimeoutException;
215d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall
225d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall/**
235d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * An input stream of objects which can be closed from either the producer or
245d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * the consumer.
255d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall */
265d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lallpublic interface BufferQueue<T> extends SafeCloseable {
275d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall    @Override
285d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall    public void close();
295d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall
305d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall    /**
315d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     * Blocks, returning the next available value.
325d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     *
335d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     * @return The next available value.
345d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     * @throws InterruptedException If interrupted while waiting for the next
355d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     *             value.
36de15a5ad14da2e9069642e6f616b66b4ae660e01Puneet Lall     * @throws com.android.camera.async.BufferQueue.BufferQueueClosedException If the stream is closed and no more values
375d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     *             will be available.
385d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     */
395d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall    public T getNext() throws InterruptedException, BufferQueueClosedException;
405d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall
415d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall    /**
425d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     * Blocks, returning the next available value.
435d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     *
445d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     * @param timeout The maximum amount of time to wait.
455d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     * @param unit The unit associated with the timeout.
465d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     * @return The next available value.
475d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     * @throws InterruptedException If interrupted while waiting for the next
485d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     *             value.
49de15a5ad14da2e9069642e6f616b66b4ae660e01Puneet Lall     * @throws com.android.camera.async.BufferQueue.BufferQueueClosedException If the stream is closed and no more values
505d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     *             will be available.
515d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     * @throws TimeoutException If no new value is made available within the
525d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     *             specified time limit.
535d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     */
545d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall    public T getNext(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException,
555d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall            BufferQueueClosedException;
565d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall
575d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall    /**
585d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     * Immediately returns the next available value without removing it from the
595d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     * stream.
605d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     *
615d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     * @return The next available value if one exists, or null if no value
625d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     *         exists yet or the stream is closed.
635d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     */
645d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall    public T peekNext();
655d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall
665d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall    /**
675d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     * Immediately discards the next available value, if one exists.
685d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     */
695d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall    public void discardNext();
705d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall
715d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall    /**
725d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     * @return True if the stream has been closed by either the producer or the
735d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     *         consumer.
745d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     */
755d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall    public boolean isClosed();
765d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall
775d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall    /**
785d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     * Indicates that the stream is closed and no more results are available.
795d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall     */
805d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall    public static class BufferQueueClosedException extends Exception {
815d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall    }
825d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall}
83