diff options
Diffstat (limited to 'src/com/jsyn/io')
-rw-r--r-- | src/com/jsyn/io/AudioFifo.java | 204 | ||||
-rw-r--r-- | src/com/jsyn/io/AudioInputStream.java | 46 | ||||
-rw-r--r-- | src/com/jsyn/io/AudioOutputStream.java | 29 |
3 files changed, 0 insertions, 279 deletions
diff --git a/src/com/jsyn/io/AudioFifo.java b/src/com/jsyn/io/AudioFifo.java deleted file mode 100644 index 0c563e4..0000000 --- a/src/com/jsyn/io/AudioFifo.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright 2010 Phil Burk, Mobileer Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.jsyn.io; - -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -/** - * FIFO that implements AudioInputStream, AudioOutputStream interfaces. This can be used to send - * audio data between different threads. The reads or writes may or may not wait based on flags. - * - * @author Phil Burk (C) 2010 Mobileer Inc - */ -public class AudioFifo implements AudioInputStream, AudioOutputStream { - // These indices run double the FIFO size so that we can tell empty from full. - private volatile int readIndex; - private volatile int writeIndex; - private volatile double[] buffer; - // Used to mask the index into range when accessing the buffer array. - private int accessMask; - // Used to mask the index so it wraps around. - private int sizeMask; - private boolean writeWaitEnabled = true; - private boolean readWaitEnabled = true; - final Lock lock = new ReentrantLock(); - final Condition notFull = lock.newCondition(); - final Condition notEmpty = lock.newCondition(); - - /** - * @param size Number of doubles in the FIFO. Must be a power of 2. Eg. 1024. - */ - public void allocate(int size) { - if (!isPowerOfTwo(size)) { - throw new IllegalArgumentException("Size must be a power of two."); - } - buffer = new double[size]; - accessMask = size - 1; - sizeMask = (size * 2) - 1; - } - - public int size() { - return buffer.length; - } - - public static boolean isPowerOfTwo(int size) { - return ((size & (size - 1)) == 0); - } - - /** How many samples are available for reading without blocking? */ - @Override - public int available() { - return (writeIndex - readIndex) & sizeMask; - } - - @Override - public void close() { - // TODO Maybe we should tell any thread that is waiting that the FIFO is closed. - } - - @Override - public double read() { - double value = Double.NaN; - if (readWaitEnabled) { - lock.lock(); - try { - while (available() < 1) { - try { - notEmpty.await(); - } catch (InterruptedException e) { - return Double.NaN; - } - } - value = readOneInternal(); - } finally { - lock.unlock(); - } - - } else { - if (readIndex != writeIndex) { - value = readOneInternal(); - } - } - - if (writeWaitEnabled) { - lock.lock(); - notFull.signal(); - lock.unlock(); - } - - return value; - } - - private double readOneInternal() { - double value = buffer[readIndex & accessMask]; - readIndex = (readIndex + 1) & sizeMask; - return value; - } - - @Override - public void write(double value) { - if (writeWaitEnabled) { - lock.lock(); - try { - while (available() == buffer.length) - { - try { - notFull.await(); - } catch (InterruptedException e) { - return; // Silently fail - } - } - writeOneInternal(value); - } finally { - lock.unlock(); - } - - } else { - if (available() != buffer.length) { - writeOneInternal(value); - } - } - - if (readWaitEnabled) { - lock.lock(); - notEmpty.signal(); - lock.unlock(); - } - } - - private void writeOneInternal(double value) { - buffer[writeIndex & accessMask] = value; - writeIndex = (writeIndex + 1) & sizeMask; - } - - @Override - public int read(double[] buffer) { - return read(buffer, 0, buffer.length); - } - - @Override - public int read(double[] buffer, int start, int count) { - if (readWaitEnabled) { - for (int i = 0; i < count; i++) { - buffer[i + start] = read(); - } - } else { - if (available() < count) { - count = available(); - } else { - for (int i = 0; i < count; i++) { - buffer[i + start] = read(); - } - } - } - return count; - } - - @Override - public void write(double[] buffer) { - write(buffer, 0, buffer.length); - } - - @Override - public void write(double[] buffer, int start, int count) { - for (int i = 0; i < count; i++) { - write(buffer[i + start]); - } - } - - /** If true then a subsequent write call will wait if there is no room to write. */ - public void setWriteWaitEnabled(boolean enabled) { - writeWaitEnabled = enabled; - - } - - /** If true then a subsequent read call will wait if there is no data to read. */ - public void setReadWaitEnabled(boolean enabled) { - readWaitEnabled = enabled; - - } - - public boolean isWriteWaitEnabled() { - return writeWaitEnabled; - } - - public boolean isReadWaitEnabled() { - return readWaitEnabled; - } -} diff --git a/src/com/jsyn/io/AudioInputStream.java b/src/com/jsyn/io/AudioInputStream.java deleted file mode 100644 index f233ff1..0000000 --- a/src/com/jsyn/io/AudioInputStream.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2009 Phil Burk, Mobileer Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.jsyn.io; - -public interface AudioInputStream { - public double read(); - - /** - * Try to fill the entire buffer. - * - * @param buffer - * @return number of samples read - */ - public int read(double[] buffer); - - /** - * Read from the stream. Block until some data is available. - * - * @param buffer - * @param start index of first sample in buffer - * @param count number of samples to read, for example count=8 for 4 stereo frames - * @return number of samples read - */ - public int read(double[] buffer, int start, int count); - - public void close(); - - /** - * @return number of samples currently available to read without blocking - */ - public int available(); -} diff --git a/src/com/jsyn/io/AudioOutputStream.java b/src/com/jsyn/io/AudioOutputStream.java deleted file mode 100644 index dada577..0000000 --- a/src/com/jsyn/io/AudioOutputStream.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2009 Phil Burk, Mobileer Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.jsyn.io; - -import java.io.IOException; - -public interface AudioOutputStream { - public void write(double value) throws IOException; - - public void write(double[] buffer) throws IOException; - - public void write(double[] buffer, int start, int count) throws IOException; - - public void close() throws IOException; -} |