int FlacDecoder_init(decoders_FlacDecoder *self, PyObject *args, PyObject *kwds) { char* filename; int stream_offset = 0; self->filename = NULL; self->file = NULL; self->bitstream = NULL; self->seektable = array_o_new((ARRAY_COPY_FUNC)seekpoint_copy, free, NULL); self->subframe_data = array_ia_new(); self->residuals = array_i_new(); self->qlp_coeffs = array_i_new(); self->framelist_data = array_i_new(); self->audiotools_pcm = NULL; self->remaining_samples = 0; if (!PyArg_ParseTuple(args, "si|i", &filename, &(self->channel_mask), &stream_offset)) return -1; if (self->channel_mask < 0) { PyErr_SetString(PyExc_ValueError, "channel_mask must be >= 0"); return -1; } if (stream_offset < 0) { PyErr_SetString(PyExc_ValueError, "stream offset must be >= 0"); return -1; } /*open the flac file*/ self->file = fopen(filename, "rb"); if (self->file == NULL) { PyErr_SetFromErrnoWithFilename(PyExc_IOError, filename); return -1; } else { self->bitstream = br_open(self->file, BS_BIG_ENDIAN); } /*skip the given number of bytes, if any*/ if (stream_offset != 0) fseek(self->file, stream_offset, SEEK_SET); self->filename = strdup(filename); /*read the STREAMINFO block, SEEKTABLE block and setup the total number of samples to read*/ if (flacdec_read_metadata(self->bitstream, &(self->streaminfo), self->seektable)) { self->streaminfo.channels = 0; return -1; } self->remaining_samples = self->streaminfo.total_samples; /*initialize the output MD5 sum*/ audiotools__MD5Init(&(self->md5)); self->perform_validation = 1; self->stream_finalized = 0; /*setup a framelist generator function*/ if ((self->audiotools_pcm = open_audiotools_pcm()) == NULL) return -1; /*place mark at beginning of stream in case seeking is needed*/ self->bitstream->mark(self->bitstream); /*mark stream as not closed and ready for reading*/ self->closed = 0; return 0; }
int FlacDecoder_init(decoders_FlacDecoder *self, PyObject *args, PyObject *kwds) { self->file = NULL; self->bitstream = NULL; self->seektable = a_obj_new((ARRAY_COPY_FUNC)seekpoint_copy, free, NULL); self->subframe_data = aa_int_new(); self->residuals = a_int_new(); self->qlp_coeffs = a_int_new(); self->framelist_data = a_int_new(); self->audiotools_pcm = NULL; self->remaining_samples = 0; if (!PyArg_ParseTuple(args, "O", &self->file)) { return -1; } else { Py_INCREF(self->file); } /*open BitstreamReader from FLAC file stream based on whether it's a low-level file object*/ if (PyFile_Check(self->file)) { /*open bitstream through file object*/ self->bitstream = br_open(PyFile_AsFile(self->file), BS_BIG_ENDIAN); } else { /*treat file as Python-implemented file-like object*/ self->bitstream = br_open_external( self->file, BS_BIG_ENDIAN, 4096, (ext_read_f)br_read_python, (ext_close_f)bs_close_python, (ext_free_f)bs_free_python_nodecref); } /*read the STREAMINFO block, SEEKTABLE block and setup the total number of samples to read*/ if (flacdec_read_metadata(self->bitstream, &(self->streaminfo), self->seektable, &(self->channel_mask))) { self->streaminfo.channels = 0; return -1; } if (PyFile_Check(self->file)) { /*place mark at beginning of stream but after metadata in case seeking is needed*/ self->bitstream->mark(self->bitstream); } self->remaining_samples = self->streaminfo.total_samples; /*initialize the output MD5 sum*/ audiotools__MD5Init(&(self->md5)); self->perform_validation = 1; self->stream_finalized = 0; /*setup a framelist generator function*/ if ((self->audiotools_pcm = open_audiotools_pcm()) == NULL) return -1; /*mark stream as not closed and ready for reading*/ self->closed = 0; return 0; }