<!-- -*- mode: markdown; mode: flyspell; ispell-local-dictionary: "american" -*- -->
\page overview Guitarix Program Overview

The diagrams try to give a simplified view on some of the important
Guitarix classes.

## User Interface
#blockdiag ui {
  RackContainerM [label="RackContainer\n(Mono)"];
  RackContainerS [label="RackContainer\n(Stereo)"];
  RackBoxM [label="RackBox", stacked];
  RackBoxS [label="RackBox", stacked];
  PluginUI [stacked];
  MainWindow -> RackContainerM -> RackBoxM;
  MainWindow -> RackContainerS -> RackBoxS;
  RackBoxS -> PluginUI [style="dashed", dir="both"];
  RackBoxM -> PluginUI [style="dashed", dir="both"];
  MainWindow -> PluginDict -> PluginUI;
  group {
    MainWindow;
    PluginDict; PluginUI;
    RackContainerM; RackBoxM;
    RackContainerS; RackBoxS;
  }
}

<table>
<tr><td>MainWindow   </td><td>main program window</td></tr>
<tr><td>PluginDict   </td><td>dictionary of PluginUI by id</td></tr>
<tr><td>PluginUI     </td><td>user interface of a plugin (menu items, Gtk::Palette item etc.)</td></tr>
<tr><td>RackContainer</td><td>container for RackBox widgets</td></tr>
<tr><td>RackBox      </td><td>Effect UI container</td></tr>
</table>

## Abstract Engine Interface
#blockdiag machine {
  GxMachineBase [width="400"];
}

gx_engine::GxMachineBase is an interface (abstract class) which can be
implemented on the Guitarix engine (gx_engine::GxMachine) or by
communicating to a remote engine instance via JSON-RPC
(gx_engine::GxMachineRemote). The server part is implemented by GxService.

## Engine
#blockdiag engine {
  Parameter [stacked];
  Plugin [stacked];
  group {
    color = "#77FF77";
    GxJack -> GxEngine [style="dashed", folded];
    GxEngine -> PluginList -> Plugin;
    GxEngine -> ParamMap -> Parameter;
    GxSettings -> ParamMap;
    GxSettings -> CmdlineOptions -> GxLogger [style="none"];
  }
}

<table>
<tr><td>gx_jack::GxJack           </td><td>connection to jackd (clients)</td></tr>
<tr><td>gx_engine::GxEngine       </td><td>the audio engine (executes active audio plugins)</td></tr>
<tr><td>gx_engine::PluginList     </td><td>available effect plugins</td></tr>
<tr><td>gx_engine::Plugin         </td><td>audio effect plugin</td></tr>
<tr><td>gx_engine::ParamMap       </td><td>mapping of parameter id's to Parameter instances</td></tr>
<tr><td>gx_preset::GxSettings     </td><td>preset banks and statefile</td></tr>
<tr><td>gx_system::CmdlineOptions </td><td>all settings that can be controlled from the command line</td></tr>
<tr><td>GxLogger                  </td><td>logging of errors / warnings</td></tr>
</table>
