[linux-audio-dev] [ardour] mixer update

New Message Reply About this list Date view Thread view Subject view Author view Other groups

Subject: [linux-audio-dev] [ardour] mixer update
From: Paul Barton-Davis (pbd_AT_Op.Net)
Date: Wed Dec 27 2000 - 03:06:41 EET


There's still a lot of odds and ends to tidy up, but I am pleased to
announce that ardour's mixer is now more or less complete. Lets take a
quick look at the feature list. As a brief summary, just think
"slightly better than ProTools 5.0" :)

Screenshot at http://www.op.net/~pbd/ardour-mixer.png

Features
---------

     * 32 internal busses (can be changed by a simple
          redefinition in the source)

     * unlimited number of auxiliary inputs

     * unlimited number of tracks

     * each aux input can have:

         input: off, mono, stereo, surround (5.1)
                internal bus or physical channel
         
         output: off, mono, stereo, surround (5.1)
                 internal bus or physical channel

     * each track can have

         recorded input: off or mono
                         internal bus or physical channel

         playback input: disk

         output: off, mono, stereo, surround (5.1)
                 internal bus or physical channel
     
     * each track or aux can have:

         - unlimited number of inserts
         - unlimited number of sends

     * inserts are LADSPA plugins (physical channel support soon)

     * sends are:

         - stereo or mono
         - internal bus or physical channel
         - individual gain level
         - individual pan for stereo sends

     * edit groups allow fader-control + solo/mute/monitor input to
         follow group assignments
       
     * GUI:
         - all tracks can be displayed or removed from the mixer
            UI as desired, and the track order can be rearranged
            with the mouse. shortcuts for "hide all tracks" and
            "show all tracks".

         - ditto for auxiliary inputs.

     * "live passthru" mode allows the use of Ardour as
            a multichannel FX box. All tracks (and soon all
            aux inputs) are run with the full insert chain,
            but no data is written to or retrieved from disk:
            tracks/aux's just process data from their inputs
            and send to their outputs.

NOTE: of course, "unlimited" means "subject to the capabilities of
your CPU and other hardware". But there are no intrinsic limits
within the software.

Software Design background:
--------------------------

Ardour now makes extensive of the AudioEngine object, which is a full
implementation of the "RT Audio Server" that we've spoken of often
here. When Ardour is running, there are two AudioEnginePlugin's
attached to the engine:

         * the session (containing tracks based on disk material)
         * the mixer (containing auxiliary inputs for bus routing)

The session is optional, of course :)

The Engine can run any number of plugins. These plugins are *not*
LADSPA plugins. They do *not* use the LADSPA/VST port model. The
reason why is fairly simple. First of all, there is data conversion
necessary, since the Engine makes it possible to write directly into
the DMA buffer of the audio h/w (which is pretty much guaranteed not
use the LADSA_Data or ARDOUR::Sample types present throughout the rest
of the code). So a conversion function must be called to write the
data, but we want to do this without an extra buffer, which means we
have to know if we are writing additively ("+=") or by direct
assignment ("=").

Figuring out whether to use a run_adding()-like method or a
run_replacing()-like method for each plugin is too computationally
complex/costly. It varies dynamically depending on how many plugins
are using a bus or physical channel.

So instead, the Engine provides two methods:
    
    - read_from_channel (channel_id_t, Sample *,
                         guint32 nsamples, guint32 offset);
    - write_to_channel (channel_id_t, Sample *,
                         guint32 nsamples, guint32 offset, gain_t gain)

the channel_id identifies the channel as either a physical channel or
an internal bus.

these methods are updated per-channel/per-bus as the numbers of
writers changes for that bus (read is the same, always). Since this
changes infrequently, we can avoid the "figure out which method to
use" for each iteration of the engine main loop.

plugins use these functions to move data to and from
the channels/busses during a call to their process() method.

--p


New Message Reply About this list Date view Thread view Subject view Author view Other groups

This archive was generated by hypermail 2b28 : Wed Dec 27 2000 - 04:07:58 EET