Differenze tra le versioni di "Conoscere con le funzioni esterne di RtAudio i dispositivi audio presenti nel sistema"

Da Gambas-it.org - Wikipedia.
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:
La libreria esterna, da noi scritta, il cui sorgente in linguaggio C++ chiameremo ad esempio ''libadhoc.cpp'' è la seguente:
+
  Private Extern main(a As Integer, po As Pointer) As Integer In "/tmp/libadhoc"
  #include <sstream>
 
#include <string.h>
 
#include <cstdlib>
 
#include "RtAudio.h"
 
 
   
 
   
 
   
 
   
  unsigned int devices;
+
  '''Public''' Sub Form_Open()
 
   
 
   
 +
  Dim numDisp As Integer
 +
  Dim p As Pointer
 
   
 
   
  int main(int c, char** s) {
+
  <FONT Color=gray>' ''Va a generare la libreria esterna condivisa, scritta in C++ :''</font>
+
  Craso()
  RtAudio audio;
 
  RtAudio::DeviceInfo info;
 
  std::string a, du, de, nf;
 
  std::stringstream n, o, e, d, sr;
 
  unsigned int i, j;
 
 
 
  <FONT color=gray>/* Determina il numero di dispositivi audio presenti nel sistema */</font>
 
  if (strcmp((char *)s[0], "getDeviceCount()") == 0) {
 
    return devices = audio.getDeviceCount();
 
  }
 
 
 
   
 
   
  if (strcmp((char *)s[0], "getDeviceInfo()") == 0) {
+
  p = Alloc("getDeviceCount()")
    for ( unsigned int i=0; i<devices; i++ ) {
+
   numDisp = main(0, VarPtr(p))
      info = audio.getDeviceInfo( i );
+
   If numDisp == 0 Then Error.Raise("Impossibile trovare dispositivi audio !")
      if ( info.probed == true ) {
 
        n << i;
 
        o << info.outputChannels;
 
        e << info.inputChannels;
 
        d << info.duplexChannels;
 
        if (info.isDefaultOutput) du = "(Canale di Uscita predefinito)";
 
        if (info.isDefaultInput) de = "(Canale di Entrata predefinito)";
 
        if ( info.nativeFormats > 0 ) {
 
          nf = " - formati di dati audio supportati:";
 
          if ( info.nativeFormats & RTAUDIO_SINT8 )
 
            nf = nf + "\n   8-bit int";
 
          if ( info.nativeFormats & RTAUDIO_SINT16 )
 
            nf = nf + "\n  16-bit int";
 
          if ( info.nativeFormats & RTAUDIO_SINT24 )
 
            nf = nf + "\n  24-bit int";
 
          if ( info.nativeFormats & RTAUDIO_SINT32 )
 
            nf = nf + "\n  32-bit int";
 
          if ( info.nativeFormats & RTAUDIO_FLOAT32 )
 
            nf = nf + "\n  32-bit float";
 
          if ( info.nativeFormats & RTAUDIO_FLOAT64 )
 
            nf = nf + "\n   64-bit float";
 
        }
 
<FONT color=gray>/* Vengono unite le stringhe di tipo base */</font>
 
        a = a + "\n" + n.str() + "  " + info.name + ":" +
 
        + "\n - " + du + "\n - " + de +
 
        + "\n - numero massimo di canali di Uscita = " + o.str() +
 
        + "\n - numero massimo di canali di Entrata = " + e.str() +
 
        + "\n - numero massimo di canali simultanei 'entrata/uscita' supportati = " + d.str() +
 
        + "\n" + nf +
 
        + "\n - frequenze di campionamento supportate: \n";
 
       
 
        for (j=0; j<info.sampleRates.size(); j++) {
 
          sr << info.sampleRates[j];
 
          a = a + "   Hz " + sr.str() + "\n";
 
          sr.str("");
 
        }
 
 
   
 
   
<FONT color=gray>/* Si cancella l'attuale contenuto delle seguenti variabili di tipo ''stringa'' */</font>
+
  p = Alloc("getDeviceInfo()")
        n.str("");
+
  main(0, VarPtr(p))
        o.str("");
+
  TextArea1.Text = "Numero dispositivi audio trovati: " & numDisp & Chr(10)
        e.str("");
+
  TextArea1.Text &= String@(p)
        d.str("");
 
        du = "";
 
        de = "";
 
        nf = "";
 
        sr.str("");
 
      }
 
    }
 
<FONT color=gray>/* 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()" */</font>
 
    char* ritornare = strcpy((char*)malloc(a.length()+1), a.c_str());
 
    *s =  ritornare;
 
  }
 
 
   
 
   
 +
  TextArea1.Pos = 0
 
    
 
    
  return (0);
+
  '''End'''
 
 
  }
 
Tale sorgente, da noi scritto, della libreria condivisa sarà posto ad esempio nella cartella "''Dati''" dell'applicativo.
 
 
 
 
 
Il codice dell'applicativo Gambas, che tra l'altro prevede anche un ''Button'' ed una ''TextArea'' posti sul Form, sarà invece il seguente:
 
Library "/tmp/libadhoc"
 
 
   
 
   
  Private Extern main(a As Integer, po As Pointer) As Integer
+
  '''Public''' Sub Button1_Click()
 
   
 
   
 +
  Quit
 
   
 
   
'''Public''' Sub Form_Open()
 
 
  Dim numDisp As Integer
 
  Dim p As Pointer
 
 
 
  Shell "g++ -o /tmp/libadhoc.so " & Application.Path &/ "libadhoc.cpp -shared -fPIC -lrtaudio" Wait
 
 
  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'''
 
  '''End'''
 
   
 
   
 +
'''Private''' Procedure Creaso()
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  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}")
 
   
 
   
   Quit
+
   Shell "g++ -o /tmp/libadhoc.so /tmp/libadhoc.cpp -shared -fPIC -lrtaudio" Wait
 
   
 
   
 
  '''End'''
 
  '''End'''
 
  
  
  
 
=Riferimenti=
 
=Riferimenti=
* [http://www.music.mcgill.ca/~gary/rtaudio/ Il sito di RtAudio]
+
* http://www.music.mcgill.ca/~gary/rtaudio/
* [http://web.mit.edu/carrien/Public/speechlab/marc_code/ADAPT_VC/rtaudio/doc/html/ RtAudio Tutorial]
+
* http://web.mit.edu/carrien/Public/speechlab/marc_code/ADAPT_VC/rtaudio/doc/html/

Versione delle 17:24, 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


Riferimenti