On Sat, Nov 05, 2005 at 03:47:27PM -0800, Robert Hui wrote:
> I'm very new to Ogg, and am learning about it in an attempt to stream
it
> from a CF card through a microcontroller. This particular setup requires
> me to move parts of the file from the CF card to the microcontroller
> buffer, effectively making the file like a data stream. Also, should this
> question be directed at the Tremor group instead since that is the codec
> I'm using? It seems like a generic Vorbis question, versus something
> specific to Tremor.
This is usually a better place to ask general questions.
> My question is this: As far as ov_open_callbacks(..) is concerned, is the
> *datasource parameter expecting a pointer to part of an Ogg file
> (specifically, the beginning where I assume the Ogg identifying info is
> placed). And if this is the case, can I assume that bringing the Ogg file
> in piece-meal fashion only requires a change to the way ov_read(..) will
> handle not having enough data to decode a single Ogg page (i.e. - if the
> remaining data to be decoded is >1 Ogg page)? Note that I do not need
the
> ability to seek in this file, only play back the file.
The datasource parameter is treated as opaque by the vorbisfile api,
and has nothing in particular to do with the Ogg data your callbacks
return. The idea is that you pass it a private data reference which it
in turn passes to your callback functions so you can deference and look
up whatever you need to about the stream state. It is designed so you
can pass a FILE* as the datasource and use the normal C stdio functions
as the callbacks (in fact, this is how ov_open() is implemented
internally) but as long as your callbacks return the stream as expected
you can do whatever you want.
That is, your read callback should start feeding the decoder data
starting at the beginning of the Ogg stream as it's read off the CF
storage, and feed the stream in contiguous pieces after that, but
returning less than the requested number of bytes is fine; the decoder
will just keep pulling until it has enough input to generate some
output. If you don't have any of the stream available you should block
though, since returning zero bytes indicates end-of-data or a read error
depending on whether errno is set.
See http://xiph.org/vorbis/doc/vorbisfile/callbacks.html for details on
what the decoder expects.
Hope that helps,
-r