+ if((mode&RECORD) && (mode&PLAY)) {
+ FD_ZERO(&read_fds);
+ FD_ZERO(&write_fds);
+ /* read_fds */
+ FD_SET(0,&read_fds);
+ FD_SET(pfile_fd,&read_fds);
+ FD_SET(audio_fd,&read_fds);
+ /* write_fds */
+ FD_SET(sfile_fd,&write_fds);
+ FD_SET(audio_fd,&write_fds);
+ fds_tv.tv_sec=0;
+ fds_tv.tv_usec=1000;
+ while(c!='q') {
+ k=select(sfile_fd+1,&read_fds,&write_fds,NULL,&fds_tv);
+ if(k==0) printf("itz zZzero :p\n");
+ if(k) {
+ if(FD_ISSET(0,&read_fds)) {
+ puts("reading from stdin");
+ read(0,&c,1);
+ }
+ if(FD_ISSET(pfile_fd,&read_fds)) {
+ puts("read from sound file");
+ read(pfile_fd,buf2,set.bufsize);
+ }
+ if(FD_ISSET(audio_fd,&read_fds)) {
+ puts("reading from audio device");
+ read(audio_fd,buf,set.bufsize);
+ }
+ if(FD_ISSET(sfile_fd,&write_fds)) {
+ puts("writing to file");
+ write(sfile_fd,buf,set.bufsize);
+ }
+ if(FD_ISSET(audio_fd,&write_fds)) {
+ puts("writing to audio device");
+ write(audio_fd,buf2,set.bufsize);
+ }
+ }
+ }
+ }
+
+ if(mode&CONVERT) {
+ if((tmp=lseek(pfile_fd,0,SEEK_END))==-1) {
+ printf("cannot determine filesize :(\n");
+ perror("lseek");
+ return -1;
+ }
+ lseek(pfile_fd,0,SEEK_SET);
+ strcpy(info,"RIFF");
+ write(sfile_fd,info,4);
+ info_int=tmp+36;
+ write(sfile_fd,&info_int,4);
+ strcpy(info,"WAVEfmt ");
+ write(sfile_fd,info,8);
+ if(set.format==AFMT_S16_LE) info_int=16;
+ if(set.format==AFMT_U8) info_int=8;
+ write(sfile_fd,&info_int,4);
+ info_int=set.channel<<16;
+ info_int|=1;
+ write(sfile_fd,&info_int,4);
+ info_int=set.freq;
+ write(sfile_fd,&info_int,4);
+ info_int=set.freq*set.channel;
+ if(set.format==AFMT_S16_LE) info_int*=2;
+ write(sfile_fd,&info_int,4);
+ info_int=(set.channel*8)<<16;
+ info_int|=set.channel;
+ write(sfile_fd,&info_int,4);
+ strcpy(info,"data");
+ write(sfile_fd,info,4);
+ info_int=tmp;
+ write(sfile_fd,&info_int,4);
+ /* write data now ... */
+ for(j=0;j<tmp/set.bufsize;j++) {
+ i=read(pfile_fd,buf,set.bufsize);
+ k=write(sfile_fd,buf,set.bufsize);
+ printf("read %d, wrote %d\n",i,k);
+ }
+ printf("\ndone ...\n");
+ }
+