From 4fa63e61bc1dae649310d98288f9410382ab2a52 Mon Sep 17 00:00:00 2001 From: gardners Date: Tue, 8 May 2012 14:32:13 +0930 Subject: [PATCH] improved monitor-cli.c to auto-dial a peer and pump audio in. --- monitor-cli.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++-- monitor.c | 13 ++++++ 2 files changed, 123 insertions(+), 3 deletions(-) diff --git a/monitor-cli.c b/monitor-cli.c index 9235b67f..b7210b83 100644 --- a/monitor-cli.c +++ b/monitor-cli.c @@ -6,9 +6,14 @@ #include #include +int fd; +int writeLine(char *msg) +{ + write(fd,msg,strlen(msg)); +} + int main(int argc, char *argv[]) { struct sockaddr_un addr; - int fd; if ( (fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { perror("socket error"); @@ -43,20 +48,122 @@ int main(int argc, char *argv[]) { fds[fdcount].events=POLLIN; fdcount++; + writeLine("monitor vomp\n"); + writeLine("monitor rhizome\n"); + + if (argc>1) + writeLine("call * 5551 5552\n"); + while(1) { poll(fds,fdcount,1000); char line[1024]; int bytes; + int i; bytes=read(fd,line,1024); if (bytes>0) - write(STDOUT_FILENO,line,bytes); + for(i=0;i0) { - write(STDOUT_FILENO,line,bytes); + line[bytes]=0; + printf("< %s",line); write(fd,line,bytes); } } return 0; } + +int callState=0; +int processLine(char *cmd,unsigned char *data,int dataLen) +{ + int l_id,r_id,l_state,r_state; + printf("> %s\n",cmd); + if (data) { + int i,j; + for(i=0;i=0x20&&data[i+j]<0x7e) + printf("%c",data[i+j]); else printf("."); + } + printf("\n"); + } + } + if (sscanf(cmd,"CALLSTATUS:%x:%x:%d:%d", + &l_id,&r_id,&l_state,&r_state)==4) + { + if (l_state==4) { + // We are ringing, so pickup + char msg[1024]; + sprintf(msg,"pickup %x\n",l_id); + writeLine(msg); + } + callState=l_state; + } + if (sscanf(cmd,"KEEPALIVE:%x",&l_id)==1) { + if (callState==5) { + /* Send synthetic audio packet */ + char buffer[1024]; + sprintf(buffer,"*320:AUDIO:%x:8\n" + "qwertyuiopasdfghjklzxcvbnm123456" + "qwertyuiopasdfghjklzxcvbnm123456" + "qwertyuiopasdfghjklzxcvbnm123456" + "qwertyuiopasdfghjklzxcvbnm123456" + "qwertyuiopasdfghjklzxcvbnm123456" + "qwertyuiopasdfghjklzxcvbnm123456" + "qwertyuiopasdfghjklzxcvbnm123456" + "qwertyuiopasdfghjklzxcvbnm123456" + "qwertyuiopasdfghjklzxcvbnm123456" + "qwertyuiopasdfghjklzxcvbnm123456",l_id); + writeLine(buffer); + printf("< *320:AUDIO:%x:8\\n<320 bytes>\n",l_id); + } + } + +} + +char cmd[1024]; +int cmdLen=0; +int cmdOfs=0; +int dataBytesExpected=0; +unsigned char data[65536]; +int dataBytes=0; + +#define STATE_CMD 1 +#define STATE_DATA 2 +int state=STATE_CMD; +int processChar(int c) +{ + switch(state) { + case STATE_CMD: + if (c!='\n') { + if (cmdLen<1000) { + cmd[cmdLen++]=c; + } + } else { + if (!cmdLen) return 0; + cmd[cmdLen]=0; + if (sscanf(cmd,"*%d:%n",&dataBytesExpected,&cmdOfs)==1) { + if (dataBytesExpected<0) dataBytesExpected=0; + if (dataBytesExpected>65535) dataBytesExpected=65535; + state=STATE_DATA; + } else { + processLine(cmd,NULL,0); + cmdLen=0; + } + } + break; + case STATE_DATA: + if (dataBytes=dataBytesExpected) { + processLine(&cmd[cmdOfs],data,dataBytes); + cmdLen=0; + } + } +} diff --git a/monitor.c b/monitor.c index 967dcd8b..96934424 100644 --- a/monitor.c +++ b/monitor.c @@ -369,6 +369,19 @@ int monitor_process_command(int index,char *cmd) else if (!strcasecmp(cmd,"ignore rhizome")) c->flags&=~MONITOR_RHIZOME; else if (sscanf(cmd,"call %s %s %s",sid,localDid,remoteDid)==3) { + if (sid[0]=='*') { + /* For testing, pick a peer and call them */ + int bin,slot; + for(bin=0;bin