annotate src/samer/audio/VLine.java @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents 5df24c91468d
children
rev   line source
samer@0 1 /*
samer@0 2 * VLine.java
samer@0 3 *
samer@0 4 * Copyright (c) 2000, Samer Abdallah, King's College London.
samer@0 5 * All rights reserved.
samer@0 6 *
samer@0 7 * This software is provided AS iS and WITHOUT ANY WARRANTY;
samer@0 8 * without even the implied warranty of MERCHANTABILITY or
samer@0 9 * FITNESS FOR A PARTICULAR PURPOSE.
samer@0 10 */
samer@0 11
samer@0 12 package samer.audio;
samer@0 13
samer@0 14 import javax.sound.sampled.*;
samer@0 15 import java.awt.*;
samer@0 16 import java.awt.event.*;
samer@0 17 import java.util.*;
samer@0 18 import samer.core.*;
samer@0 19 import samer.core.util.*;
samer@0 20 import samer.core.util.swing.Meter;
samer@0 21 import samer.core.types.*;
samer@0 22
samer@0 23 /**
samer@0 24 A Viewable for exposing a Javasound DataLine object.
samer@0 25 The Agent responds to these commands: "open", "close", "info"
samer@0 26 "start", "stop", "drain" and "flush".
samer@0 27
samer@0 28 Changes:
samer@0 29 16/6/03: removed ClipAgent class. Don't care about clips.
samer@0 30 Also removed line members from agent classes: they now use
samer@0 31 local variables in the execute method instead.
samer@0 32 */
samer@0 33
samer@0 34 public abstract class VLine extends Viewable implements Agent
samer@0 35 {
samer@0 36 public VLine(String name) {
samer@0 37 super(name);
samer@0 38 setAgent(this);
samer@0 39 Shell.registerViewable(this);
samer@0 40 }
samer@0 41
samer@0 42 abstract DataLine getLine();
samer@0 43 abstract void openImpl() throws Exception;
samer@0 44 abstract void closeImpl() throws Exception;
samer@0 45
samer@0 46 /** Open the line using its default format */
samer@0 47 public void open() throws Exception { openImpl(); }
samer@0 48
samer@0 49 /** Close the line */
samer@0 50 public void close() {
samer@0 51 try{ closeImpl(); }
samer@0 52 catch (Exception ex) {
samer@0 53 Shell.trace("line failed to close: "+ex);
samer@0 54 }
samer@0 55 }
samer@0 56
samer@0 57 public void start() {
samer@0 58 Shell.status("starting line");
samer@0 59 getLine().start();
samer@0 60 Shell.status("line started");
samer@0 61 }
samer@0 62
samer@0 63 public void stop() {
samer@0 64 Shell.status("stopping line");
samer@0 65 getLine().stop();
samer@0 66 Shell.status("line stopped");
samer@0 67 }
samer@0 68
samer@0 69 public void dispose() { close(); super.dispose(); }
samer@0 70
samer@0 71 public Viewer getViewer() { return new LineViewer(getLine()); }
samer@0 72
samer@0 73 public void getCommands(Agent.Registry r) {
samer@0 74 r.add("start").add("stop").add("flush");
samer@0 75 r.add("open").add("close").add("info");
samer@0 76 }
samer@0 77
samer@0 78 public void execute(String cmd, Environment env) throws Exception
samer@0 79 {
samer@0 80 if (cmd.equals("start")) start();
samer@0 81 else if (cmd.equals("stop")) stop();
samer@0 82 else if (cmd.equals("drain")) { getLine().drain(); changed(); }
samer@0 83 else if (cmd.equals("flush")) { getLine().flush(); changed(); }
samer@0 84 else if (cmd.equals("open")) open();
samer@0 85 else if (cmd.equals("close")) close();
samer@0 86 else if (cmd.equals("info")) {
samer@0 87 Shell.print("Line information: "+getLabel());
samer@0 88 Shell.print(getLine().getLineInfo().toString());
samer@0 89 Shell.print("Format: "+getLine().getFormat());
samer@0 90 Shell.print("Buffer size: "+getLine().getBufferSize());
samer@0 91 }
samer@0 92 }
samer@0 93
samer@0 94 public String toString() { return super.toString()+"="+getLine().getFormat(); }
samer@0 95
samer@0 96 class LineViewer extends BaseViewer
samer@0 97 {
samer@0 98 Meter meter=null;
samer@0 99 DataLine line;
samer@0 100
samer@0 101 public LineViewer(DataLine line) {
samer@0 102 super(VLine.this);
samer@0 103 setLayout( new VLayout(1,4));
samer@0 104 setText(getLabel());
samer@0 105
samer@0 106 if (Shell.getBoolean("meter",true)) {
samer@1 107 this.line = line;
samer@0 108 Shell.push("meter");
samer@0 109 meter = new Meter();
samer@0 110 meter.getMap().setDomain(0,line.getBufferSize());
samer@0 111 Shell.pop();
samer@0 112 add(meter);
samer@0 113 }
samer@0 114 Shell.pop();
samer@0 115 }
samer@0 116
samer@0 117 public void update(Observable o, Object src) {
samer@0 118 if (src==Viewable.DISPOSING) super.update(o,src);
samer@0 119 else if (meter!=null) meter.next(line.available());
samer@0 120 }
samer@0 121 }
samer@0 122 }
samer@0 123