[openal] Alure 2.0
Lex
lex at progger.ru
Sun Oct 19 09:58:24 EDT 2014
Hi Chris,
As I am currently evaluating freely available c++ openal wrappers, it
was particularly interesting to look at alure 2.0. For some reason I did
not observed it while googling the thing.
Answering your question about custom decoders interface:
I like the option to pass decoder into getBuffer method. The problem
about having decoder instantiated can be avoided by having
DecoderFactory, which getBuffer code will ask to create a real decoder
if it needs to. Another option (which is not mutually exclusive with
previous IMO) is that client has a way to register their decoders, and
each decoder has 'recognize' method which get passed stream of data and
which reads signature or whatever and returns a bool flag indicating
whether it can decode this stream or not.
Additional random notes that came to mind:
* it would be great if library had abstractions for disk i/o, since
games, for example, often have proprietary resource package format.
* efx support
* why disposing buffers / sources have to deal with context->finalize?
it may be handled in the appropriate desttructors.
* Do you *really* have to use RTTI (dynamic_cast) in the library?
Similar projects to borrow inspiration from (Not sure if you already
seen them):
https://github.com/FrictionalGames/OALWrapper
https://github.com/R4stl1n/cAudio
Lex
17.10.2014 20:37, Chris Robinson пишет:
> Hey guys.
>
> I've started work on the API rewrite I've had planned for Alure. As
> it's a rewrite, no code using the old API will work, but I hope the
> changes will be more functional and more extensible than the old API.
>
> http://repo.or.cz/w/alure.git
>
> The old API/code can be found in the alure-1.x branch, if you still
> need it. The new API is still in progress; in particular it's missing
> a lot of functionality, and what's there is subject to change. The
> reason I'm showing it now is to get some feedback on the design.
> There's a few examples provided that show how device enumeration and
> playback work. Some points of note:
>
> The API is C++ only. It should theoretically be possible to make a C
> wrapper later if there's enough interest in it, but it's currently not
> there.
>
> It's intended more as a static library that gets included in the
> application. A shared library is possible, but potential ABI breaks
> caused by changing C++ classes has me wary.
>
> The design is more of a C++ wrapper for OpenAL, with added utility for
> file reading/decoding, buffer and source management, streaming, etc
> (as opposed to the old API, which provided extra utility while you
> oterwise used OpenAL directly).
>
> The general idea is that you can get a buffer by simply doing:
>
> alure::Buffer *buffer = context->getBuffer("somefile.ogg");
>
> Calling that multiple times will give you back the same buffer so
> you're not constantly loading in new copies. Additionally, you can
> create as many Source objects as you want by simply doing
>
> alure::Source *source = context->getSource();
>
> regardless of how many sources the underlying implementation can
> handle; it'll only use an OpenAL source while it's playing. Playing
> the source is then as simple as
>
> source->play(buffer);
>
> Currently it'll throw an exception if you try to play too many
> simultaneously, but I hope to add priority-based virtualization so
> that it'll automatically cut off the least important sources so it can
> play the most important.
>
>
> Aside from feedback on the current design, I'm also looking for
> feedback on how you'd like to see certain things implemented. For
> instance, custom decoders.
>
> Currently it is possible to define custom decoders by inheriting from
> the alure::Decoder class, implementing the requisite methods, then
> passing an instance of it in wherever the API wants a decoder.
> However, creating managed buffers from this decoder isn't yet
> possible. Some ideas I've had:
>
> A method that takes a name and a decoder, e.g.
> buffer = context->getBuffer("somename", my_decoder);
> and if a buffer named "somename" doesn't exist, it creates one using
> the decoder. The problem here is it requires having a decoder
> instantiated even if the buffer is already loaded.
>
> Alternatively, a callback can be registered for a particular name,
>
> alure::Decoder *create_my_decoder(const char *name, void *userptr);
> context->registerDecoder("somename", create_my_decoder, userptr);
>
> and when you call context->getBuffer("somename"); it'll call
> create_my_decoder("somename", userptr); as needed, to create a decoder
> and fill the buffer. The problem here is it'll often mean the app has
> to register most or all of their audio files, if it has files the
> default decoder(s) can't handle.
>
> The other possibility is to register a callback to a particular file
> extension, or even a uri. So basically
>
> context->registerDecoder("myuri", create_my_decoder, userptr);
>
> then calling context->getBuffer("myuri://somename"); will call your
> callback if the buffer doesn't already exist. The registration can be
> stored per-context, per-device, or globally.
>
>
> Sorry if this was long and rambly. But I'm interested in what you guys
> think.
> _______________________________________________
> openal mailing list
> openal at openal.org
> http://openal.org/mailman/listinfo/openal
More information about the openal
mailing list