[gmpi] Re: [gmpi][API] +++ RESET +++ (Busses)

  • From: Urs Heckmann <urs@xxxxxxxx>
  • To: gmpi@xxxxxxxxxxxxx
  • Date: Tue, 11 Feb 2003 23:02:07 +0100


Am Dienstag, 11.02.03, um 17:33 Uhr (Europe/Berlin) schrieb 
RonKuper@xxxxxxxxxxxx:

> 3.  Interface to hosts
> a. In-Process execution model

I assume In-Process means the same as ProcessReplacing in VST and 
inBuffer == outBuffer

> 4.  Audio packaging
> a. Interleaved or multiple mono

regarding these 2 topics I see a demand for something hat goes beyond 
anything I've seen anywhere:

The plugin must know how many buffers it get's fed and what they're 
for. Same applies to outgoing buffers.

Imagine a Synth that supports 2 additional streams for side chaining. 
One is for an audio signal being fed through the filters, the other is 
for modulation via RMS/Peak envelope. Now, this can become confusing if 
the plug gets 3 mono streams. Is 1+2 a stereo signal to be added to the 
signal generation path? Or is 1 mono and 2+3 are for the envelope 
follower?

In AU world, you specify I/O configurations by a list of value pairs, 
like {{1,1},{2,2},{7,5}}, hence have no proper semantic to determine 
which input or output stream belongs to which feature you advertise. 
Same with VST.

PROPOSAL: I suggest to set up I/O configurations in a grouped manner, 
like busses. I don't know if there's a list of general descriptions 
what inputs and outputs can be used for, so I'd suggest letting the 
plugin choose from a couple of predefined bustypes or set up it's own 
name for it. A host could then display a proper label for the 
inputs/outputs so the musician can be sure to connect the desired 
sources to the correct targets.

This implicitly means that we need a certain buffer and bus format.

Something like this, maybe a bit more sophisticated 8-)

// Note that this code isn't for suggested implementation, it's for 
demonstration.

typedef struct {

        float *samples;
        long numSamples;
        double samplerate;
        int flags; // interleaved, read, write etc.

} buffer;

typedef struct {

        buffer* buffers;
        int numBuffers;
        int flags; // output, input, whatever
        int id; // corresponds to identifier
        CFString identifier; // Sorry, Mac term...

} bus, bufferlist;

to manage a semantically clear process like

int myGmpiPlug::Render ( bufferlist* data, long numSamples, int 
whatFlagsWeEverNeed );

Okay, this example may be cheese, but you figure what I mean.

Any ideas? Or is it considered too early to discuss stuff like this 
(the idea, not the details of implementation)

;)  Urs


----------------------------------------------------------------------
Generalized Music Plugin Interface (GMPI) public discussion list
Participation in this list is contingent upon your abiding by the
following rules:  Please stay on topic.  You are responsible for your own
words.  Please respect your fellow subscribers.  Please do not
redistribute anyone else's words without their permission.

Archive: //www.freelists.org/archives/gmpi
Email gmpi-request@xxxxxxxxxxxxx w/ subject "unsubscribe" to unsubscribe

Other related posts: