samer@0
|
1 /*
|
samer@0
|
2 * LineSource.java
|
samer@0
|
3 *
|
samer@0
|
4 * Copyright (c) 2012, 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@46
|
12 package ishara.audio;
|
samer@0
|
13 import javax.sound.sampled.*;
|
samer@0
|
14 import java.io.*;
|
samer@0
|
15
|
samer@0
|
16
|
samer@0
|
17 /**
|
samer@0
|
18 An AudioSource that reads from the sound card in real time.
|
samer@0
|
19 Uses a standard JavaSound TargetDataLine to get data.
|
samer@0
|
20 However, an alternative DataLine can be supplied instead.
|
samer@0
|
21 */
|
samer@0
|
22
|
samer@0
|
23 public class LineSource extends AudioSource
|
samer@0
|
24 {
|
samer@0
|
25 private TargetDataLine line;
|
samer@0
|
26 private int bufsize;
|
samer@0
|
27
|
samer@0
|
28 /** Create LineSource reading from given TargetDataLine */
|
samer@0
|
29 public LineSource(AudioFormat f, int bufsize) throws Exception {
|
samer@0
|
30 this((TargetDataLine)AudioSystem.getLine(lineInfo(f,bufsize)),f,bufsize);
|
samer@0
|
31 }
|
samer@0
|
32
|
samer@0
|
33 public LineSource(TargetDataLine l,AudioFormat f,int bs) throws Exception {
|
samer@0
|
34 super(f); line=l;
|
samer@0
|
35 print("Opening audio data line: "+f);
|
samer@0
|
36 if (bs==0) line.open(f); else line.open(f,bs);
|
samer@0
|
37 bufsize=line.getBufferSize();
|
samer@0
|
38 }
|
samer@0
|
39
|
samer@0
|
40 public void dispose() {
|
samer@0
|
41 print("Closing audio data line");
|
samer@0
|
42 try { line.close(); }
|
samer@0
|
43 catch (Exception ex) {
|
samer@0
|
44 print("line failed to close: "+ex);
|
samer@0
|
45 }
|
samer@0
|
46 }
|
samer@0
|
47
|
samer@0
|
48 public void start() { line.flush(); line.start(); }
|
samer@0
|
49 public void stop() { line.stop(); }
|
samer@0
|
50 public int read(byte [] buf, int offs, int len) throws Exception {
|
samer@0
|
51 return line.read(buf,offs,len);
|
samer@0
|
52 }
|
samer@0
|
53
|
samer@0
|
54 public DataLine getLine() { return line; }
|
samer@0
|
55 public void check() { print("LineSource buffer room available: "+(bufsize-line.available())); }
|
samer@0
|
56 public String toString() { return "LineSource("+line.getFormat()+")"; }
|
samer@0
|
57
|
samer@0
|
58 public static DataLine.Info lineInfo(AudioFormat fmt) { return lineInfo(fmt,0); }
|
samer@0
|
59 public static DataLine.Info lineInfo(AudioFormat fmt, int bufsize) {
|
samer@0
|
60 if (bufsize==0)
|
samer@0
|
61 return new DataLine.Info( TargetDataLine.class, fmt);
|
samer@0
|
62 else
|
samer@0
|
63 return new DataLine.Info( TargetDataLine.class, fmt, bufsize);
|
samer@0
|
64 }
|
samer@0
|
65 }
|
samer@0
|
66
|