# Development

The effects included are designed to be as portable as possible, as well as making it easy to add additional effects.

## Building

To build the app, simply open the project in android studio and build. The app integrates Oboe via a git submodule. Make sure
when cloning the repository to clone the submodule as well using `git clone --recursive`, or `git submodule update --init --recursive`.

To update the version of Oboe being used, descend into the Oboe repository [(oboe location)](../app/src/main/cpp) 
and update from its remote. Then, call `git submodule update` in this repository. Alternatively `git submodule update --recursive --remote` will pull the latest version of Oboe from remote.

Although the CMake file requires android headers (to use Oboe), the effects themselves can be compiled with any C++17 compliant compiler.

## Architecture

The UI code (Kotlin) calls native code through the JNI bridge to query information about the various effects implemented,
and how to render the effect information in the UI. This means that adding an effect only needs to be done on the 
native side. The JNI bridge passes information regarding implemented effects descriptions to the UI as well as functions
called when the user modifies effects in the UI.

The `DuplexEngine` is responsible for managing and syncing the input and output Oboe streams for rendering audio
with as low latency as possible. The `FunctionList` class contains the a vector of effects that correspond to the list of 
effects (and their parameters) that the user wants to use to process their audio. Effects (and the `FunctionList`) overload
their function operator to take in two numeric iterator types. E.g `