John Steele Scott
2004-Sep-10 16:45 UTC
[Flac-dev] FLAC++ SeekableStream write_callback not being called?
-----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-----
Josh Coalson
2004-Sep-10 16:45 UTC
[Flac-dev] FLAC++ SeekableStream write_callback not being called?
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@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
John Steele Scott
2004-Sep-10 16:45 UTC
[Flac-dev] FLAC++ SeekableStream write_callback not being called?
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On Thu, 27 Nov 2003 04:59, you wrote:> 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, Thanks for your reply. It turns out that the problem was due to finish() inadvertently being called on the stream prior to process_single(). It works fine now. 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! iD8DBQE/xsgg0BW7kPcXjRURAmbrAKDzS8CX75tLe0Slw+FkQESfKwifmwCgoXdZ xcLo4S+r5EN1fb79H+joBuY=X/Tf -----END PGP SIGNATURE-----
Possibly Parallel Threads
- FLAC++ SeekableStream write_callback not being called?
- [LLVMdev] SmallString + raw_svector_ostream combination should be more efficient
- [LLVMdev] SmallString + raw_svector_ostream combination should be more efficient
- [LLVMdev] SmallString + raw_svector_ostream combination should be more efficient
- Syslinux 2.11 and gcc 3.4.1