Age | Commit message (Collapse) | Author |
|
- Removed the superfluous class `EffectChainManager` whose functionality is now shifted to `EffectsManager`
- Updated EffectProcessor to fix the circular include problem during compilation
NOTE: XML saving/loading of effects is broken and will be re-implemented in the new architecture
|
|
- EffectChain and EffectChainSlot had no clear separation of responsibility
- Had to keep the duplicated state in both the classes in sync and thus making it more susceptible to bugs
NOTE: XML saving/loading of effects is broken and will be re-implemented in the new architecture
|
|
Conflicts:
.travis.yml
src/effects/effect.cpp
src/effects/effect.h
src/effects/effectchainmanager.h
src/effects/effectinstantiator.h
src/effects/effectmanifest.h
src/effects/effectrack.cpp
src/effects/native/autopaneffect.cpp
src/effects/native/balanceeffect.cpp
src/effects/native/biquadfullkilleqeffect.h
src/effects/native/bitcrushereffect.cpp
src/effects/native/echoeffect.cpp
src/effects/native/echoeffect.h
src/effects/native/filtereffect.cpp
src/effects/native/flangereffect.cpp
src/effects/native/loudnesscontoureffect.cpp
src/effects/native/phasereffect.cpp
src/effects/native/reverbeffect.cpp
src/effects/native/threebandbiquadeqeffect.h
src/engine/effects/engineeffect.cpp
src/engine/effects/engineeffect.h
src/mixxx.cpp
src/preferences/dialog/dlgpreferences.cpp
src/preferences/dialog/dlgpreferences.h
src/test/metaknob_link_test.cpp
src/test/nativeeffects_test.cpp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This was broken by splitting the EffectRacks into prefader and postfader
groups. To fix this, create a special postfader MasterEffectRack for the
master EQ. Perhaps it could be useful to add other effects to this
special MasterEffectRack in the future.
|
|
|
|
Conflicts:
src/effects/effectsmanager.cpp
|
|
|
|
This is required to send the intermediate enabling/disabling states for
every combination of input and output. Previously, when an effect was
processed on multiple channels, only one of them would get the disabling
signal when turned off. This caused the Echo effect to play the sound
last stored in its buffer when it was disabled with multiple inputs
going to it. Echo's buffer would be cleared for only one of the input
channels.
|
|
EngineEffect creation and loading of saved state on startup need
to be decoupled so the saved state can be loaded after all input
and output channels have been registered in the engine.
|
|
This required two major changes to the effects system:
1. Making effects track their internal state for each input
going to each output, instead of sharing a state only for each
input.
2. Splitting the single combined effects input/output buffer
into a separate input and output buffer.
TODO: fix signal path tests
|
|
|
|
|
|
|
|
if effects.xml is a valid XML file but does not contain enough
<EffectChain> elements
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This will allow us to experiment with different implementations for
structured user preferences. It will also reduce repeated typing of
template arguments and better represent the purpose of the object.
|
|
|
|
* Update GroupEffectProcessor, native effects and related code to
refer to channels instead of groups.
* Change most ChannelHandleAndGroup variables to be named handle_group
to hint that it's a pair-like object.
|
|
* Add ChannelHandle, a wrapper class for an integer handle that starts
at 0 and increments.
* Add ChannelHandleFactory for assigning integer handles to group
strings.
* Add ChannelHandleMap, an associative container mapping ChannelHandle
to a template data type T. Backed by a QVarLengthArray with a
pre-allocation of 256. Supports fast O(1) lookups (simple memory
indexing) and amortized O(1) inserts.
* Re-factor engine and effects code to use ChannelHandle.
* Update EffectProcessor to use ChannelHandleMap instead of QHash.
* Update EngineEffectChain to use ChannelHandleMap instead of QLinkedList.
I did two tests -- one with effects inactive and one with effects
active. I measured total-callback processing time improvements of 20%
(1 track, no effects) and 13% (2 tracks, effects enabled). From this I
conclude that the QHash and QLinkedList introduced tons of wasted
cycles (which agrees with my profiling results from a month or two
ago).
Test 1:
* No effects active
* optimize=portable
* single track playing for 1 minute
* began sampling 20 seconds in to get rid of the load-track jitters
Base:
Debug [Main]: Stat("SoundDevicePortAudio::callbackProcess prepare 1, Built-in Output","count=45014,sum=3.82151e+09ns,average=84896ns,min=26393ns,max=429257ns,variance=9.41766e+08ns^2,stddev=30688.2ns")
Experiment:
Debug [Main]: Stat("SoundDevicePortAudio::callbackProcess prepare 1, Built-in Output","count=44856,sum=3.02069e+09ns,average=67342ns,min=20400ns,max=323169ns,variance=5.93287e+08ns^2,stddev=24357.5ns")
Results:
Minimum: reduced by 22.7%
Maximum: reduced by 24.7%
Average: reduced by 20.7%
StdDev: reduced by 20.6%
Test 2:
* One effect active on [Master].
* One effect active on [Channel1]
* optimize=portable
* two tracks playing for 1 minute
* began sampling 20 seconds in to get rid of the load-track jitters
Base:
Debug [Main]: Stat("SoundDevicePortAudio::callbackProcess prepare 1, Built-in Output","count=44937,sum=4.76277e+09ns,average=105988ns,min=38434ns,max=326061ns,variance=1.49815e+09ns^2,stddev=38706ns")
Experiment:
Debug [Main]: Stat("SoundDevicePortAudio::callbackProcess prepare 1, Built-in Output","count=45191,sum=4.15799e+09ns,average=92009.3ns,min=31693ns,max=333664ns,variance=1.11131e+09ns^2,stddev=33336.3ns")
Results:
Minimum: reduced by 17.5%
Maximum: increase by 0.02%
Average: reduced by 13.2%
StdDev: reduced by 13.9%
|
|
Add support for associating with rack and effect unit by group.
|
|
* Create dedicated EqualizerRack, QuickEffectRack, and
StandardEffectRack classes.
* Move all per-rack initialization into a method of the sub-class.
* Share common code between EqualizerRack and QuickEffectRack with a
PerGroupRack parent class.
* Move group formatting methods for rack, chain, and effect to the rack
sub-type class.
* Keep a strong reference to racks in DlgPrefEq to protect pointer
usage and eliminate assumptions that the pointer exists.
* Remove filterDepth / filter CO aliases.
|
|
QuickEffectChain
|
|
|
|
|
|
|
|
|
|
This introduces the concept of racks into the engine.
|
|
When loading a chain into a chain slot, the chain is cloned. This allows loading
the same chain into multiple effect units at once.
|
|
|
|
serialization/de-serialization support.
|
|
racks.
|
|
send all their existing state right after being added to the engine.
|
|
|
|
Conflicts:
res/skins/Outline1024x600-Netbook/keylock-off-Ch1.png
res/skins/Outline1024x600-Netbook/keylock-off-Ch2.png
res/skins/Outline1024x600-Netbook/keylock-on-Ch1.png
res/skins/Outline1024x600-Netbook/keylock-on-Ch2.png
|