content: /*
   * HalfNES by Andrew Hoffman
   * Licensed under the GNU GPL Version 3. See LICENSE file
   */
  package com.grapeshot.halfnes.ui;
  
  import com.grapeshot.halfnes.audio.AudioOutInterface;
  import java.awt.Color;
  import java.awt.Graphics2D;
  import java.awt.image.BufferedImage;
  
  /**
   *
   * @author Andrew
   */
  public class Oscilloscope implements AudioOutInterface {
  
      final private static int width = 400, length = 640;
      final private static int scf = 65536 / width / 2;
      DebugUI d;
      BufferedImage b;
      Graphics2D g;
      AudioOutInterface iface;
      int[] buffer = new int[length];
      int buf_ptr = 0;
      int prevsample = 0;
  
      public Oscilloscope(AudioOutInterface i) {
          this.iface = i;
          d = new DebugUI(length, width);
          b = new BufferedImage(length, width, BufferedImage.TYPE_INT_ARGB_PRE);
          g = b.createGraphics();
          g.setBackground(Color.black);
          g.setColor(Color.green);
          d.pack();
          d.run();
      }
  
      public Oscilloscope() {
          this.iface = null;
          d = new DebugUI(length, width);
          b = new BufferedImage(length, width, BufferedImage.TYPE_INT_ARGB_PRE);
          g = b.createGraphics();
          g.setBackground(Color.black);
          g.setColor(Color.red);
          d.pack();
          d.run();
      }
  
      @Override
      public void outputSample(int sample) {
          if (buf_ptr > 0
                  || (prevsample <= 0 && sample >= 0)) {
              //start cap @ zero crossing
              if (buf_ptr < buffer.length) {
                  buffer[buf_ptr++] = sample;
              }
          }
          prevsample = sample;
          if (!(iface == null)) {
              iface.outputSample(sample);
          }
      }
  
      @Override
      public void flushFrame(boolean waitIfBufferFull) {
          if (!(iface == null)) {
              iface.flushFrame(waitIfBufferFull);
          }
          g.clearRect(0, 0, length, width);
          for (int i = 1; i < buf_ptr; ++i) {
  
              g.drawLine(i - 1, (buffer[i - 1] / scf) + width / 2, i, (buffer[i] / scf) + width / 2);
          }
          g.drawLine(0, width / 2, length, width / 2);
          d.setFrame(b);
          buf_ptr = 0;
  
      }
  
      @Override
      public void pause() {
          if (!(iface == null)) {
              iface.pause();
          }
      }
  
      @Override
      public void resume() {
          if (!(iface == null)) {
              iface.resume();
          }
      }
  
      @Override
      public void destroy() {
  
          d.setVisible(false);
          d.dispose();
          if (!(iface == null)) {
              iface.destroy();
          }
      }
  
      @Override
      public boolean bufferHasLessThan(int samples) {
          if (!(iface == null)) {
              return iface.bufferHasLessThan(samples);
          } else {
              return false;
          }
      }
  }
  