diff --git a/csdr.c b/csdr.c index 922dcf7ef0b54510b850d91df1dfac6f3bae34f6..1f10e2642b645d0eda085c0f6650cd52b31ca1bf 100644 --- a/csdr.c +++ b/csdr.c @@ -109,6 +109,7 @@ char usage[]= int env_csdr_fixed_bufsize = 1024; int env_csdr_fixed_big_bufsize = 1024*16; int env_csdr_dynamic_bufsize_on = 0; +int env_csdr_print_bufsizes = 0; int bigbufs = 0; //change on on 2015-08-29: we don't yield at all. fread() will do it if it blocks @@ -248,7 +249,7 @@ int initialize_buffers() { if(!(the_bufsize=getbufsize())) return 0; the_bufsize=unitround(the_bufsize); - fprintf(stderr,"%s %s: buffer size set to %d\n",argv_global[0], argv_global[1], the_bufsize); + if(env_csdr_print_bufsizes) fprintf(stderr,"%s %s: buffer size set to %d\n",argv_global[0], argv_global[1], the_bufsize); input_buffer = (float*) malloc(the_bufsize*sizeof(float) * 2); //need the 2× because we might also put complex floats into it output_buffer = (float*) malloc(the_bufsize*sizeof(float) * 2); buffer_u8 = (unsigned char*)malloc(the_bufsize*sizeof(unsigned char)); @@ -262,7 +263,7 @@ int sendbufsize(int size) //The first word is a preamble, "csdr". //If the next csdr process detects it, sets the buffer size according to the second word if(!env_csdr_dynamic_bufsize_on) return env_csdr_fixed_bufsize; - fprintf(stderr,"%s %s: next process proposed input buffer size is %d\n",argv_global[0], argv_global[1], size); + if(env_csdr_print_bufsizes) fprintf(stderr,"%s %s: next process proposed input buffer size is %d\n",argv_global[0], argv_global[1], size); int send_first[2]; memcpy((char*)send_first, SETBUF_PREAMBLE, 4*sizeof(char)); send_first[1] = size; @@ -288,6 +289,11 @@ int parse_env() env_csdr_fixed_bufsize = atoi(envtmp); } } + envtmp=getenv("CSDR_PRINT_BUFSIZES"); + if(envtmp) + { + env_csdr_print_bufsizes = atoi(envtmp); + } } int main(int argc, char *argv[]) @@ -299,7 +305,7 @@ int main(int argc, char *argv[]) fcntl(STDIN_FILENO, F_SETPIPE_SZ, 65536*32); fcntl(STDOUT_FILENO, F_SETPIPE_SZ, 65536*32); - fprintf(stderr, "csdr: F_SETPIPE_SZ\n"); + //fprintf(stderr, "csdr: F_SETPIPE_SZ\n"); if(!strcmp(argv[1],"setbuf")) { @@ -1534,6 +1540,9 @@ int main(int argc, char *argv[]) if(!strcmp(argv[1],"dsb_fc")) { + float q_value = 0; + if(argc>=3) sscanf(argv[2],"%g",&q_value); + if(!sendbufsize(initialize_buffers())) return -2; for(;;) { @@ -1542,13 +1551,38 @@ int main(int argc, char *argv[]) for(int i=0;i<the_bufsize;i++) { iof(output_buffer,i)=input_buffer[i]; - qof(output_buffer,i)=0; + qof(output_buffer,i)=q_value; } FWRITE_C; TRY_YIELD; } } + if(!strcmp(argv[1],"convert_f_samplerf")) + { + if(argc<=2) return badsyntax("need required parameter (wait_for_this_sample)"); + + unsigned wait_for_this_sample; + sscanf(argv[2],"%u",&wait_for_this_sample); + + if(!sendbufsize(initialize_buffers())) return -2; + unsigned char* samplerf_buf = (unsigned char*) malloc(16*the_bufsize); + for(;;) + { + FEOF_CHECK; + FREAD_R; + for(int i=0;i<the_bufsize;i++) + { + *((double*)(&samplerf_buf[16*i])) = input_buffer[i]; + *((unsigned*)(&samplerf_buf[16*i+8])) = wait_for_this_sample; + *((unsigned*)(&samplerf_buf[16*i+12])) = 0; + + } + fwrite(samplerf_buf, 16, the_bufsize, stdout); + TRY_YIELD; + } + } + if(!strcmp(argv[1],"add_dcoffset_cc")) { if(!sendbufsize(initialize_buffers())) return -2; @@ -1578,7 +1612,7 @@ int main(int argc, char *argv[]) if(!strcmp(argv[1],"fixed_amplitude_cc")) { - if(argc<=2) return badsyntax("need required parameters (new_amplitude)"); + if(argc<=2) return badsyntax("need required parameter (new_amplitude)"); float new_amplitude; sscanf(argv[2],"%g",&new_amplitude); @@ -1594,6 +1628,24 @@ int main(int argc, char *argv[]) } } + if(!strcmp(argv[1],"mono2stereo_i16")) + { + if(!sendbufsize(initialize_buffers())) return -2; + float last_phase = 0; + for(;;) + { + FEOF_CHECK; + fread (input_buffer, sizeof(short), the_bufsize, stdin); + for(int i=0;i<the_bufsize;i++) + { + *(((short*)output_buffer)+2*i)=*(((short*)input_buffer)+i); + *(((short*)output_buffer)+2*i+1)=*(((short*)input_buffer)+i); + } + fwrite (output_buffer, sizeof(short)*2, the_bufsize, stdout); + TRY_YIELD; + } + } + if(!strcmp(argv[1],"none")) { return 0;