/* * HalfNES by Andrew Hoffman * Licensed under the GNU GPL Version 3. See LICENSE file */ package com.grapeshot.halfnes.audio; /** * * @author Andrew */ public class CircularBuffer { int[] buffer; int bufsize; int write_ptr; int read_ptr; public CircularBuffer(int size) { //gives you a circular FIFO of indicated size. //size rounded up to nearest power of two. Limited to 2^26 b/c that's 256mb for (int i = 0; i < 26; ++i) { int q = (int) Math.pow(2, i); if (q > (size)) { buffer = new int[q]; bufsize = q; break; } } if (buffer == null) { throw new UnsupportedOperationException("Buffer too large"); } write_ptr = size - 2; read_ptr = 0; } public void write(final int data) { buffer[write_ptr] = data; ++write_ptr; write_ptr &= (bufsize - 1); } public int read() { final int retval = buffer[read_ptr]; ++read_ptr; read_ptr &= (bufsize - 1); return retval; } public void advanceRead(int amt) { read_ptr = (read_ptr + amt) & (bufsize - 1); } public void advanceWrite(int amt) { write_ptr = (write_ptr + amt) & (bufsize - 1); } public int peek() { return buffer[read_ptr]; } }