First, Thank you for your answers.
I using the following code to try simply decode a flac file and write the
decoded data raw PCM file. The resulting file is just noise and pops, so is
the decoded data in a different format than PCM?
struct flacData {
FILE *inputFile;
FILE *outputFile;
char *filename;
};
FLAC__StreamDecoderReadStatus flac_DecoderReadCallback(const
FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void
*client_data)
{
flacData *ourData = (flacData *)client_data;
*bytes = fread((void *)buffer, 1, *bytes, ourData->inputFile);
return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
};
FLAC__StreamDecoderWriteStatus flac_DecoderWriteCallback(const
FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32
*const buffer[], void *client_data)
{
flacData *ourData = (flacData *)client_data;
for(int current_sample = 0; current_sample < frame->header.blocksize;
current_sample++)
{
for(int channel = 0; channel < frame->header.channels; channel++)
{
fwrite((void *)&buffer[channel][current_sample], 1, 1,
ourData->outputFile);
}
}
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
};
void flac_DecoderMetaDataCallback(const FLAC__StreamDecoder *decoder, const
FLAC__StreamMetadata *metadata, void *client_data)
{
flacData *ourData = (flacData *)client_data;
};
void flac_DecoderErrorCallback(const FLAC__StreamDecoder *decoder,
FLAC__StreamDecoderErrorStatus status, void *client_data)
{
flacData *ourData = (flacData *)client_data;
};
int main(int argc, char* argv[])
{
//Create the FLAC stream decoder
FLAC__StreamDecoder *flac_file = FLAC__stream_decoder_new();
//Setup the callbacks
FLAC__stream_decoder_set_read_callback(flac_file,
(FLAC__StreamDecoderReadCallback)flac_DecoderReadCallback);
FLAC__stream_decoder_set_write_callback(flac_file,
(FLAC__StreamDecoderWriteCallback)flac_DecoderWriteCallback);
FLAC__stream_decoder_set_metadata_callback(flac_file,
(FLAC__StreamDecoderMetadataCallback)flac_DecoderMetaDataCallback);
FLAC__stream_decoder_set_error_callback(flac_file,
(FLAC__StreamDecoderErrorCallback)flac_DecoderErrorCallback);
//Set our data up
flacData *flacObjData = new flacData;
flacObjData->filename = "C:\\My Music\\44.1Hz Stereo PCM_5.flac";
flacObjData->inputFile = fopen(flacObjData->filename, "rb");
flacObjData->outputFile = fopen("test.raw", "wb");
FLAC__stream_decoder_set_client_data(flac_file, (void *)flacObjData);
//Init the decoder
FLAC__stream_decoder_init(flac_file);
//Start decoding, the callbacks do all the work from here
FLAC__stream_decoder_process_until_end_of_stream(flac_file);
return 0;
}
----- Original Message -----
From: "Josh Coalson" <xflac@yahoo.com>
To: "Jory" <jcsston@ToughGuy.net>;
<flac-dev@lists.sourceforge.net>
Cc: <Matroska-devel@lists.matroska.org>
Sent: Tuesday, July 08, 2003 5:02 PM
Subject: Re: [Flac-dev] Storing FLAC in Matroska
> --- Jory <jcsston@ToughGuy.net> wrote:
> > Hello,
> > I'm looking into storing FLAC audio in Matroska and I have a
few
> > questions.
> >
> > 1. Can I use libflac to extract the compressed frames?
> > Or will I need to write up a simple file parser?
>
> I'm not sure I understand your question, but one unfortunate
> fact about native FLAC is that you cannot discover the frame
> boundaries without decoding. But you can decode a file, and
> after each frame get the current stream position from the
> decoder, which will tell you where to chop the original stream.
> See the source for metaflac for an example, where it uses this
> method to add seekpoints to a seektable.
>
> > 2. What is required to decode the frames?
> > From the docs I understand that you need the FRAME and you may need
> > the
> > METADATA_BLOCK.
>
> If it is in the streamable subset, you need only what's in the
> frames. If not, you may need some numbers from the STREAMINFO
> metadata block. Search for 'subset' on
> http://flac.sourceforge.net/format.html
>
> Josh
>
>
> __________________________________
> Do you Yahoo!?
> SBC Yahoo! DSL - Now only $29.95 per month!
> http://sbc.yahoo.com