content: /*
   * 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];
      }
  }
  