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