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-----
Maybe Matching 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