package uk.co.mmscomputing.device.capi;
import java.io.*;
import javax.sound.sampled.*;
import uk.co.mmscomputing.sound.*;
import uk.co.mmscomputing.device.phone.*;
public class CapiPhoneCaller extends PhoneCaller{
private boolean active=true;
public CapiPhoneCaller(){
}
public void call()throws IOException{
final SourceDataLine speaker;
final TargetDataLine microphone;
try{
microphone=SoundMixerEnumerator.getInputLine(pcmformat,CapiConstants.DefaultPCMBlockSize);
try{
speaker=SoundMixerEnumerator.getOutputLine(pcmformat,CapiConstants.DefaultPCMBlockSize);
}catch(LineUnavailableException e){
microphone.close();
throw new IOException(getClass().getName()+".call:\n\t"+e.getMessage());
}
}catch(LineUnavailableException e){
throw new IOException(getClass().getName()+".call:\n\t"+e.getMessage());
}
md.setState(phoneRinging);fireListenerUpdate(md.STATE); // ask application to set remote no
String rno = md.getRemoteNo();
int time = md.getTimeOut();
// if(md.progressmonitor){in=new ProgressMonitorInputStream(null,"Fax: sending ... to "+rno+"\n"+md.getFile(),in);}
System.out.println("calling rno="+rno);
System.err.println("calling rno="+rno);
try{
CapiSystem capisystem = CapiSystem.getSystem(); // use capi system
CapiChannel channel = // try to connect
capisystem.getCaller().connect(rno,time*1000);
md.setState(phoneConnected);fireListenerUpdate(md.STATE);
md.setInfo("Connected ...");
fireListenerUpdate(md.INFO);
try{
active=true;
int count;
byte[] buffer = new byte[CapiConstants.DefaultPCMBlockSize];
final OutputStream cout = channel.getPCMOutputStream();
final InputStream cin = channel.getPCMInputStream();
final OutputStream out = md.getOutputStream();
final InputStream in = md.getInputStream();
new Thread(){
public void run(){
int count;
byte[] buffer = new byte[CapiConstants.DefaultPCMBlockSize];
try{
speaker.flush();
speaker.start();
speaker.flush();
while(active&&(count=cin.read(buffer))!=-1){ // from telecom network
speaker.write(buffer,0,count);
}
active=false;
cin.close();
speaker.flush();
speaker.stop();
speaker.flush();
speaker.close();
}catch(Exception e){
System.out.println("9\b"+getClass().getName()+".call:\n\t"+e);
e.printStackTrace();
}
}
}.start();
microphone.flush();
microphone.start();
microphone.flush();
while(active&&((count=microphone.read(buffer,0,CapiConstants.DefaultPCMBlockSize))!=-1)){
cout.write(buffer,0,count); // to telecom network
}
active=false;
cout.close();
microphone.flush();
microphone.stop();
microphone.flush();
microphone.close();
}catch(Exception e){
System.out.println("9\b"+getClass().getName()+".call:\n\t"+e);
e.printStackTrace();
}finally{
channel.close(); // initiate disconnect
}
}catch(Exception e){
System.out.println("9\b"+getClass().getName()+".call:\n\tCall could not been established.\n\t"+e);
}
md.setState(phoneDisconnected);fireListenerUpdate(md.STATE);
}
public boolean isAPIInstalled(){return true;/*capi.isInstalled();*/}
static public PhoneCaller getDevice(){
try{
return new CapiPhoneCaller();
}catch(Exception e){
e.printStackTrace();
return null;
}
}
}