Keep focus on jammr username textbox if empty

Set focus to the password textbox if the username is saved from a
previous run.  But if there is no username saved, don't move away the
focus.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Remove JammrServerBrowser JSON debug output

Don't log the server browser JSON response.  The qDebug() call was left
in during development.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Introduce EffectPlugin base class

Extract a base class from VSTPlugin so new types of effect plugins
besides VST can be implemented.

The VSTProcessor no longer needs to know about VST or any specific
plugin standard.  Instead it uses the EffectPlugin interface and is
renamed EffectProcessor.

Note that the Settings dialog UI is still hardcoded for VST plugins.
This will be fixed in another commit.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Use EffectPlugin in VSTSettingsPage

Avoid referring to VST when we can use the generic EffectPlugin type
instead.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Extract plugin scanner from AddVSTPluginDialog

In order to support AudioUnit plugins the VST settings page and add
plugin dialog must become more generic.  Introduce the concept of a
PluginScanner that lists plugins found on the system.

The PluginScanner allows the AddVSTPluginDialog to enumerate and select
plugins without being VST-specific.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Rename AddVSTPluginDialog to AddEffectPluginDialog

Now that the add plugin dialog is no longer VST-specific it should be
renamed.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Rename VSTSettingsPage to EffectSettingsPage

Now that VSTSettingsPage is no longer VST-specific it should be renamed.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Make EffectPlugin->name a property

For completeness, make getName() a read-only property.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Add EffectPlugin->wetDryMix property

Store the wet/dry mix level, also known as send/return mix.  This allows
each plugin instance to behave differently with respect to mixing input
and output signals.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Add wet/dry mix control to EffectSettingsPage

Allow the user to set the wet/dry mix.  Only expose a drop-down list
with "On", "Mix", and "Bypass" for the time being.  Later we might
provide a knob for the full [0.0, 1.0] range.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Fix incorrect scratch buffer sizes in EffectProcessor

The EffectProcessor keeps two sets of working buffers around.  They are
used for inputs and outputs, respectively.  When there is more than one
EffectPlugin in a chain, the processing function swaps these two buffer
sets as it lets each plugin generate audio.

This logic was broken because we distinguished between maximum number of
inputs and outputs for a plugin.  Since the buffer sets are swapped
after each iteration of the processing loop, this can lead to
out-of-bound memory accesses if the number of inputs and outputs differ.

Simplify the logic by just keeping a maximum number of inputs or outputs
and allocating two sets of these buffers.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Honor EffectPlugin->wetDryMix in EffectProcessor

Apply the wet/dry mix during processing.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Add EffectPlugin->receiveMidi property

Add property to enable/disable MIDI input.  This is useful because some
plugins respond to all MIDI messages and have no UI to let the user
disable this.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Add "receive MIDI" checkbox to EffectSettingsPage

Allow the user to disable MIDI input on plugins.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Honor EffectPlugin->receiveMidi in EffectProcessor

Don't send MIDI events to plugins that have receive MIDI disabled.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Add effect plugin audio/MIDI routing dialog

Move the audio wet/dry mix and receive MIDI parameters into its own
dialog.  In the future we may also add audio channel mapping (Left/Mono,
Right) for plugins with more than 2 audio in/out channels to the routing
dialog.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Use pkgconfig to get libcommon include path

On some systems ogg, vorbis, and portaudio headers are not in the
default include path.  Use pkgconfig to add the include paths.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Add portmidi build paths for homebrew on Mac

The homebrew (http://brew.sh/) package manager should be used for
building on Mac.  Since portmidi does not ship a pkgconfig file we have
to hard-code the build paths.

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Add Debian packaging scripts

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Add application icon and .desktop metadata

Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>