Open Sound Control -- integrasjon med Qt-biblioteket
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.