This release is about performance, and undoing the Linux rollback in 0.7.7. As of this release, all code paths from the external interface don't block on the audio thread in the best case. An internal refactor and introduction of a new command architecture unify a bunch of ad-hoc interfaces for fast inter-thread synchronization.
- Property reads are now a couple of atomic operations as opposed to a semaphore
and waiting on the next audio tick. Put another way, they're literally
millions of times faster, and it's now possible to read things like
- property writes are now roughly 5 times faster than they used to be
- object creation is essentially free
- adding and removing generators from sources doesn't block
- configuring routes for effects doesn't block
There is one exception to the lack of blocking: if code does around 10000 operations per audio tick, Synthizer will have no choice but to block due to internal resource exhaustion. If this proves to be an issue in practice, it is trivial to raise this limit further.
The above changes were a complex refactor. In order to make them with as little chaos as possible Synthizer has begun introducing some basic unit tests, but nonetheless it is nearly impossible to make a release like this one without issues. You are encouraged to report issues against Synthizer's GitHub repository.
Synthizer introduces the following compatibility breakages in this release:
In order to get the above performance increases, it was necessary to remove the ability to read object properties. This has the side effect of hiding details of object lifetime, which Synthizer may rely on in future.
removed. Synthizer will be replacing these with a dedicated filter property
type in the near future and opted to remove them now as to avoid an excessive
number of releases that introduce backward-incompatible changes.
Property reads are now actually eventually consistent. The manual preivously stated that it's possible for a read that comes after a write to read a stale value, so code shouldn't have been relying on it. In any case, Synthizer now uses this reservation for the above performance increases, and may break code that incorrectly relied on the old behavior.
Synthizer has also changed the default panner strategy to
SYZ_PANNER_STRATEGY_STEREO. To re-enable HRTF, set this on a per-source
basis. The ability to set this default on a per-context basis will be
introduced in the 0.8.x series. This change was made because HRTF is only
useful for headphone users, and it is not possible for Synthizer to reliably
detect that case. In general, stereo panning is safe on every audio
configuration including surround sound systems.
- Initial release
- Undo the rollbacks in 0.7.7 and reintroduce MSVC and Linux support.
- Internal fix for wire filters, which now don't play silence.
- A number of small fixes and slight quality improvements to reverb.
- All of the massive performance increases from above.
- Miniaudio was improperly configured to use a conservative profile, rather than a low latency profile. Caused extreme audio latency.
- Fix: FdnReverb.t60 = 0.0 no longer internally divides by 0.
- fix: BufferGenerator again uses seconds for positions. This was refactored incorrectly during 0.8.0's major changes.
- Objects should now die faster when their handles are freed, due to holding only weak references internally where possible when dispatching commands to the audio thread.
- Contexts and all generators now support
- Contexts, sources, and generators now support play/pause via
- In Python, this is
- In Python, this is
- As the first part of the event system, all Synthizer objects may now have
arbitrary userdata associated with them:
- In C, this is
- In Python, this is
- This will be documented properly when the rest of the event system exists, but can be used to link Synthizer objects to non-Synthizer objects without having to maintain a custom mapping yourself.
- In C, this is
- Slight memory savings.
- Fix: deleting contexts no longer crashes.
- New function
syz_getObjectTypewhich queries the object type. Primarily intended for bindings developers.
- Fix: Synthizer no longer leaks megabytes of memory per second (issue #44).
This release contains somewhat experimental code to make decoding buffers faster
by approximately 2X. Please report any perceptible audio quality issues with
syz_handleFreenow no-ops when passed
handle = 0.
- Fix: deleting sources in specific orders no longer causes audio artifacts (issue #46)
- Fix: the library no longer crashes due to internal races between handle
deletion and execution of audio commands on the background thread
- This fixes a number of crashes, most notably issue #50, which highlighted the issue due to effects relying heavily on commands.
- Fix: streaming generators no longer spuriously seek to the beginning of their audio after generating the first few MS of audio (issue #49)
panning_scalarwill once more properly take effect if set immediately after
PannedSourcecreation (issue #52)
- An event system. This is alpha, and changes are expected in 0.9.
SYZ_P_PANNER_STRATEGYto Context to default panner strategies for new sources.
- Fix: non-looping BufferGenerator with a pitch bend is no longer silent
- Fix/improvement: In Python, Synthizer events inherit from a common base class.
This release is the long-awaited improved HRTF. This might not be the final version, but it's much better in quality and the scripts to generate it are now much easier to maintain. Please leave any feedback here. in particular, it is not feasible to test the entire sphere, so it may be possible to find azimuth/elevation combinations which do weird things.
These releases are a test series for moving CI to GitHub Actions. Though not user-facing, 0.8.14 now blocks on successful Linux CI for Ubuntu 20 and thus gives Linux support which is on par with Windows.
- Synthizer now builds on Ubuntu 18.
- Python no longer eroniously exports top-level enums due to undocumented Cython
- If you were using ints as property values instead of enums or relying on the topp-level definition, you will need to update your code. This was never intended to be part of the public API.
- It is possible to set generator gain before adding it to a source without triggering a crossfade. Internal changes to the crossfade helpers should make bugs like this much rarer, and probably fixed others that were yet to be reported.