static GslErrorType wave_handle_open (GslDataHandle *data_handle, GslDataHandleSetup *setup) { WaveHandle *whandle = (WaveHandle*) data_handle; whandle->hfile = gsl_hfile_open (whandle->dhandle.name); if (!whandle->hfile) return gsl_error_from_errno (errno, GSL_ERROR_OPEN_FAILED); else { GslLong l, fwidth = wave_format_byte_width (whandle->format); /* convert size into n_values, i.e. float length */ l = whandle->hfile->n_bytes; l -= MIN (l, whandle->byte_offset); if (l >= fwidth) { l /= fwidth; if (whandle->requested_length < 0) setup->n_values = l; else setup->n_values = MIN (l, whandle->requested_length); } else setup->n_values = 0; setup->n_channels = whandle->n_channels; setup->bit_depth = wave_format_bit_depth (whandle->format); return GSL_ERROR_NONE; } }
/** * @param file_name name of the file to open * @return a new opened #GslRFile or NULL if an error occoured (errno set) * * Open a file for reading and create a GSL read only file handle for it. * The motivation for using a #GslRFile over normal unix files * is to reduce the amount of opened unix file descriptors by using * a #GslHFile for the actual IO. */ GslRFile* gsl_rfile_open (const gchar *file_name) { GslHFile *hfile = gsl_hfile_open (file_name); GslRFile *rfile; if (!hfile) rfile = NULL; else { rfile = sfi_new_struct0 (GslRFile, 1); rfile->hfile = hfile; rfile->offset = 0; } return rfile; }