/* Prepares custom IO for custom Opus, that is converted to Ogg Opus on the fly */ static STREAMFILE* setup_opus_streamfile(STREAMFILE *streamFile, int channels, int skip, int sample_rate, off_t stream_offset, size_t stream_size, opus_type_t type) { STREAMFILE *temp_streamFile = NULL, *new_streamFile = NULL; opus_io_data io_data = {0}; size_t io_data_size = sizeof(opus_io_data); io_data.type = type; io_data.stream_offset = stream_offset; io_data.stream_size = stream_size; io_data.physical_offset = stream_offset; io_data.head_size = make_oggs_first(io_data.head_buffer, sizeof(io_data.head_buffer), channels, skip, sample_rate); if (!io_data.head_size) goto fail; io_data.sequence = 2; io_data.logical_size = opus_io_size(streamFile, &io_data); /* force init */ /* setup subfile */ new_streamFile = open_wrap_streamfile(streamFile); if (!new_streamFile) goto fail; temp_streamFile = new_streamFile; new_streamFile = open_io_streamfile(temp_streamFile, &io_data,io_data_size, opus_io_read,opus_io_size); if (!new_streamFile) goto fail; temp_streamFile = new_streamFile; new_streamFile = open_buffer_streamfile(new_streamFile,0); if (!new_streamFile) goto fail; temp_streamFile = new_streamFile; return temp_streamFile; fail: close_streamfile(temp_streamFile); return NULL; }
static STREAMFILE *buffer_open(BUFFER_STREAMFILE *streamfile, const char * const filename, size_t buffersize) { STREAMFILE *new_inner_sf = streamfile->inner_sf->open(streamfile->inner_sf,filename,buffersize); return open_buffer_streamfile(new_inner_sf, buffersize); /* original buffer size is preferable? */ }