diff --git a/i_sndfile/i_sndfile.cpp b/i_sndfile/i_sndfile.cpp index a51bb12d90c178826976e4280bfd77ae6ddd4502..516e599513ade85cc3cbd4d7f9b7332a02146104 100644 --- a/i_sndfile/i_sndfile.cpp +++ b/i_sndfile/i_sndfile.cpp @@ -8,15 +8,16 @@ int main(int argc, char**argv){ blc_channel output; - char const *filename, *output_name, *type_str, *length_str, *period_str, *samplerate_str, *iterations_nb_str; - int period, samplerate, iterations_nb; + char const *filename, *iterations_nb_str, *length_str, *output_name, *period_str, *samplerate_str, *seek_pos_str, *type_str; + int iterations_nb, period, samplerate; size_t length; uint32_t type; SF_INFO sfinfo; SNDFILE *sndfile; - sf_count_t read_items_nb; - + sf_count_t read_items_nb, seek_pos; + blc_program_set_description("Record blc_channel input in a sound file"); + blc_program_add_option(&seek_pos_str, 'b', "begin", "integer", "Sample to begin at in the file (i.e. sample at which we should begin reading the file)", "0"); blc_program_add_option(&filename, 'f', "file", "string", "filename of the file to write", NULL); blc_program_add_option(&iterations_nb_str, 'n', "number", "integer", "number of samples to acquire (-1 for infinity)", "-1"); blc_program_add_option(&output_name, 'o', "output", "string", "Channel where to put the sound", DEFAULT_OUTPUT_NAME); @@ -26,34 +27,39 @@ int main(int argc, char**argv){ blc_program_add_option(&type_str, 't', "type", "INT8|FL32", "Type of the data.", "FL32"); blc_program_init(&argc, &argv, blc_quit); blc_command_forward_blc_channels(); - + SSCANF(1, samplerate_str, "%d", &samplerate); if (filename==NULL){ - blc_program_args_display_help(); - EXIT_ON_ERROR("You need to specify a filename: -f<filename>"); + blc_program_args_display_help(); + EXIT_ON_ERROR("You need to specify a filename: -f<filename>"); } type=STRING_TO_UINT32(type_str); if (sscanf(length_str, "%ld", &length)!=1) EXIT_ON_ERROR("Reading size '%s'", length_str); if (sscanf(period_str, "%d", &period)!=1) EXIT_ON_ERROR("Reading period in '%s'", period_str); - + + iterations_nb=strtol(iterations_nb_str, NULL, 10); + seek_pos=strtol(seek_pos_str, NULL, 10); + if (strcmp(DEFAULT_OUTPUT_NAME, output_name)==0) asprintf((char**)&output_name, ":sound%d", getpid()); output.create_or_open(output_name, BLC_CHANNEL_WRITE, type, 'LPCM', 1, length); output.publish(); - + CLEAR(sfinfo); sndfile=sf_open(filename, SFM_READ, &sfinfo); // if (sfinfo.format!=samplerate) EXIT_ON_ERROR("The file has been recorded with a samplerate of '%d' and you request '%d'", sfinfo.samplerate, samplerate); if (sndfile==NULL) EXIT_ON_ERROR("Opening '%s'. libsndfile: '%s'", filename, sf_strerror(NULL)); - + + if (sf_seek(sndfile, length*seek_pos, SEEK_CUR) == -1) EXIT_ON_ERROR("Seeking position %i before start or after end of file. libsndfile: '%s'", length*seek_pos, sf_strerror(NULL)); + blc_loop_try_add_waiting_semaphore(output.sem_ack_data); blc_loop_try_add_posting_semaphore(output.sem_new_data); BLC_COMMAND_LOOP(period*1000){ - if (iterations_nb==blc_loop_iteration) blc_command_ask_quit(); + if (iterations_nb==blc_loop_iteration) blc_command_ask_quit(); read_items_nb=sf_read_float(sndfile, output.floats, output.total_length); if (read_items_nb!=output.total_length) { color_eprintf(BLC_YELLOW, "%s: Iteration %llu: Missing data. Read '%lld' items instead of '%ld'. It is probably the end of the file\n", blc_program_name, blc_loop_iteration, read_items_nb, output.total_length); @@ -61,7 +67,7 @@ int main(int argc, char**argv){ break; } } - + sf_close(sndfile); return EXIT_SUCCESS; } diff --git a/o_sndfile/o_sndfile.cpp b/o_sndfile/o_sndfile.cpp index 87af16424d6ab880f44ee281c37560c58d941575..5187ea16f27e57170e9e36928da903e08a0eeee0 100644 --- a/o_sndfile/o_sndfile.cpp +++ b/o_sndfile/o_sndfile.cpp @@ -6,20 +6,21 @@ int main(int argc, char**argv){ blc_channel input; - char const *filename, *input_name, *samplerate_str, *output_length_str; + char const *filename, *input_name, *samplerate_str, *output_length_str, *iterations_nb_str; SF_INFO sfinfo; SNDFILE *sndfile; sf_count_t write_items_nb; - int samplerate, length; - + int samplerate, length, iterations_nb; + blc_program_set_description("Save the data from blc_channel in a sound file (wav, ogg, ...)"); blc_program_add_option(&filename, 'f', "file", "filename", "filename of the file to write", NULL); + blc_program_add_option(&iterations_nb_str, 'n', "number", "integer", "number of samples to acquire (-1 for infinity)", "-1"); blc_program_add_option(&output_length_str, 's', "size", "integer", "items nb in buffer", "4096"); blc_program_add_option(&samplerate_str, 'S', "samplerate", "integer", "frequency of sampling", "44100"); blc_program_add_parameter(&input_name, "blc_channel-in", 1, "blc channel containing the sound to record", NULL); blc_program_init(&argc, &argv, blc_quit); blc_command_forward_blc_channels(); - + SSCANF(1, samplerate_str, "%d", &samplerate); SSCANF(1, output_length_str, "%d", &length); @@ -28,25 +29,28 @@ int main(int argc, char**argv){ color_eprintf(BLC_RED, "You need to set a filename with option --file=\n"); exit(1); } - + + iterations_nb=strtol(iterations_nb_str, NULL, 10); + input.open(input_name, BLC_CHANNEL_READ); CLEAR(sfinfo); sfinfo.format=SF_FORMAT_WAV | SF_FORMAT_FLOAT; sfinfo.channels=1; sfinfo.samplerate=samplerate; - + sndfile=sf_open(filename, SFM_WRITE, &sfinfo); if (sndfile==NULL) EXIT_ON_ERROR("Opening '%s'. libsndfile: '%s'", filename, sf_strerror(NULL)); - + blc_loop_try_add_waiting_semaphore(input.sem_new_data); blc_loop_try_add_posting_semaphore(input.sem_ack_data); BLC_COMMAND_LOOP(0){ + if (iterations_nb==blc_loop_iteration) blc_command_ask_quit(); write_items_nb=sf_write_float(sndfile, input.floats, input.total_length); if (write_items_nb!=input.total_length) EXIT_ON_ERROR("Iteration %d: Missing data. Read '%d' items instead of '%d'", blc_loop_iteration, write_items_nb, input.total_length); } - + sf_close(sndfile); return EXIT_SUCCESS; }