int main(int argc, char *argv[]) { int port; int netfd; int c, h=0, m, regm; FILE *f; int fd = STDIN_FILENO; char rcmd[RBUFSIZE]; fd_set readfd; fd_set writefd; struct timeval timer; struct timeval *timerptr = NULL; gsm_frame fo; load_options(); if (!strlen(callerid)) gethostname(callerid, sizeof(callerid)); signal(SIGHUP, sighandler); signal(SIGINT, sighandler); if ( !(f = fdopen(fd, "w+"))) { fprintf(stderr, "Unable to create file on fd %d\n", fd); return -1; } if ( (audiofd = audio_setup(audiodev)) == -1) { fprintf(stderr, "Fatal error: failed to open sound device"); return -1; } if ( (port = iax_init(0) < 0)) { fprintf(stderr, "Fatal error: failed to initialize iax with port %d\n", port); return -1; } iax_set_formats(AST_FORMAT_GSM); netfd = iax_get_fd(); check_iax_register(); fprintf(f, "Text Based Telephony Client.\n\n"); issue_prompt(f); timer.tv_sec = 0; timer.tv_usec = 0; while(1) { FD_ZERO(&readfd); FD_ZERO(&writefd); FD_SET(fd, &readfd); if(fd > h) h = fd; if(answered_call && !writeonly) { FD_SET(audiofd, &readfd); if(audiofd > h) h = audiofd; } if (cursound > -1) { FD_SET(audiofd, &writefd); if (audiofd > h) h = audiofd; } FD_SET(netfd, &readfd); if(netfd > h) h = netfd; if ( (c = select(h+1, &readfd, &writefd, 0, timerptr)) >= 0) { if(FD_ISSET(fd, &readfd)) { if ( ( fgets(&*rcmd, 256, f))) { rcmd[strlen(rcmd)-1] = 0; parse_args(f, &*rcmd); } else fprintf(f, "Fatal error: failed to read data!\n"); issue_prompt(f); } if(answered_call) { if(FD_ISSET(audiofd, &readfd)) { static int ret, rlen = 0; static short rbuf[FRAME_SIZE]; if ( (ret = read(audiofd, rbuf + rlen, 2 * (FRAME_SIZE-rlen))) == -1) { puts("Failed to read audio."); return -1; } rlen += ret/2; if(rlen == FRAME_SIZE) { rlen = 0; if(!most_recent_answer->gsmout) most_recent_answer->gsmout = gsm_create(); gsm_encode(most_recent_answer->gsmout, rbuf, fo); if(iax_send_voice(most_recent_answer->session, AST_FORMAT_GSM, (char *)fo, sizeof(fo)) == -1) puts("Failed to send voice!"); } } } do_iax_event(f); m = iax_time_to_next_event(); if(m > -1) { timerptr = &timer; timer.tv_sec = m /1000; timer.tv_usec = (m % 1000) * 1000; } else timerptr = 0; regm = check_iax_timeout(); if (!timerptr || (m > regm)) { timerptr = &timer; timer.tv_sec = regm /1000; timer.tv_usec = (regm % 1000) * 1000; } if (FD_ISSET(audiofd, &writefd)) { send_sound(audiofd); } } else { if(errno == EINTR) continue; fprintf(stderr, "Fatal error in select(): %s\n", strerror(errno)); return -1; } } return 0; }
void finish_sound_buffer (void) { static unsigned long tframe; int bufsize = (uae_u8*)paula_sndbufpt - (uae_u8*)paula_sndbuffer; if (currprefs.turbo_emulation) { paula_sndbufpt = paula_sndbuffer; return; } if (currprefs.sound_stereo_swap_paula) { if (get_audio_nativechannels (currprefs.sound_stereo) == 2 || get_audio_nativechannels (currprefs.sound_stereo) == 4) channelswap((uae_s16*)paula_sndbuffer, bufsize / 2); else if (get_audio_nativechannels (currprefs.sound_stereo) == 6) channelswap6((uae_s16*)paula_sndbuffer, bufsize / 2); } #ifdef DRIVESOUND driveclick_mix ((uae_s16*)paula_sndbuffer, paula_sndbufsize / 2, currprefs.dfxclickchannelmask); #endif // must be after driveclick_mix paula_sndbufpt = paula_sndbuffer; #ifdef AVIOUTPUT if (avioutput_enabled && avioutput_audio) { AVIOutput_WriteAudio((uae_u8*)paula_sndbuffer, bufsize); if (avioutput_nosoundsync) sound_setadjust(0); } if (avioutput_enabled && (!avioutput_framelimiter || avioutput_nosoundoutput)) return; #endif if (!have_sound) return; #if 0 // we got buffer that was not full (recording active). Need special handling. if (bufsize < sdp->sndbufsize && !extrasndbuf) { extrasndbufsize = sdp->sndbufsize; extrasndbuf = xcalloc(uae_u8, sdp->sndbufsize); extrasndbuffered = 0; } #endif static int statuscnt; if (statuscnt > 0 && tframe != timeframes) { tframe = timeframes; statuscnt--; if (statuscnt == 0) gui_data.sndbuf_status = 0; } if (gui_data.sndbuf_status == 3) gui_data.sndbuf_status = 0; if (extrasndbuf) { int size = extrasndbuffered + bufsize; int copied = 0; if (size > extrasndbufsize) { copied = extrasndbufsize - extrasndbuffered; memcpy(extrasndbuf + extrasndbuffered, paula_sndbuffer, copied); send_sound(sdp, (uae_u16*)extrasndbuf); extrasndbuffered = 0; } memcpy(extrasndbuf + extrasndbuffered, (uae_u8*)paula_sndbuffer + copied, bufsize - copied); extrasndbuffered += bufsize - copied; } else { send_sound(sdp, paula_sndbuffer); } }