Open Sound Control -- integrasjon med Qt-biblioteket

Sigmund Lappegård Lahn 2008

Formål

Open Sound Control er en asynkron kommunikasjonsprotokoll, desiget først og fremst til bruk i lyd-programvare. Den er tenkt på som en arvtager for MIDI.

Som et eksperiment har jeg utviklet et tynt bindeledd mellom programmerings-bibliotekene oscpack og Qt. Målet har vært å gjøre det lettere å bruke Open Sound Control-beskjeder også i presentasjons-delen av applikasjoner. En løsere kobling mellom presentasjonsdelen og funksjons-delen, sammen med bruk av en enkel og åpen protokoll som Open Sound Control, vil gjøre det lettere å f. eks. drive en applikasjon programmatisk, eller å ta i bruk en ny type analog kontroller -- som en mikserpult for oppkobling mot PC.

Resultat

Grunnleggende og brukbar funksjonalitet er på plass.
På plass:

Mangler:

Bygg

Last ned .zip-fila, og pakk den ut.
Last ned oscpack, og pakk den ut i oscroute-mappa.
bygg oscpack (make && make lib)
bygg oscroute (qmake && make)

Dette burde fungere på både MacOSX og de fleste Linux/BSD-varianter.

Bruk

Klassen OscRouter tar seg av nettverks-kommunikasjon, og ruter beskjeder til riktig OscMethod.
Klassen OscMethod gjør det enkelt å koble eksisterende funksjonalitet mot Open Sound Control.

Lag en OscRuter.

Lag en "slot" i et QObject med signaturen
void slotName(const OscMessage*);
Lag en instans av OscMethod, og koble signalet messageReceived(const OscMessage*)  til din slot.
Si ifra til OscMethod-objektet hvilke sammensetninger av argumenter metoden din kan håndtere, ved hjelp av OscMethod::accept() - for eksempel, accept(QString("i")) for metoder som tar et heltall.

Bygg opp OSC-addressetreet ditt, med OscRouter::addMethod().
Start ruteren. Den vil starte en ny program-tråd, og vente på beskjeder.

Se også det enkle eksempelet i test.cpp.

Hva kan gjøres videre

Implementasjonen av patterns er det neste logiske steget -- rammeverket er allerede på plass.

oscpack-biblioteket har flere mangler - dårlig dokumentert, mangler en måte å ta dype kopier av objekter på (dette skapte mye hodebry for meg). Det er dessuten ikke laget for jobbe med OSC-beskjeder, men for å sende og motta. Enten bør det utbedres, eller finne en erstatning.

Lage en adapter som jobber med vanlige datatyper, i stedet for de noe uklare osc::ReceivedElement og venner.