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