Conoscere con le funzioni esterne di RtAudio i dispositivi audio presenti nel sistema

Da Gambas-it.org - Wikipedia.

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


Riferimenti