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
|