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:
- Rask ruting av beskjeder (Basert på et hash table, gjennomsnittlig 0(1))
- En metode kan nåes via et valgfritt antall adresser, uten noe særlig ekstra ressursbruk.
- Bruk av Qt's nettverks-bibliotek
- Velg hvilke sett av argumenter du vil godta
Mangler:
- Ikke helt skjult minne-håndtering -- du må selv slette osc-beskjeden når du har håndtert den.
- Ikke god feil-håndtering -- det er ikke mange steder i biblioteket det kan oppstå alvorlige feil, men der det kan skje, vil programmet avsluttes.
- Foreløpig kun en UDP-ruter.
- Kun testet på Linux -- men det burde fungere på OSX og Windows også.
- Tidsfestet håndtering av OSC-Bundles er sannsynligvis ikke feilfri. Dessuten er den bare nøyaktig til nærmeste sekund.
- Frie addresser (patterns) er ikke implementert.
- Spørringer mot OSC-ruteren er ikke implementert.
- bygge-fila lager ikke et delt objekt -- kun statisk linking foreløpig
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.