package uk.co.mmscomputing.device.capi.samples;
import java.io.*;
import java.util.*;
import javax.sound.sampled.*;
import uk.co.mmscomputing.util.metadata.*;
import uk.co.mmscomputing.device.capi.*;
import uk.co.mmscomputing.device.capi.plc.*;
import uk.co.mmscomputing.device.capi.ncc.*;
import uk.co.mmscomputing.device.capi.exception.*;
public class SimpleVoiceBox implements MetadataListener, Runnable{
CapiServerApplication appl;
String phoneno;
File dir;
class WAVFilter implements FilenameFilter{
public boolean accept(File dir, String s){
s=dir+"/"+s;
File f=new File(s);
return f.isFile() && s.endsWith(".wav");
}
}
/*
phoneno without leading 0s
*/
public SimpleVoiceBox(String phoneno, File dir)throws IOException{
this.phoneno=phoneno; // phone number to accept
this.dir=dir; // dir with .wav files
}
public void run(){
try{
jcapi.checkInstalled();
System.out.println("running...");
CapiMetadata md=new CapiMetadata();
md.useMaxLogicalConnections(CapiEnumerator.getNoOfBChannels());
md.useALaw(); // set some defaults
md.use64kBit();
md.acceptAllCalls();
md.useController(1);
md.addListener(this); // want to listen;
appl=new CapiServerApplication(md);
appl.start(); // start capi thread
while(true){
System.out.println("Wait for call.");
CapiChannel channel=appl.accept();
channel.getInputStream().close(); // waste input data
try{
String files[]=dir.list(new WAVFilter()); // send all .wav files in directory
Arrays.sort(files);
for(int i=0; i<files.length; i++){
File file=new File(dir,files[i]);
System.err.println("Try sending file : "+file.getAbsolutePath());
try{
channel.writeToOutput(AudioSystem.getAudioInputStream(file));
}catch(UnsupportedAudioFileException uafe){
System.err.println(uafe.getMessage());
}
}
}catch(Exception e){
System.err.println(e.getMessage());
}
channel.close(); // initiate disconnect
}
}catch(Exception e){
System.err.println(e.getMessage());
}
}
public void update(Object data, Metadata metadata){
if(data instanceof DisconnectInd){
System.err.println("\nDisconnect\n\n");
}else if(data instanceof CapiMetadata.Indication){
handleIndication((CapiMetadata.Indication)data);
}else if(data instanceof CapiException){
System.err.println(data);
}else if(data instanceof Exception){
// System.err.println(data);
((Exception)data).printStackTrace();
}else if(data instanceof DataB3Ind){
}else if(data instanceof DataB3Conf){
}else{
System.err.println(data);
}
}
public void handleIndication(CapiMetadata.Indication mdi){
System.out.println("local no = "+mdi.localno);
System.out.println("remote no = "+mdi.remoteno);
if(phoneno.equals(mdi.remoteno)){ // if caller id is trusted number
mdi.setAccept(5000); // wait 10 sec. and then pick up
System.err.println("Accept call from "+mdi.remoteno);
}else{
mdi.setIgnore(); // otherwise ignore call
System.err.println("Ignore call from "+mdi.remoteno);
}
}
public void checkInput()throws IOException{
BufferedReader is=new BufferedReader(new InputStreamReader(System.in));
String inputline;
while((inputline=is.readLine())!=null){
// System.out.println("input: "+inputline);
if(inputline.equals("quit")){ // type 'quit' on command line to quit:)
appl.close();
break;
}
}
is.close();
}
public static void main(String[] argv){
String no="**20";
if(argv.length>0){no=argv[0];}
File userhome = new File(System.getProperty("user.home"),"mmsc");
File voicedir = new File(userhome,"phone");
voicedir.mkdirs();
if(argv.length>1){voicedir=new File(argv[1]);}
System.err.println("\nStart SimpleVoiceBox\n\taccept: "+no+"\n\tsend : "+voicedir.getAbsolutePath());
System.err.println("\n\tType 'quit' on command line to quit:)\n");
try{
SimpleVoiceBox vb=new SimpleVoiceBox(no,voicedir);
new Thread(vb).start();
vb.checkInput();
System.err.println("End SimpleVoiceBox.");
}catch(Exception e){
System.err.println(e);
}
}
}