fa_pair_t fa_buffer_unzip(fa_buffer_t buffer) { size_t sz = fa_buffer_size(buffer); fa_buffer_t buffer1 = fa_buffer_create(sz/2); fa_buffer_t buffer2 = fa_buffer_create(sz/2); for (int i = 0; i < (sz/2); ++i) { buffer1->data[i] = buffer->data[i*2+0]; } for (int i = 0; i < (sz/2); ++i) { buffer2->data[i] = buffer->data[i*2+1]; } return fa_pair_create(buffer1, buffer2); }
fa_buffer_t fa_buffer_zip(fa_buffer_t buffer1, fa_buffer_t buffer2) { size_t sz = SIZE_MIN(fa_buffer_size(buffer1), fa_buffer_size(buffer2)); fa_buffer_t buffer = fa_buffer_create(sz*2); for (int i = 0; i < sz; ++i) { buffer->data[i*2+0] = buffer1->data[i]; buffer->data[i*2+1] = buffer2->data[i]; } return buffer; }
fa_buffer_t fa_buffer_resample_mono(double new_rate, fa_buffer_t buffer) { size_t old_size = fa_buffer_size(buffer); double old_rate = fa_peek_int32(fa_buffer_get_meta(buffer, fa_string("sample-rate"))); size_t new_size = ((double) old_size) * (new_rate / old_rate); fa_buffer_t buffer2 = fa_buffer_create(new_size); resample_raw(old_rate, new_rate, (double*) buffer->data, old_size / sizeof(double), (double*) buffer2->data, new_size / sizeof(double)); buffer2->destroy_function = buffer->destroy_function; buffer2->destroy_data = buffer->destroy_data; buffer2->meta = fa_copy(buffer->meta); fa_buffer_set_meta(buffer, fa_string("sample-rate"), fa_from_int32(new_rate)); return buffer2; }
fa_with_faudio() { fa_io_filter_t filter = fa_io_create_test_filter(); fa_io_sink_t sink = (fa_io_sink_t) filter; for (int i = 0; i < 3; ++i) { fa_buffer_t buf = fa_buffer_create(3); fa_buffer_set(buf, 0, 1); fa_buffer_set(buf, 0, 2); fa_buffer_set(buf, 0, 3); fa_io_push(sink, buf); } // fa_io_run( // fa_io_standard_in(), // fa_io_coapply(fa_io_split(sink), fa_io_standard_out()) // ); }
fa_pair_t fa_buffer_read_audio(fa_string_t path) { int channels; buffer_t buffer; SNDFILE *file; SF_INFO info; info.format = 0; { char *cpath = fa_string_to_utf8(path); //file = sf_open(cpath, SFM_READ, &info); // if (sf_error(file)) { // char err[100]; // snprintf(err, 100, "Could not read audio file '%s'", cpath); // return (pair_t) fa_error_create_simple(error, string(err), string("Doremir.Buffer")); // } inform(string_append(string("Reading "), path)); } { size_t bufSize = info.frames * info.channels * sizeof(double); buffer = fa_buffer_create(bufSize); double *raw = fa_buffer_unsafe_address(buffer); //sf_count_t sz = sf_read_double(file, raw, bufSize / sizeof(double)); //buffer = fa_buffer_dresize(sz * sizeof(double), buffer); if (info.channels == 1) { channels = 1; } else if (info.channels == 2) { channels = 2; } else { buffer_fatal("Unknown buffer type", info.channels); } // if (sf_close(file)) { // return (pair_t) fa_error_create_simple(error, string("Could not close"), string("Doremir.Buffer")); // } } return pair(i32(channels), buffer); }