git @ Cat's Eye Technologies JaC64 / master com / dreamfabric / jac64 / AudioDriverSE.java
master

Tree @master (Download .tar.gz)

AudioDriverSE.java @masterraw · history · blame

/**
 * This file is a part of JaC64 - a Java C64 Emulator
 * Main Developer: Joakim Eriksson (JaC64.com Dreamfabric.com)
 * Contact: joakime@sics.se
 * Web: http://www.jac64.com/ 
 * http://www.dreamfabric.com/c64
 * ---------------------------------------------------
 */
package com.dreamfabric.jac64;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.SourceDataLine;

public class AudioDriverSE extends AudioDriver {

  private SourceDataLine dataLine;
  private FloatControl volume;
  private int vol = 0;
  private boolean soundOn = true;
  private boolean fullSpeed = false;
  
  public int available() {
    if (dataLine == null)
      return 0;
    return dataLine.available();
  }

  public int getMasterVolume() {
    return vol;
  }

  public long getMicros() {
    if (dataLine == null)
      return 0;
    return dataLine.getMicrosecondPosition();
  }

  public boolean hasSound() {
    return dataLine != null;
  }

  public void init(int sampleRate, int bufferSize) {
//  Allocate Audio resources
    AudioFormat af = new AudioFormat(sampleRate, 16, 1, true, false);
    DataLine.Info dli =
      new DataLine.Info(SourceDataLine.class, af, bufferSize);
    try {
      dataLine = (SourceDataLine) AudioSystem.getLine(dli);
      if (dataLine == null)
        System.out.println("DataLine: not existing...");
      else {
        System.out.println("DataLine allocated: " + dataLine);
        dataLine.open(dataLine.getFormat(), bufferSize);
        volume = (FloatControl)
        dataLine.getControl(FloatControl.Type.MASTER_GAIN);
        setMasterVolume(100);

        // Startup the dataline
        dataLine.start();
      }
    } catch (Exception e) {
      System.out.println("Problem while getting data line ");
      e.printStackTrace();
      dataLine = null;
    }  
  }
  
  public void setMasterVolume(int v) {
    if (volume != null) {
      volume.setValue(-10.0f + 0.1f * v);
    }
    vol = v;
  }

  public void shutdown() {
    dataLine.close();
  }

  public void write(byte[] buffer) {
    if (dataLine == null)
      return;
    int bsize = buffer.length;
    if (!fullSpeed) {
      while (dataLine.available() < bsize)
        try {
          Thread.sleep(1);
        } catch (Exception e) {
        }
    } else if (dataLine.available() < bsize) {
      return;
    }
    if (!soundOn) {
      // Kill sound!!!
      for (int i = 0; i < buffer.length; i++) {
        buffer[i] = 0;
      }
    }
    dataLine.write(buffer, 0, bsize);
  }

  public void setSoundOn(boolean on) {
    soundOn = on;
  }

  public void setFullSpeed(boolean full) {
    fullSpeed = full;
  }

  public boolean fullSpeed() {
    return fullSpeed;
  }
}