Hello, all!

So as some of you may know, I've been working on a compressor EngineObject to 
add to Mixxx as part of my Google Summer of Code project. I've completed the 
compressor, and after testing it thoroughly, it seems to be operating with no 
flaws. Now that the compressor has been completed, it must be integrated into 
Mixxx in the proper location. Owen, RJ, and I have discussed various schemes 
for integration, and we've concluded that it would be best apply a compressor 
to the master out mix. Additionally, we would like to have extra compressors 
applied to any channel that is linked to a sound device for output. For 
example, if the user has deck outputs enabled to send the individual deck 
signals to a mixer, each enabled deck will have its own compressor. The problem 
is that the current design of the SoundManager class, EngineMaster class, and a 
few other classes prevents a simple implementation of this functionality. For 
this reason, Owen has encouraged me to
 write up a design proposal in order receive the community's feedback before I 
proceed with a specific implementation.

Please note that in the future, we would like to extend compressor 
functionality a bit. It would be useful to have compressors applied to 
microphones and samplers, so the implementation needs to be open for these 
modifications.

The SoundManager class handles the setup and breakdown of all sound devices. 
For this reason, this class will need modification. It would be great if the 
SoundManager could just change a boolean value for a certain EngineChannel, but 
the SoundManager does not have access to EngineChannels; it only has access to 
the buffers of the EngineChannels, as well as the corresponding AudioOutput 
objects, which basically store information concerning which type of device the 
buffer should be sent to (headphone, deck, microphone, etc.)

An obvious solution would be to modify SoundManager to store the EngineChannels 
instead of just the buffers, but this creates another problem when we realize 
that the SoundManager never has access to certain EngineChannels such as 
EngineDeck. Processing of many channels, including EngineDeck, is handled by 
EngineMaster. For this reason, EngineMaster is registered with the SoundManager 
as the source of the deck buffers.

Therefore, the implementation will need to modify both SoundManager and 
EngineMaster. Keep in mind that SoundManager has access to EngineMaster, but 
EngineMaster does not have access to the SoundManager. My proposed solution is 
as follows:

-Modify EngineMaster class to return an EngineChannel for a given AudioOutput. 
This would require the addition of the following function:
    EngineChannel* getChannel(AudioOutput output);
-Modify EngineChannel class to signal if a channel needs compression. This 
would require the addition of the following variable:
    bool m_needsCompression;
-Modify SoundManager to modify this boolean for a given channel (using 
getChannel function of EngineMaster) when linking a sound device with an 
AudioOutput. This would require modification of the setupDevices() and 
closeDevices() functions.
-Modify the process() function of EngineMaster in order to selectively apply 
compression to those EngineChannels where m_needsCompression is set to true. 
This will ideally be placed after the headphone and master outs are computed, 
in order to restrict the application of compression to the sound card outputs.

Please let me know everyone's opinions. Constructive criticism is definitely 
welcome!

Thanks!
mattmik


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Get Mixxx, the #1 Free MP3 DJ Mixing software Today
http://mixxx.org


Mixxx-devel mailing list
Mixxx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mixxx-devel

Reply via email to