Exemple #1
0
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);
}
Exemple #2
0
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);
	}
}
Exemple #3
0
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;
}
Exemple #4
0
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));
	}
}
Exemple #5
0
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;
}