samer@0: /* samer@0: * VLine.java samer@0: * samer@0: * Copyright (c) 2000, Samer Abdallah, King's College London. samer@0: * All rights reserved. samer@0: * samer@0: * This software is provided AS iS and WITHOUT ANY WARRANTY; samer@0: * without even the implied warranty of MERCHANTABILITY or samer@0: * FITNESS FOR A PARTICULAR PURPOSE. samer@0: */ samer@0: samer@0: package samer.audio; samer@0: samer@0: import javax.sound.sampled.*; samer@0: import java.awt.*; samer@0: import java.awt.event.*; samer@0: import java.util.*; samer@0: import samer.core.*; samer@0: import samer.core.util.*; samer@0: import samer.core.util.swing.Meter; samer@0: import samer.core.types.*; samer@0: samer@0: /** samer@0: A Viewable for exposing a Javasound DataLine object. samer@0: The Agent responds to these commands: "open", "close", "info" samer@0: "start", "stop", "drain" and "flush". samer@0: samer@0: Changes: samer@0: 16/6/03: removed ClipAgent class. Don't care about clips. samer@0: Also removed line members from agent classes: they now use samer@0: local variables in the execute method instead. samer@0: */ samer@0: samer@0: public abstract class VLine extends Viewable implements Agent samer@0: { samer@0: public VLine(String name) { samer@0: super(name); samer@0: setAgent(this); samer@0: Shell.registerViewable(this); samer@0: } samer@0: samer@0: abstract DataLine getLine(); samer@0: abstract void openImpl() throws Exception; samer@0: abstract void closeImpl() throws Exception; samer@0: samer@0: /** Open the line using its default format */ samer@0: public void open() throws Exception { openImpl(); } samer@0: samer@0: /** Close the line */ samer@0: public void close() { samer@0: try{ closeImpl(); } samer@0: catch (Exception ex) { samer@0: Shell.trace("line failed to close: "+ex); samer@0: } samer@0: } samer@0: samer@0: public void start() { samer@0: Shell.status("starting line"); samer@0: getLine().start(); samer@0: Shell.status("line started"); samer@0: } samer@0: samer@0: public void stop() { samer@0: Shell.status("stopping line"); samer@0: getLine().stop(); samer@0: Shell.status("line stopped"); samer@0: } samer@0: samer@0: public void dispose() { close(); super.dispose(); } samer@0: samer@0: public Viewer getViewer() { return new LineViewer(getLine()); } samer@0: samer@0: public void getCommands(Agent.Registry r) { samer@0: r.add("start").add("stop").add("flush"); samer@0: r.add("open").add("close").add("info"); samer@0: } samer@0: samer@0: public void execute(String cmd, Environment env) throws Exception samer@0: { samer@0: if (cmd.equals("start")) start(); samer@0: else if (cmd.equals("stop")) stop(); samer@0: else if (cmd.equals("drain")) { getLine().drain(); changed(); } samer@0: else if (cmd.equals("flush")) { getLine().flush(); changed(); } samer@0: else if (cmd.equals("open")) open(); samer@0: else if (cmd.equals("close")) close(); samer@0: else if (cmd.equals("info")) { samer@0: Shell.print("Line information: "+getLabel()); samer@0: Shell.print(getLine().getLineInfo().toString()); samer@0: Shell.print("Format: "+getLine().getFormat()); samer@0: Shell.print("Buffer size: "+getLine().getBufferSize()); samer@0: } samer@0: } samer@0: samer@0: public String toString() { return super.toString()+"="+getLine().getFormat(); } samer@0: samer@0: class LineViewer extends BaseViewer samer@0: { samer@0: Meter meter=null; samer@0: DataLine line; samer@0: samer@0: public LineViewer(DataLine line) { samer@0: super(VLine.this); samer@0: setLayout( new VLayout(1,4)); samer@0: setText(getLabel()); samer@0: samer@0: if (Shell.getBoolean("meter",true)) { samer@1: this.line = line; samer@0: Shell.push("meter"); samer@0: meter = new Meter(); samer@0: meter.getMap().setDomain(0,line.getBufferSize()); samer@0: Shell.pop(); samer@0: add(meter); samer@0: } samer@0: Shell.pop(); samer@0: } samer@0: samer@0: public void update(Observable o, Object src) { samer@0: if (src==Viewable.DISPOSING) super.update(o,src); samer@0: else if (meter!=null) meter.next(line.available()); samer@0: } samer@0: } samer@0: } samer@0: