1 19 package org.lucane.applications.audioconf.audio; 20 21 import java.util.*; 22 23 import javax.sound.sampled.*; 24 25 import org.xiph.speex.SpeexEncoder; 26 27 30 public class AudioRecorder implements Runnable 31 { 32 private TargetDataLine dataLine; 34 private AudioFormat audioFormat; 35 private AudioConfig audioConfig; 36 37 private ArrayList listeners; 38 39 44 public AudioRecorder(AudioConfig config) 45 { 46 this.listeners = new ArrayList(); 47 48 this.audioConfig = config; 49 this.audioFormat = config.createAudioFormat(AudioFormat.Encoding.PCM_SIGNED); 50 DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat); 51 try { 52 dataLine = (TargetDataLine) AudioSystem.getLine(info); 53 } catch (LineUnavailableException lue) { 54 lue.printStackTrace(); 55 } 56 } 57 58 63 public void addAudioListener(AudioRecorderListener listener) 64 { 65 this.listeners.add(listener); 66 } 67 68 73 public void removeAudioListener(AudioRecorderListener listener) 74 { 75 this.listeners.remove(listener); 76 } 77 78 81 public void stop() 82 { 83 dataLine.stop(); 84 dataLine.close(); 85 86 Iterator listeners = this.listeners.iterator(); 88 while(listeners.hasNext()) 89 ((AudioRecorderListener)listeners.next()).audioRecordingEnded(); 90 } 91 92 95 public void run() 96 { 97 try { 98 dataLine.open(); 99 dataLine.start(); 100 } catch(LineUnavailableException lue) { 101 lue.printStackTrace(); 102 return; 103 } 104 105 Iterator listeners = this.listeners.iterator(); 107 while(listeners.hasNext()) 108 ((AudioRecorderListener)listeners.next()).audioRecordingStarted(audioConfig); 109 110 111 byte[] pcm = new byte[audioConfig.getPcmBufferSize()]; 113 byte[] speex = new byte[audioConfig.getSpeexBufferSize()]; 114 SpeexEncoder encoder = audioConfig.createEncoder(); 115 116 while(dataLine.isOpen()) 117 { 118 int length = dataLine.read(pcm, 0, pcm.length); 119 encoder.processData(pcm, 0, pcm.length); 120 length = encoder.getProcessedDataByteSize(); 121 encoder.getProcessedData(speex, 0); 122 123 if(length > 0) 124 { 125 listeners = this.listeners.iterator(); 126 while(listeners.hasNext()) 127 ((AudioRecorderListener)listeners.next()).audioRecorded(speex, length); 128 } 129 } 130 } 131 } | Popular Tags |