View Full Version : [C++] rtAudio Class
Buongiorno, avrei bisogno di un aiuto se possibile, nel mio lavoro di tesi ho bisogno di interfacciarmi con un microfono e catturare in tempo reale l'esecuzione i un musicista che poi devo rielaborare a blocchi di 256 campio alla volta.
Pensavo di utilizzare la rtAudio per interfacciarmi, che dite può andare????
Avete da conisgliarmi qlk?????
grazie mille.
Arrivderci.
Alessio
tomminno
12-02-2007, 14:40
Buongiorno, avrei bisogno di un aiuto se possibile, nel mio lavoro di tesi ho bisogno di interfacciarmi con un microfono e catturare in tempo reale l'esecuzione i un musicista che poi devo rielaborare a blocchi di 256 campio alla volta.
Pensavo di utilizzare la rtAudio per interfacciarmi, che dite può andare????
Avete da conisgliarmi qlk?????
grazie mille.
Arrivderci.
Alessio
RtAudio è perfetta, la usai anch'io per la tesi.
Beh grazie......davvero va bene???? ti potrei chiedere qualche consiglio sul come usarla????
xche io ho qlk ifficolta.......se vuoi anche privatamente se ti scoccia qui.....
ciao e grazie
Alessio
tomminno
12-02-2007, 20:35
Beh grazie......davvero va bene???? ti potrei chiedere qualche consiglio sul come usarla????
xche io ho qlk ifficolta.......se vuoi anche privatamente se ti scoccia qui.....
ciao e grazie
Alessio
Chiedi pure, comunque è abbastanza semplice da usare.
Beh il mio problema è questo:
Allora il mio progetto di tesi è praticamente questo:
Progettare un riconoscitore musicale monofonico utilizzando l'analisi a Q-Costante.
Ora la parte di decodifica,l'ho effettua facendo il porting in c++ di un progetto elaborato precedentemente da un altro ragazzo su Matlab.
Ora io ho creato diciamo la classe Madre..che contiene a sua volta la classe figlia ke viene utilizzata x ognuna delle 9 ottave musicali da rilevare...
A questa Classe madre...devono arrivare blocchi da 256 campioni alla volta....effettuando una prima parte di riempimento del buffer...poi raggiunto i 256 campioni il tutto gira a regime di 256 camp alla volta...
Ora qst campioni mi dovrebbero arrivare appunto dalla rtAudio...effettuando presumo un openstream...e successivamente uno strart stream......
Ecco...ma poi come faccio a prendere i campioni??
Il getBuffer mi ritorna un char....non capisco....
Altra cosa...a me servono blokki di 256 campioni...quindi il buffersize lo metto a 256??quanti Buffer della rtAudio mi conviene usare???....
Scusa x tutte qst domande..
ciao e grazie
tomminno
12-02-2007, 22:54
Beh il mio problema è questo:
Allora il mio progetto di tesi è praticamente questo:
Progettare un riconoscitore musicale monofonico utilizzando l'analisi a Q-Costante.
Ora la parte di decodifica,l'ho effettua facendo il porting in c++ di un progetto elaborato precedentemente da un altro ragazzo su Matlab.
Ora io ho creato diciamo la classe Madre..che contiene a sua volta la classe figlia ke viene utilizzata x ognuna delle 9 ottave musicali da rilevare...
A questa Classe madre...devono arrivare blocchi da 256 campioni alla volta....effettuando una prima parte di riempimento del buffer...poi raggiunto i 256 campioni il tutto gira a regime di 256 camp alla volta...
Ora qst campioni mi dovrebbero arrivare appunto dalla rtAudio...effettuando presumo un openstream...e successivamente uno strart stream......
Ecco...ma poi come faccio a prendere i campioni??
Il getBuffer mi ritorna un char....non capisco....
Altra cosa...a me servono blokki di 256 campioni...quindi il buffersize lo metto a 256??quanti Buffer della rtAudio mi conviene usare???....
Scusa x tutte qst domande..
ciao e grazie
Immagino che ovviamente tu lavori con campioni di 16 bit.
In questo caso l'apertura dello stream per la lettura dalla scheda è
audio = new RtAudio();
audio->openStream(0, 0, device, nChannels, RTAUDIO_SINT16, nSamplesPerSec, &bufferSize, nBuffers);
dove device è l'indice della scheda audio,nChannels il numero di canali,nSamplesPerSec i campioni al secondo del formato che desideri registrare, bufferSize è la dimensione massima del buffer, nBuffers il numero di buffer che la libreria userà internamente.
Se lavori sotto Windows 256 campioni di buffer potrebbero essere pochi e potresti andare incontro a perdite di campioni, devi un pò sperimentare, io sono riuscito ad arrivare a 64 campioni e 4 buffer.
Se vuoi usare la scheda audio di default puoi usare:
int ndev = audio->getDeviceCount();
RtAudioDeviceInfo info;
for(int i = 1; i < ndev; i++)
{
info = audio->getDeviceInfo(i);
if (info.isDefault)
device = i;
}
Sicuramente poi vorrai usare delle operazioni non bloccanti (thread) quindi hai bisogno di impostare la callback:
audio->setStreamCallback(&recdata, this);
Il primo parametro è il puntatore alla funzione di callback, il secondo è il parametro che puoi passare alla callback.
la funzione recdata sarà qualcosa di simile a
int recdata(char *buffer, int bufferSize, void *data)
{
return ((AudioInterface*)data)->OutputData(buffer, bufferSize);
}
La callback deve ritornare 0 per continuare l'esecuzione.
A questo punto in buffer hai i campioni. Considera che bufferSize è la dimensione del buffer espressa in char, ma se usi 16 bit la dimensione dimezza. Se usi un flusso stereo i campioni sono interlacciati: prima il sinistro poi il destro, come da standard.
A questo punto nel metodo OutputData fai quello che ti pare dei dati ricevuti, puoi scriverli su file, accodarli in un buffer che verrà svuotato da un thread consumatore... Non è necessario che acquisisci dalla scheda solamente 256 campioni, ti conviene metterli in una queue e pacchettizzare successivamente questo buffer, non penso ti serva il ritardo 0 come negli studi di registrazione.
Per cominciare....grazie e scusa x il tempo che ti sto facendo perdere....
Premetto che io praticamente sono ignorante in programmazione.....
Cmq si...lavoro su 16 Bit...audio Monofonico,quindi non ho problemi sull'interlacciamento....
Però abbi pazienza...non ho capito qst cosa dei buffer.....
Xche 4 da 64 e non 1 solo?????
L'obiettivo sarebbe quello di riuscire ad analizzare un brano eseguito da uno studente praticamente in tempo reale.....
Quindi a me i blocchi in successione dei 256 campioni mi devono uscire di continuo....(quindi il discorsco della callback l'ho capito).....per nn capisco come io dalla mia classe madre posso capire qnd è il momento di rikiamarmi i 256 campioni....o se semplicemente mi conviene fare come dicevi tu...un travaso dei campioni che man mano la rtAudio genera..su un contenitotore di 256 elementi che qnd è pieno...utilizzo..svuoto...e comincio a ripienare.....
Questo non mi fa perdere tempo???
Non c'è un modo piu rapido??
Grazie ancora.....
Alessio
tomminno
13-02-2007, 09:24
Xche 4 da 64 e non 1 solo?????
Prova e vedrai che con 1 solo buffer se non è abbastanza ampio ti perdi campioni per strada :(
L'obiettivo sarebbe quello di riuscire ad analizzare un brano eseguito da uno studente praticamente in tempo reale.....
256 campioni sono 6ms di ritardo, non penso che tu necessiti di ritardo inferiore, anche perchè con Windows difficile scendere col ritardo, al limite puoi anche usare ASIO, io però non sono mai risucito a scendere sotto i 64 campioni di ritardo.
Quindi a me i blocchi in successione dei 256 campioni mi devono uscire di continuo....(quindi il discorsco della callback l'ho capito).....per nn capisco come io dalla mia classe madre posso capire qnd è il momento di rikiamarmi i 256 campioni....
E' la libreria che richiama la callback al momento opportuno. Te devi solo usare i dati.
o se semplicemente mi conviene fare come dicevi tu...un travaso dei campioni che man mano la rtAudio genera..su un contenitotore di 256 elementi che qnd è pieno...utilizzo..svuoto...e comincio a ripienare.....
Questo non mi fa perdere tempo???
Non c'è un modo piu rapido??
Grazie ancora.....
Alessio
Ti conviene usare un contenitore un pò più grande di 256 elementi, magari qualcosa dell'STL da condividere tra i thread di elaborazione e quello di lettura dalla scheda audio. Essendoci 1 produttore ed 1 consumatore, la sincronizzazione non è difficile.
Ciao a tutti,
scusate forse qualcuno può aiutarmi,
Ho scaricato il tool rtaudio 4.0.2 ed ho cercato di compilare i progetti esempio in ambiente VC6 però ottengo alcuni errori tipo:
RtAudio.cpp
c:\giobbo\rtaudio-4.0.2\rtaudio.h(319) : error C2027: use of undefined type 'RtAudio'
c:\giobbo\rtaudio-4.0.2\rtaudio.h(213) : see declaration of 'RtAudio'
c:\giobbo\rtaudio-4.0.2\rtaudio.h(330) : error C2629: unexpected 'class RtAudio ('
c:\giobbo\rtaudio-4.0.2\rtaudio.h(330) : error C2238: unexpected token(s) preceding ';'
c:\giobbo\rtaudio-4.0.2\rtaudio.h(706) : error C2562: 'closeStream' : 'void' function returning a value
c:\giobbo\rtaudio-4.0.2\rtaudio.h(432) : see declaration of 'closeStream'
c:\giobbo\rtaudio-4.0.2\rtaudio.h(707) : error C2562: 'startStream' : 'void' function returning a value
c:\giobbo\rtaudio-4.0.2\rtaudio.h(441) : see declaration of 'startStream'
c:\giobbo\rtaudio-4.0.2\rtaudio.h(708) : error C2562: 'stopStream' : 'void' function returning a value
c:\giobbo\rtaudio-4.0.2\rtaudio.h(450) : see declaration of 'stopStream'
c:\giobbo\rtaudio-4.0.2\rtaudio.h(709) : error C2562: 'abortStream' : 'void' function returning a value
c:\giobbo\rtaudio-4.0.2\rtaudio.h(459) : see declaration of 'abortStream'
c:\giobbo\rtaudio-4.0.2\rtaudio.cpp(137) : error C2511: 'RtAudio::RtAudio' : overloaded member function 'void (enum RtAudio::Api)' not found in 'RtAudio'
c:\giobbo\rtaudio-4.0.2\rtaudio.h(213) : see declaration of 'RtAudio'
c:\giobbo\rtaudio-4.0.2\rtaudio.cpp(182) : error C2562: 'openStream' : 'void' function returning a value
c:\giobbo\rtaudio-4.0.2\rtaudio.h(421) : see declaration of 'openStream'
c:\giobbo\rtaudio-4.0.2\rtaudio.cpp(2597) : error C2039: 'log10' : is not a member of 'std'
c:\giobbo\rtaudio-4.0.2\rtaudio.cpp(2771) : error C2371: 'i' : redefinition; different basic types
c:\giobbo\rtaudio-4.0.2\rtaudio.cpp(2656) : see declaration of 'i'
c:\giobbo\rtaudio-4.0.2\rtaudio.cpp(3464) : error C2065: 'WAVE_FORMAT_96S16' : undeclared identifier
c:\giobbo\rtaudio-4.0.2\rtaudio.cpp(3468) : error C2065: 'WAVE_FORMAT_96S08' : undeclared identifier
c:\giobbo\rtaudio-4.0.2\rtaudio.cpp(3487) : error C2065: 'WAVE_FORMAT_96M16' : undeclared identifier
c:\giobbo\rtaudio-4.0.2\rtaudio.cpp(3491) : error C2065: 'WAVE_FORMAT_96M08' : undeclared identifier
Error executing cl.exe.
Premetto che ho già incluso nel progetto i file RTaudio.cpp,RTaudio.h ed RTerr.h.
Qualcuno sa dirmi cosa succede?
Grazie,.............ciao!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.