[Flac-dev] FLAC++ SeekableStream write_callback not being called?

Josh Coalson xflac at yahoo.com
Wed Nov 26 10:34:12 PST 2003


I'll have to see the whole class definition to tell what's
wrong; nothing below looks wrong.

the unit tests (see src/test_libFLAC++/) have some examples
and the write callbacks do get called.

Josh

--- John Steele Scott <toojays at toojays.net> wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> Hi,
> 
> I am trying to create a FLAC plugin for the K3b CD burning program.
> To do this 
> I have subclassed the FLAC::Decoder::SeekableStream class. I can
> obtain the 
> vorbiscomment data using set_metadata_respond,
> process_until_end_of_metadata 
> and the metadata_callback, however I cannot decode the audio data. It
> seems 
> to me as though the write_callback is never actually being called.
> 
> Before I pepper my code with a bazillion trace statements, can anyone
> tell me 
> if there is some obvious "trick-for-new-players" which I might have
> missed?
> 
> My write_callback looks like:
> 
> ::FLAC__StreamDecoderWriteStatus 
> K3bFLACDecoder::Private::write_callback(const ::FLAC__Frame *frame,
> const 
> FLAC__int32 * const buffer[]) {
>   int i;
>   // Note that in canDecode we made sure that the input is only 16
> bit stereo.
>   int samples = frame->header.blocksize;
> 
>   internalBuffer = new QBuffer();
>   internalBuffer->open(IO_ReadWrite);
>   for(i=0; i < samples; i++) {
>     internalBuffer->putch(buffer[i][0] >> 8); // msb left
>     internalBuffer->putch(buffer[i][0] & 0xFF); // lsb left
>     internalBuffer->putch(buffer[i][1] >> 8); // msb right
>     internalBuffer->putch(buffer[i][1] & 0xFF); // lsb right
>   }
> 
>   // Rewind the buffer so the decode method will take data from the
> beginning.
>   internalBuffer->at(0);
>   
>   return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
> }
> 
> And the code which I expect to have call it is (where "d" is an
> instance of my 
> K3bFLACDecoder::Private class) :
> 
>   if(d->internalBuffer == 0) {
>     if(d->get_state() == FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM)
> {
>       // Nothing left to do.
>       return 0;
>     } else {
>       // Get some more data into our internal buffer.
>       d->process_single();
>     }
>   }
> 
> Yet my internalBuffer is never initialised. I have also tried to
> have:
> 
>  while(d->internalBuffer==0)
>    d->process_single();
> 
> but this only results in an infinite loop. I get similarly depressing
> results 
> from process_until_end_of_stream.
> 
> Any suggestions would be appreciated.
> 
> cheers,
> 
> John
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.2.3 (GNU/Linux)
> Comment: Messages with missing or bad signatures may have been forged
> or modified in transit!
> 
> iD4DBQE/wzVt0BW7kPcXjRURAnDiAJdiJYF1mt4wN2gmcMb0llxOPswGAKCNgjia
> CYbQZiiUZzRPR69XrXMdAQ==
> =wufc
> -----END PGP SIGNATURE-----


__________________________________
Do you Yahoo!?
Protect your identity with Yahoo! Mail AddressGuard
http://antispam.yahoo.com/whatsnewfree




More information about the Flac-dev mailing list