* Implement the notion of a virtual file system (VFS) which is used
by the resource manager for loading sound files. The idea is that
the application can implement these to support loading from custom
packages, archives, etc.
* Add a helper API for decoding a file from a VFS and a file name.
* Add some symbols representing allocation types. These are not
currently used, but I've added them in preparation for changes to
the allocation callbacks. The idea is that an allocation type will
be passed to the callbacks to give the allocator better intel as to
what it's allocating which will give it a chance to optimize.
* Add some placeholders for flags for controlling how to load a data
source. Currently only MA_DATA_SOURCE_FLAG_DECODE is implemented
which is used to indicate to the resource manager that it should
store the decoded contents of the sound file in memory rather than
the raw (encoded) file data.
* Support has been added to the resource manager to load audio data
into memory rather than naively reading straight from disk. This
eliminates file IO from the audio thread, but comes at the expense
of extra memory usage. Support for streaming is not implemented as
of this commit. Early (largely untested) work has been implemented
to avoid loading sound files multiple times. This is a simple ref
count system for now, with hashed files paths being used for the
key into a binary search tree. The BST is not fully tested and
likely has bugs which will be ironed out in future commits.
* Support has been added for configuring the stereo pan effect. Most
audio engines use a simple balancing technique to implement the
pan effect, but a true pan should "move" one side to the other
rather than just simply making one side quieter. With this commit,
the ma_panner effect can support both modes. The default mode will
be set to ma_pan_mode_balance which is just a simple balancing and
is consistent with most other audio engines. A true pan can be used
by setting the mode to ma_pan_mode_pan.
* Initial work on infrastructure for spatialization, panning and
pitch shifting.
* Add ma_engine_sound_set_pitch()
Spatialization and panning is not yet implemented, but pitch shifting
should now be working.
* The engine will now auto-start by default. This can be changed in
the config by setting `noAutoStart` to true.
* Initial implementation of ma_engine_play_sound() which can be used
for fire-and-forget playback of sounds.
* Add ma_engine_sound_at_end() for querying whether or not a sound
has reached the end. The at-end flag is set atomically and
locklessly in the mixing thread.
This change makes it so MA_AT_END is returned when a non-looping data
source reaches the end. This is how the caller can know to do clean up
or whatnot.
* Add support for volume control to ma_mixer_mix_*().
* Add support for specifying an effect to apply before mixing.
* Add optimized pipeline for memory mappable data sources.
* Remove some unnecessary functions:
- ma_mixer_mix_pcm_frames_ex()
- ma_mixer_mix_callbacks()
- ma_mixer_mix_decoder()
- ma_mixer_mix_audio_buffer()
- ma_mixer_mix_waveform()
- ma_mixer_mix_noise()
- ma_mixer_mix_rb_ex()
The ma_audio_buffer object is used for storing raw audio data in memory
and reading from it like any other data source. It supports flexible
memory management, reading, seeking, memory mapping and looping.
See documentation under "Audio Buffers" for a detailed description.
Previously this would result in a glitch, however in the interest of
avoiding as many sources of glitching as possible, changing the format
and/or channel count of a biquad filter (and by extension, anything
derived from it, such as low-pass filters) will now result in an error.
This change reduces memory usage by removing half the number of delay
registers.
This commit also sets up some infrastructure for future work on a fixed
point implementation. Both the floating and fixed point implementations
will run on a 32-bit pipeline for now.
This changes the the lpfCutoffFrequency config variable from a uint32
to a double. This is required because we simplify the sample rate
fraction which cant result in cases where the cutoff frequency is too
aggressively rounded down due to dividing tiny integers.