void write_wav_file(char *filename, index_t n_frames, int n_channels, double sampling_rate, sample_t *samples) { SF_INFO outfile_info; outfile_info.samplerate = sampling_rate; outfile_info.channels = n_channels; outfile_info.format = SF_FORMAT_WAV|SF_FORMAT_PCM_16; SNDFILE *outfile; if (!(outfile = sf_open(filename, SFM_WRITE, &outfile_info))) sdie(NULL, "can not open output file %s: ", filename); sf_count_t count; if ((count = SF_WRITEF_SAMPLE_T(outfile, samples, n_frames)) != n_frames) sdie(outfile, "sf_writef_double returned %d (expected %d): ", count, n_frames); sf_close(outfile); }
void soundfile_write_header(soundfile_t *sf, void *header, int h_size) { dp(30, "sf=%p header=%p h_size=%d\n", sf, header, h_size); if (sf->t == sft_wavpack) { WavpackContext *wpc = sf->p; if (!WavpackAddWrapper(wpc, header, h_size)) { sdie(sf->p, "error adding header to wavpack: %s\n", WavpackGetErrorMessage(wpc)); } } else if (sf->t == sft_libsndfile) { sdie(sf->p, "can't add header to sndfile with this function"); } else { sdie(sf->p, "can't yet add header to %d type files", sf->t); } }
double * read_sound_file_double(char *filename, index_t *n_frames, int *n_channels, double *sampling_rate) { SF_INFO infile_info = {0}; SNDFILE *infile = sf_open(filename, SFM_READ, &infile_info); if (!infile) sdie(NULL, "can not open input file %s: ", filename) ; *n_frames = infile_info.frames; *n_channels = infile_info.channels; *sampling_rate = infile_info.samplerate; double *d = salloc(*n_frames**n_channels*sizeof d[0]); if (sf_readf_double(infile, d, *n_frames) != *n_frames) die("sf_readf_double returned insufficient frames"); sf_close(infile); return d; }
void soundfile_write_double(soundfile_t *sf, double *buffer, index_t n_frames) { if (sf->t == sft_libsndfile) { sf_count_t count; if ((count = sf_writef_double(sf->p, buffer, n_frames)) != n_frames) sdie(sf->p, "sf_writef_double returned %d (expected %d): ", count, n_frames); } else { WavpackContext *wpc = sf->p; int32_t sample_buffer[n_frames*sf->channels]; for (int i = 0; i < 10; i++) dp(30, "buffer[%d]=%g\n", i, (double)buffer[i]); double multiplier = 1L << (sf->bits_per_sample - 1); for (int i = 0; i < n_frames*sf->channels; i++) sample_buffer[i] = multiplier*buffer[i]; // FIXME may overflow buffer[1] == 1 if (!WavpackPackSamples(sf->p, sample_buffer, n_frames)) die("WavpackPackSamples failed: %s\n", WavpackGetErrorMessage(wpc)); } }
int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *frame; GtkWidget *board; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Skyline"); g_signal_connect(window, "destroy", G_CALLBACK(close_window), NULL); gtk_container_set_border_width(GTK_CONTAINER(window), 8); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(window), frame); board = gtk_drawing_area_new(); /* set a minimum size */ gtk_widget_set_size_request(board, 800, 600); gtk_container_add(GTK_CONTAINER(frame), board); /* Signals used to handle the backing surface */ g_signal_connect(board, "draw", G_CALLBACK(draw_handler), NULL); g_signal_connect(board, "configure-event", G_CALLBACK(configure_event_handler), NULL); /* Event signals */ g_signal_connect(board, "button-press-event", G_CALLBACK(button_press_event_handler), NULL); /* * Ask to receive events the drawing area doesn't normally * subscribe to. In particular, we need to ask for the * button press and motion notify events that want to handle. */ gtk_widget_set_events(board, gtk_widget_get_events(board) | GDK_BUTTON_PRESS_MASK); GtkWidget *file_open; GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN; int res; file_open = gtk_file_chooser_dialog_new("Input File", NULL, action, "Cancel", GTK_RESPONSE_CANCEL, "Open", GTK_RESPONSE_ACCEPT, NULL); res = gtk_dialog_run(GTK_DIALOG(file_open)); if (res == GTK_RESPONSE_ACCEPT) { char *filename; GtkFileChooser *chooser = GTK_FILE_CHOOSER(file_open); filename = gtk_file_chooser_get_filename(chooser); int i = 0; FILE *file = NULL; file = fopen(filename, "r"); if (!file) sdie("fopen()"); fscanf(file, "%d", &number); buildings = malloc(sizeof(struct building) * number); for (i = 0; i < number; i++) { int start, end; double height; fscanf(file, "%d %d %lg", &start, &end, &height); buildings[i].height = height; buildings[i].start_point = start; buildings[i].end_point = end; } fclose(file); g_free(filename); } else { udie("Plese enter input filename"); } gtk_widget_destroy(file_open); GtkWidget *file_save; GtkFileChooser *chooser; action = GTK_FILE_CHOOSER_ACTION_SAVE; file_save = gtk_file_chooser_dialog_new("Output File", NULL, action, "Cancel", GTK_RESPONSE_CANCEL, "Save", GTK_RESPONSE_ACCEPT, NULL); chooser = GTK_FILE_CHOOSER(file_save); gtk_file_chooser_set_do_overwrite_confirmation(chooser, TRUE); res = gtk_dialog_run(GTK_DIALOG(file_save)); if (res == GTK_RESPONSE_ACCEPT) { char *filename; filename = gtk_file_chooser_get_filename(chooser); int i = 0; FILE *file = NULL; file = fopen(filename, "w"); if (!file) sdie("fopen()"); skyliner(buildings, number, &buildings_out, &number_out); fprintf(file, "%d\n", number_out); for (i = 0; i < number_out; i++) fprintf(file, "%d %lg\n", buildings_out[i].start_point, buildings_out[i].height); fclose(file); g_free (filename); } else { udie("Please enter output filename"); } gtk_widget_destroy(file_save); gtk_widget_show_all(window); gtk_main(); return 0; }