FmElement

A FmElement is the basic building block of the audio processing chain of the fm_server.

Elements are arranged in a pipeline and have input and output ports. Audio buffers move from an output port (called a Source) to an input port (called a Sink).
Every pipeline can have only one output?; data moves through the elements in callback-based way: the output requests an audio buffer to the element connected to its Source pad (calling its get_buffer() method), which in turn requests a buffer from the element connected to itself and so on, until an input element? fills the buffer.

Base classes

Elements are divided into (or better, subclassed into):

FmInput?
they have only Source ports, and support some additional methods to stop, pause and restart them.
FmEffect?
they have both Sink and Source ports.
FmOutput?
they have only Sink ports. A pipeline can only contain one of them. They lack the get_buffer method.

Some elements that don't fit into these classes (for example FmMixer?) are directly subclassed from FmElement.

Implemented elements

FmDJMixer?
a wrapper for FmMixer?, adds gain and pan controls for each channel
FmEffectGain
changes the volume level of a source
FmEffectPan
changes the balancement between channels (left/right)
FmEffectRate
changes the pitch of a source, using  libsamplerate
FmInputCDJ
emulates a CDJ player
FmInputTest?
a test source, generates a sine wave
FmInputGst
reads audio from a  GStreamer pipeline
FmMixer?
mixes the output of different elements
FmOutputAlsa
outputs to an  ALSA audio device (Linux only)
FmOutputJack?
outputs to a JACK audio device