Differenze tra le versioni di "Conoscere con le funzioni esterne di RtAudio i dispositivi audio presenti nel sistema"
(Una versione intermedia di uno stesso utente non è mostrata) | |||
Riga 1: | Riga 1: | ||
La libreria ''RtAudio'' è un insieme di classi C++ che fornisce funzionalità per la gestione dei dati Audio in entrata ed in uscita. | La libreria ''RtAudio'' è un insieme di classi C++ che fornisce funzionalità per la gestione dei dati Audio in entrata ed in uscita. | ||
− | + | E' possibile con alcune funzioni esterne della libreria ''RtAudio'' conoscere i dispositivi audio presenti nel sistema e le loro caratteristiche principali. Sarà necessario avere installata nel proprio sistema la libreria condivisa: "''librtaudio.so.4.0.12'' ". | |
− | E' possibile con alcune funzioni esterne della libreria ''RtAudio'' conoscere i dispositivi audio presenti nel sistema e le loro caratteristiche principali. Sarà necessario avere installata nel proprio sistema la libreria condivisa: ''librtaudio.so.4.0.12'' | ||
− | |||
Mostriamo di seguito un possibile codice che mostra in una ''TextArea'' i dispositivi audio presenti nel sistema. Poiché la libreria ''RtAudio'', come già accennato, è scritta in C++, non è possibile richiamare direttamente nel modo consueto con il comando ''Extern'' le sue necessarie funzioni esterne. Si rende, pertanto, necessario scrivere in C++ in un'apposita libreria condivisa, da noi realizzata, la parte di codice che richiama le predette funzioni esterne della libreria ''RtAudio'', lasciando al codice dell'applicativo Gambas quanto più possibile e in particolare una funzione di coordinamento dell'intero processo. V'è da aggiungere che nell'esempio che segue, poiché non è stato possibile scrivere in autonome routine le varie funzioni esterne della libreria ''RtAudio'', bensì tutte in quella sola principale, si è cercato un escamotage (come si potrà facilmente notare) per individuare e gestire da Gambas ogni singola funzione esterna necessaria. | Mostriamo di seguito un possibile codice che mostra in una ''TextArea'' i dispositivi audio presenti nel sistema. Poiché la libreria ''RtAudio'', come già accennato, è scritta in C++, non è possibile richiamare direttamente nel modo consueto con il comando ''Extern'' le sue necessarie funzioni esterne. Si rende, pertanto, necessario scrivere in C++ in un'apposita libreria condivisa, da noi realizzata, la parte di codice che richiama le predette funzioni esterne della libreria ''RtAudio'', lasciando al codice dell'applicativo Gambas quanto più possibile e in particolare una funzione di coordinamento dell'intero processo. V'è da aggiungere che nell'esempio che segue, poiché non è stato possibile scrivere in autonome routine le varie funzioni esterne della libreria ''RtAudio'', bensì tutte in quella sola principale, si è cercato un escamotage (come si potrà facilmente notare) per individuare e gestire da Gambas ogni singola funzione esterna necessaria. | ||
− | + | Il codice Gambas, che tra l'altro prevede anche un ''Button'' ed una ''TextArea'' posti sul Form, sarà invece il seguente: | |
− | + | Private Extern main(a As Integer, po As Pointer) As Integer In "/tmp/libadhoc" | |
− | |||
− | |||
− | |||
− | |||
− | + | '''Public''' Sub Form_Open() | |
+ | Dim numDisp As Integer | ||
+ | Dim p As Pointer | ||
− | + | <FONT Color=gray>' ''Va a generare la libreria esterna condivisa, scritta in C++ :''</font> | |
− | + | Craso() | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | p = Alloc("getDeviceCount()") | |
− | + | numDisp = main(0, VarPtr(p)) | |
− | + | If numDisp == 0 Then Error.Raise("Impossibile trovare dispositivi audio !") | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | p = Alloc("getDeviceInfo()") | |
− | + | main(0, VarPtr(p)) | |
− | + | TextArea1.Text = "Numero dispositivi audio trovati: " & numDisp & Chr(10) | |
− | + | TextArea1.Text &= String@(p) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | TextArea1.Pos = 0 | ||
− | + | '''End''' | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | '''Public''' Sub Button1_Click() | |
+ | Quit | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
'''End''' | '''End''' | ||
+ | '''Private''' Procedure Creaso() | ||
− | ''' | + | File.Save("/tmp/libadhoc.cpp", "#include <sstream>\n" & |
+ | "#include <string.h>\n" & | ||
+ | "#include <cstdlib>\n" & | ||
+ | "#include \"RtAudio.h\"\n\n" & | ||
+ | "unsigned int devices;\n\n" & | ||
+ | "int main(int c, char** s) {\n\n" & | ||
+ | " RtAudio audio;\n" & | ||
+ | " RtAudio::DeviceInfo info;\n" & | ||
+ | " std::string a, du, de, nf;\n" & | ||
+ | " std::stringstream n, o, e, d, sr;\n" & | ||
+ | " unsigned int i, j;\n\n" & | ||
+ | "/* Determina il numero di dispositivi audio presenti nel sistema */\n" & | ||
+ | " if (strcmp((char *)s[0], \"getDeviceCount()\") == 0) {\n" & | ||
+ | " return devices = audio.getDeviceCount();\n" & | ||
+ | " }\n\n" & | ||
+ | " if (strcmp((char *)s[0], \"getDeviceInfo()\") == 0) {\n" | ||
+ | " for ( unsigned int i=0; i<devices; i++ ) {\n" & | ||
+ | " info = audio.getDeviceInfo( i );\n" & | ||
+ | " if ( info.probed == true ) {\n" & | ||
+ | " n << i;\n" & | ||
+ | " o << info.outputChannels;\n" & | ||
+ | " e << info.inputChannels;\n" & | ||
+ | " d << info.duplexChannels;\n" & | ||
+ | " if (info.isDefaultOutput) du = \"(Canale di Uscita predefinito)\";\n" & | ||
+ | " if (info.isDefaultInput) de = \"(Canale di Entrata predefinito)\";\n" & | ||
+ | " if ( info.nativeFormats > 0 ) {\n" & | ||
+ | " nf = \" - formati di dati audio supportati:\";\n" & | ||
+ | " if ( info.nativeFormats & RTAUDIO_SINT8 )\n" & | ||
+ | " nf = nf + \"\n 8-bit int\";\n" & | ||
+ | " if ( info.nativeFormats & RTAUDIO_SINT16 )\n" & | ||
+ | " nf = nf + \"\n 16-bit int\";\n" & | ||
+ | " if ( info.nativeFormats & RTAUDIO_SINT24 )\n" & | ||
+ | " nf = nf + \"\n 24-bit int\";\n" & | ||
+ | " if ( info.nativeFormats & RTAUDIO_SINT32 )\n" & | ||
+ | " nf = nf + \"\n 32-bit int\";\n" & | ||
+ | " if ( info.nativeFormats & RTAUDIO_FLOAT32 )\n" & | ||
+ | " nf = nf + \"\n 32-bit float\";\n" & | ||
+ | " if ( info.nativeFormats & RTAUDIO_FLOAT64 )\n" & | ||
+ | " nf = nf + \"\n 64-bit float\";\n" & | ||
+ | " }\n\n" & | ||
+ | "/* Vengono unite le stringhe di tipo base */\n" & | ||
+ | " a = a + \"\n\" + n.str() + \" \" + info.name + \":\" +\n" & | ||
+ | " + \"\n - \" + du + \"\n - \" + de +\n" & | ||
+ | " + \"\n - numero massimo di canali di Uscita = \" + o.str() +\n" & | ||
+ | " + \"\n - numero massimo di canali di Entrata = \" + e.str() +\n" & | ||
+ | " + \"\n - numero massimo di canali simultanei 'entrata/uscita' supportati = \" + d.str() +\n" & | ||
+ | " + \"\n\" + nf +\n" & | ||
+ | " + \"\n - frequenze di campionamento supportate: \n\";\n\n" & | ||
+ | " for (j=0; j<info.sampleRates.size(); j++) {\n" & | ||
+ | " sr << info.sampleRates[j];\n" & | ||
+ | " a = a + \" Hz \" + sr.str() + \"\n\";\n" & | ||
+ | " sr.str(\"\");\n" & | ||
+ | " }\n\n" & | ||
+ | "/* Si cancella l'attuale contenuto delle seguenti variabili di tipo stringa */\n" & | ||
+ | " n.str(\"\");\n" & | ||
+ | " o.str(\"\");\n" & | ||
+ | " e.str(\"\");\n" & | ||
+ | " d.str(\"\");\n" & | ||
+ | " du = \"\";\n" & | ||
+ | " de = \"\";\n" & | ||
+ | " nf = \"\";\n" & | ||
+ | " sr.str(\"\");\n" & | ||
+ | " }\n" & | ||
+ | " }\n" & | ||
+ | "/* La variabile base stringa "a" viene convertita nel tipo 'char*', affinché possa essere restituita al codice Gambas attraverso il parametro "char** s" della routine "main()" */\n" & | ||
+ | " char* ritornare = strcpy((char*)malloc(a.length()+1), a.c_str());\n" & | ||
+ | " *s = ritornare;\n" & | ||
+ | " }\n\n" & | ||
+ | " return (0);\n}") | ||
− | + | Shell "g++ -o /tmp/libadhoc.so /tmp/libadhoc.cpp -shared -fPIC -lrtaudio" Wait | |
'''End''' | '''End''' | ||
− | |||
=Riferimenti= | =Riferimenti= | ||
− | * | + | * http://www.music.mcgill.ca/~gary/rtaudio/ |
− | * | + | * http://web.mit.edu/carrien/Public/speechlab/marc_code/ADAPT_VC/rtaudio/doc/html/ |
Versione delle 17:28, 7 dic 2021
La libreria RtAudio è un insieme di classi C++ che fornisce funzionalità per la gestione dei dati Audio in entrata ed in uscita.
E' possibile con alcune funzioni esterne della libreria RtAudio conoscere i dispositivi audio presenti nel sistema e le loro caratteristiche principali. Sarà necessario avere installata nel proprio sistema la libreria condivisa: "librtaudio.so.4.0.12 ".
Mostriamo di seguito un possibile codice che mostra in una TextArea i dispositivi audio presenti nel sistema. Poiché la libreria RtAudio, come già accennato, è scritta in C++, non è possibile richiamare direttamente nel modo consueto con il comando Extern le sue necessarie funzioni esterne. Si rende, pertanto, necessario scrivere in C++ in un'apposita libreria condivisa, da noi realizzata, la parte di codice che richiama le predette funzioni esterne della libreria RtAudio, lasciando al codice dell'applicativo Gambas quanto più possibile e in particolare una funzione di coordinamento dell'intero processo. V'è da aggiungere che nell'esempio che segue, poiché non è stato possibile scrivere in autonome routine le varie funzioni esterne della libreria RtAudio, bensì tutte in quella sola principale, si è cercato un escamotage (come si potrà facilmente notare) per individuare e gestire da Gambas ogni singola funzione esterna necessaria. Il codice Gambas, che tra l'altro prevede anche un Button ed una TextArea posti sul Form, sarà invece il seguente:
Private Extern main(a As Integer, po As Pointer) As Integer In "/tmp/libadhoc" Public Sub Form_Open() Dim numDisp As Integer Dim p As Pointer ' Va a generare la libreria esterna condivisa, scritta in C++ : Craso() p = Alloc("getDeviceCount()") numDisp = main(0, VarPtr(p)) If numDisp == 0 Then Error.Raise("Impossibile trovare dispositivi audio !") p = Alloc("getDeviceInfo()") main(0, VarPtr(p)) TextArea1.Text = "Numero dispositivi audio trovati: " & numDisp & Chr(10) TextArea1.Text &= String@(p) TextArea1.Pos = 0 End Public Sub Button1_Click() Quit End Private Procedure Creaso() File.Save("/tmp/libadhoc.cpp", "#include <sstream>\n" & "#include <string.h>\n" & "#include <cstdlib>\n" & "#include \"RtAudio.h\"\n\n" & "unsigned int devices;\n\n" & "int main(int c, char** s) {\n\n" & " RtAudio audio;\n" & " RtAudio::DeviceInfo info;\n" & " std::string a, du, de, nf;\n" & " std::stringstream n, o, e, d, sr;\n" & " unsigned int i, j;\n\n" & "/* Determina il numero di dispositivi audio presenti nel sistema */\n" & " if (strcmp((char *)s[0], \"getDeviceCount()\") == 0) {\n" & " return devices = audio.getDeviceCount();\n" & " }\n\n" & " if (strcmp((char *)s[0], \"getDeviceInfo()\") == 0) {\n" " for ( unsigned int i=0; i<devices; i++ ) {\n" & " info = audio.getDeviceInfo( i );\n" & " if ( info.probed == true ) {\n" & " n << i;\n" & " o << info.outputChannels;\n" & " e << info.inputChannels;\n" & " d << info.duplexChannels;\n" & " if (info.isDefaultOutput) du = \"(Canale di Uscita predefinito)\";\n" & " if (info.isDefaultInput) de = \"(Canale di Entrata predefinito)\";\n" & " if ( info.nativeFormats > 0 ) {\n" & " nf = \" - formati di dati audio supportati:\";\n" & " if ( info.nativeFormats & RTAUDIO_SINT8 )\n" & " nf = nf + \"\n 8-bit int\";\n" & " if ( info.nativeFormats & RTAUDIO_SINT16 )\n" & " nf = nf + \"\n 16-bit int\";\n" & " if ( info.nativeFormats & RTAUDIO_SINT24 )\n" & " nf = nf + \"\n 24-bit int\";\n" & " if ( info.nativeFormats & RTAUDIO_SINT32 )\n" & " nf = nf + \"\n 32-bit int\";\n" & " if ( info.nativeFormats & RTAUDIO_FLOAT32 )\n" & " nf = nf + \"\n 32-bit float\";\n" & " if ( info.nativeFormats & RTAUDIO_FLOAT64 )\n" & " nf = nf + \"\n 64-bit float\";\n" & " }\n\n" & "/* Vengono unite le stringhe di tipo base */\n" & " a = a + \"\n\" + n.str() + \" \" + info.name + \":\" +\n" & " + \"\n - \" + du + \"\n - \" + de +\n" & " + \"\n - numero massimo di canali di Uscita = \" + o.str() +\n" & " + \"\n - numero massimo di canali di Entrata = \" + e.str() +\n" & " + \"\n - numero massimo di canali simultanei 'entrata/uscita' supportati = \" + d.str() +\n" & " + \"\n\" + nf +\n" & " + \"\n - frequenze di campionamento supportate: \n\";\n\n" & " for (j=0; j<info.sampleRates.size(); j++) {\n" & " sr << info.sampleRates[j];\n" & " a = a + \" Hz \" + sr.str() + \"\n\";\n" & " sr.str(\"\");\n" & " }\n\n" & "/* Si cancella l'attuale contenuto delle seguenti variabili di tipo stringa */\n" & " n.str(\"\");\n" & " o.str(\"\");\n" & " e.str(\"\");\n" & " d.str(\"\");\n" & " du = \"\";\n" & " de = \"\";\n" & " nf = \"\";\n" & " sr.str(\"\");\n" & " }\n" & " }\n" & "/* La variabile base stringa "a" viene convertita nel tipo 'char*', affinché possa essere restituita al codice Gambas attraverso il parametro "char** s" della routine "main()" */\n" & " char* ritornare = strcpy((char*)malloc(a.length()+1), a.c_str());\n" & " *s = ritornare;\n" & " }\n\n" & " return (0);\n}") Shell "g++ -o /tmp/libadhoc.so /tmp/libadhoc.cpp -shared -fPIC -lrtaudio" Wait End