Differenze tra le versioni di "Conoscere con le funzioni esterne di RtAudio i dispositivi audio presenti nel sistema"
Riga 40: | Riga 40: | ||
"#include <string.h>\n" & | "#include <string.h>\n" & | ||
"#include <cstdlib>\n" & | "#include <cstdlib>\n" & | ||
− | "#include " | + | "#include \"RtAudio.h\"\n\n" & |
"unsigned int devices;\n\n" & | "unsigned int devices;\n\n" & | ||
"int main(int c, char** s) {\n\n" & | "int main(int c, char** s) {\n\n" & | ||
Riga 49: | Riga 49: | ||
" unsigned int i, j;\n\n" & | " unsigned int i, j;\n\n" & | ||
"/* Determina il numero di dispositivi audio presenti nel sistema */\n" & | "/* Determina il numero di dispositivi audio presenti nel sistema */\n" & | ||
− | " if (strcmp((char *)s[0], "getDeviceCount()") == 0) {\n" & | + | " if (strcmp((char *)s[0], \"getDeviceCount()\") == 0) {\n" & |
" return devices = audio.getDeviceCount();\n" & | " return devices = audio.getDeviceCount();\n" & | ||
" }\n\n" & | " }\n\n" & | ||
− | " if (strcmp((char *)s[0], "getDeviceInfo()") == 0) {\n" | + | " if (strcmp((char *)s[0], \"getDeviceInfo()\") == 0) {\n" |
" for ( unsigned int i=0; i<devices; i++ ) {\n" & | " for ( unsigned int i=0; i<devices; i++ ) {\n" & | ||
" info = audio.getDeviceInfo( i );\n" & | " info = audio.getDeviceInfo( i );\n" & | ||
Riga 101: | Riga 101: | ||
" }\n" & | " }\n" & | ||
" }\n" & | " }\n" & | ||
− | "/* La variabile base stringa "a" viene convertita nel tipo 'char*' | + | "/* 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" & | " char* ritornare = strcpy((char*)malloc(a.length()+1), a.c_str());\n" & | ||
" *s = ritornare;\n" & | " *s = ritornare;\n" & |
Versione attuale 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