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

Da Gambas-it.org - Wikipedia.
 
(Una versione intermedia di uno stesso utente non è mostrata)
Riga 1: Riga 1:
 
La libreria '''PortAudio''' è una libreria per la gestione in tempo reale dei dati audio in entrata ed in uscita. Essa fa parte di un assortimento di API e librerie create per la musica e per altri media.
 
La libreria '''PortAudio''' è una libreria per la gestione in tempo reale dei dati audio in entrata ed in uscita. Essa fa parte di un assortimento di API e librerie create per la musica e per altri media.
  
E' possibile con alcune funzioni esterne della libreria ''PortAudio'' conoscere i dispositivi audio presenti nel proprio sistema. Sarà necessario avere installata nel proprio sistema la libreria condivisa: ''libportaudio.so.2.0.0
+
E' possibile con alcune funzioni esterne della libreria ''PortAudio'' conoscere i dispositivi audio presenti nel proprio sistema. Sarà necessario avere installata nel proprio sistema la libreria condivisa: "''libportaudio.so.2.0.0'' ".
 
 
  
 
Mostriamo di seguito un possibile codice:
 
Mostriamo di seguito un possibile codice:
 +
Library "libportaudio:2.0.0"
 +
 
  Public Struct PaDeviceInfo
 
  Public Struct PaDeviceInfo
 
   structVersion As Integer
 
   structVersion As Integer
Riga 25: Riga 26:
 
   hostApiSpecificStreamInfo As Pointer
 
   hostApiSpecificStreamInfo As Pointer
 
  End Struct
 
  End Struct
 
 
 
Library "libportaudio:2.0.0"
 
 
   
 
   
 
  Private Const paNoError As Integer = 0
 
  Private Const paNoError As Integer = 0
Riga 67: Riga 65:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim err, i, j, numDevices As Integer
 
   Dim err, i, j, numDevices As Integer
Riga 74: Riga 72:
 
   Dim defI, defO, ag1, ag2 As String
 
   Dim defI, defO, ag1, ag2 As String
 
   
 
   
 +
  err = Pa_Initialize()
 +
  If err < 0 Then Error.Raise("Impossibile inizializzare la libreria 'PortAudio': " & Pa_GetErrorText(err))
 
   
 
   
  err = Pa_Initialize()
+
  numDevices = Pa_GetDeviceCount()
  If err < 0 Then Error.Raise("Impossibile inizializzare la libreria 'PortAudio': " & Pa_GetErrorText(err))
+
  If numDevices < 0 Then Error.Raise("Impossibile rilevare la presenza di dispositivi audio: " & Pa_GetErrorText(err))
 
  numDevices = Pa_GetDeviceCount()
 
  If numDevices < 0 Then Error.Raise("Impossibile rilevare la presenza di dispositivi audio: " & Pa_GetErrorText(err))
 
 
      
 
      
  Print "Numbero di dispositivi = "; numDevices
+
  Print "Numbero di dispositivi = "; numDevices
 
      
 
      
  For i = 0 To numDevices - 1
+
  For i = 0 To numDevices - 1
     
+
    defI = Null
    defI = Null
+
    defO = Null
    defO = Null
+
    ag1 = Null
    ag1 = Null
+
    ag2 = Null
    ag2 = Null
+
    pdi = Pa_GetDeviceInfo(i)
     
+
    Print "\n--------------------------------------- dispositivo #"; i
    pdi = Pa_GetDeviceInfo(i)
+
    j = 0
     
+
    If i = Pa_GetDefaultInputDevice() Then
    Print "\n--------------------------------------- dispositivo #"; i
+
      defI = "\n[ Default Input"
     
+
      j = 1
    j = 0
+
    Endif
     
+
    If i = Pa_GetDefaultOutputDevice() Then
    If i = Pa_GetDefaultInputDevice() Then
+
      If j Then
      defI = "\n[ Default Input"
+
        ag1 = ","
      j = 1
+
      Else
    Endif
+
        ag1 = "["
   
+
      Endif
    If i = Pa_GetDefaultOutputDevice() Then
+
      defO = " Default Output"
      If j Then
+
      j = 1
        ag1 = ","
+
    Endif
      Else
+
    If j = 1 Then ag2 = " ]"
        ag1 = "["
+
    Print defI; ag1; defO; ag2
      Endif
 
      defO = " Default Output"
 
      j = 1
 
    Endif
 
     
 
    If j = 1 Then ag2 = " ]"
 
     
 
    Print defI; ag1; defO; ag2
 
     
 
 
  <FONT color=gray>' ''Scrive i campi relativi alle informazioni di ciascun dispositivo audio rilevato:''</font>
 
  <FONT color=gray>' ''Scrive i campi relativi alle informazioni di ciascun dispositivo audio rilevato:''</font>
    Print "Nome = "; String@(pdi.name)
+
    Print "Nome = "; String@(pdi.name)
    Print "Max Entrate = "; pdi.maxInputChannels, ", Max Uscite = "; pdi.maxOutputChannels
+
    Print "Max Entrate = "; pdi.maxInputChannels, ", Max Uscite = "; pdi.maxOutputChannels
    Print "Default low input latency = "; pdi.defaultLowInputLatency
+
    Print "Default low input latency = "; pdi.defaultLowInputLatency
    Print "Default low output latency = "; pdi.defaultLowOutputLatency
+
    Print "Default low output latency = "; pdi.defaultLowOutputLatency
    Print "Default high input latency = "; pdi.defaultHighInputLatency
+
    Print "Default high input latency = "; pdi.defaultHighInputLatency
    Print "Default high output latency = "; pdi.defaultHighOutputLatency
+
    Print "Default high output latency = "; pdi.defaultHighOutputLatency
    Print "Default sample rate = ", pdi.defaultSampleRate
+
    Print "Default sample rate = ", pdi.defaultSampleRate
+
    INparametri.device = i
    INparametri.device = i
+
    INparametri.channelCount = pdi.maxInputChannels
    INparametri.channelCount = pdi.maxInputChannels
+
    INparametri.sampleFormat = paInt16
    INparametri.sampleFormat = paInt16
+
    INparametri.suggestedLatency = 0
    INparametri.suggestedLatency = 0
+
    INparametri.hostApiSpecificStreamInfo = 0
    INparametri.hostApiSpecificStreamInfo = 0
+
    EXparametri.device = i
     
+
    EXparametri.channelCount = pdi.maxOutputChannels
    EXparametri.device = i
+
    EXparametri.sampleFormat = paInt16
    EXparametri.channelCount = pdi.maxOutputChannels
+
    EXparametri.suggestedLatency = 0
    EXparametri.sampleFormat = paInt16
+
    EXparametri.hostApiSpecificStreamInfo = 0
    EXparametri.suggestedLatency = 0
+
    If INparametri.channelCount > 0 Then
    EXparametri.hostApiSpecificStreamInfo = 0
+
      Print "Supported standard sample rates\n for half-duplex 16 bit "; INparametri.channelCount; "channel input = "
     
+
      FrequenzeCampionamentoSupportate(INparametri, Null)
    If INparametri.channelCount > 0 Then
+
    Endif
      Print "Supported standard sample rates\n for half-duplex 16 bit "; INparametri.channelCount; "channel input = "
+
    If EXparametri.channelCount > 0 Then
      FrequenzeCampionamentoSupportate(INparametri, Null)
+
      Print "Supported standard sample rates\n for half-duplex 16 bit "; EXparametri.channelCount; "channel input = "
    Endif
+
      FrequenzeCampionamentoSupportate(Null, EXparametri)
     
+
    Endif
    If EXparametri.channelCount > 0 Then
+
    If (INparametri.channelCount > 0) And (EXparametri.channelCount > 0) Then
      Print "Supported standard sample rates\n for half-duplex 16 bit "; EXparametri.channelCount; "channel input = "
+
      Print "Supported standard sample rates\n for full-duplex 16 bit "; INparametri.channelCount; "channel Input , "; EXparametri.channelCount; " channel Output = "
      FrequenzeCampionamentoSupportate(Null, EXparametri)
+
      FrequenzeCampionamentoSupportate(INparametri, EXparametri)
    Endif
+
    Endif
     
+
  Next
    If (INparametri.channelCount > 0) And (EXparametri.channelCount > 0) Then
 
      Print "Supported standard sample rates\n for full-duplex 16 bit "; INparametri.channelCount; "channel Input , "; EXparametri.channelCount; " channel Output = "
 
      FrequenzeCampionamentoSupportate(INparametri, EXparametri)
 
    Endif
 
 
    
 
    
  Next
 
   
 
 
 
  <FONT color=gray>' ''Va in chiusura:''</font>  
 
  <FONT color=gray>' ''Va in chiusura:''</font>  
  Pa_Terminate()
+
  Pa_Terminate()
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Procedure FrequenzeCampionamentoSupportate(inputParameters As PaStreamParameters, outputParameters As PaStreamParameters)
+
  Private Procedure FrequenzeCampionamentoSupportate(inputParameters As PaStreamParameters, outputParameters As PaStreamParameters)
 
   
 
   
 
   Dim standardSampleRates As Float[] = [8000.0, 9600.0, 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, 44100.0, 48000.0, 88200.0, 96000.0, 192000.0, -1]
 
   Dim standardSampleRates As Float[] = [8000.0, 9600.0, 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, 44100.0, 48000.0, 88200.0, 96000.0, 192000.0, -1]
 
   Dim i, printCount, err As Integer
 
   Dim i, printCount, err As Integer
 
 
   
 
   
 
   For i = 0 To standardSampleRates.Max
 
   For i = 0 To standardSampleRates.Max
 
 
 
     err = Pa_IsFormatSupported(inputParameters, outputParameters, standardSampleRates[i])
 
     err = Pa_IsFormatSupported(inputParameters, outputParameters, standardSampleRates[i])
 
     If err = paFormatIsSupported
 
     If err = paFormatIsSupported
Riga 174: Riga 153:
 
         printCount = 1
 
         printCount = 1
 
       Else If printCount = 4 Then
 
       Else If printCount = 4 Then
          Print standardSampleRates[i]
+
        Print standardSampleRates[i]
          printCount = 1
+
        printCount = 1
 
       Else
 
       Else
          Print standardSampleRates[i]
+
        Print standardSampleRates[i]
          Inc printCount
+
        Inc printCount
 
       Endif
 
       Endif
 
     Endif
 
     Endif
Riga 189: Riga 168:
 
   Endif
 
   Endif
 
    
 
    
  '''End'''
+
  End
  
  
  
 
=Riferimenti=
 
=Riferimenti=
* [http://www.portaudio.com/ Il sito di PortAudio]
+
* http://www.portaudio.com/
* [http://portaudio.com/docs/v19-doxydocs/index.html La pagina del API di PortAudio 2.0]
+
* http://portaudio.com/docs/v19-doxydocs/index.html
* [http://ispac.ing.uniroma1.it/scarpiniti/files/LabEMM/Less9.pdf Una introduzione a PortAudio]
 

Versione attuale delle 12:20, 13 gen 2024

La libreria PortAudio è una libreria per la gestione in tempo reale dei dati audio in entrata ed in uscita. Essa fa parte di un assortimento di API e librerie create per la musica e per altri media.

E' possibile con alcune funzioni esterne della libreria PortAudio conoscere i dispositivi audio presenti nel proprio sistema. Sarà necessario avere installata nel proprio sistema la libreria condivisa: "libportaudio.so.2.0.0 ".

Mostriamo di seguito un possibile codice:

Library "libportaudio:2.0.0"

Public Struct PaDeviceInfo
  structVersion As Integer
  name As Pointer
  hostApi As Integer
  maxInputChannels As Integer
  maxOutputChannels As Integer
  defaultLowInputLatency As Float
  defaultLowOutputLatency As Float
  defaultHighInputLatency As Float
  defaultHighOutputLatency As Float
  defaultSampleRate As Float
End Struct

Public Struct PaStreamParameters
  device As Integer
  channelCount As Integer
  sampleFormat As Long
  suggestedLatency As Float
  hostApiSpecificStreamInfo As Pointer
End Struct

Private Const paNoError As Integer = 0
Private Const paInt16 As Long = 8
Private Const paFormatIsSupported As Integer = 0

' PaError Pa_Initialize(void)
' Library initialization function - call this before using PortAudio.
' This function initializes internal data structures and prepares underlying host APIs for use.
Private Extern Pa_Initialize() As Integer

' PaDeviceIndex Pa_GetDeviceCount(void)
' Retrieve the number of available devices. The number of available devices may be zero.
Private Extern Pa_GetDeviceCount() As Integer

' const PaDeviceInfo * Pa_GetDeviceInfo(PaDeviceIndex device)
' Retrieve a pointer to a PaDeviceInfo structure containing information about the specified device.
Private Extern Pa_GetDeviceInfo(device As Integer) As PaDeviceInfo

' PaDeviceIndex Pa_GetDefaultInputDevice(void)
' Retrieve the index of the default input device.
Private Extern Pa_GetDefaultInputDevice() As Integer

' PaDeviceIndex Pa_GetDefaultOutputDevice(void)
' Retrieve the index of the default output device.
Private Extern Pa_GetDefaultOutputDevice() As Integer

' PaError Pa_IsFormatSupported(const PaStreamParameters *inputParameters, const PaStreamParameters *outputParameters, double sampleRate)
' Determine whether it would be possible to open a stream with the specified parameters.
Private Extern Pa_IsFormatSupported(ip As PaStreamParameters, op As PaStreamParameters, sampleRate As Float) As Integer

' PaError Pa_Terminate(void)
' Library termination function - call this when finished using PortAudio.
Private Extern Pa_Terminate() As Integer

' const char *Pa_GetErrorText(PaError errnum)
' Translates the supplied PortAudio error number into a human readable message.
Private Extern Pa_GetErrorText(errnum As Integer) As String


Public Sub Main()

 Dim err, i, j, numDevices As Integer
 Dim pdi As New PaDeviceInfo
 Dim INparametri, EXparametri As New PaStreamParameters
 Dim defI, defO, ag1, ag2 As String

 err = Pa_Initialize()
 If err < 0 Then Error.Raise("Impossibile inizializzare la libreria 'PortAudio': " & Pa_GetErrorText(err))

 numDevices = Pa_GetDeviceCount()
 If numDevices < 0 Then Error.Raise("Impossibile rilevare la presenza di dispositivi audio: " & Pa_GetErrorText(err))
   
 Print "Numbero di dispositivi = "; numDevices
   
 For i = 0 To numDevices - 1
   defI = Null
   defO = Null
   ag1 = Null
   ag2 = Null
   pdi = Pa_GetDeviceInfo(i)
   Print "\n--------------------------------------- dispositivo #"; i
   j = 0
   If i = Pa_GetDefaultInputDevice() Then
     defI = "\n[ Default Input"
     j = 1
   Endif
   If i = Pa_GetDefaultOutputDevice() Then
     If j Then
       ag1 = ","
     Else
       ag1 = "["
     Endif
     defO = " Default Output"
     j = 1
   Endif
   If j = 1 Then ag2 = " ]"
   Print defI; ag1; defO; ag2
' Scrive i campi relativi alle informazioni di ciascun dispositivo audio rilevato:
   Print "Nome = "; String@(pdi.name)
   Print "Max Entrate = "; pdi.maxInputChannels, ", Max Uscite = "; pdi.maxOutputChannels
   Print "Default low input latency = "; pdi.defaultLowInputLatency
   Print "Default low output latency = "; pdi.defaultLowOutputLatency
   Print "Default high input latency = "; pdi.defaultHighInputLatency
   Print "Default high output latency = "; pdi.defaultHighOutputLatency
   Print "Default sample rate = ", pdi.defaultSampleRate
   INparametri.device = i
   INparametri.channelCount = pdi.maxInputChannels
   INparametri.sampleFormat = paInt16
   INparametri.suggestedLatency = 0
   INparametri.hostApiSpecificStreamInfo = 0
   EXparametri.device = i
   EXparametri.channelCount = pdi.maxOutputChannels
   EXparametri.sampleFormat = paInt16
   EXparametri.suggestedLatency = 0
   EXparametri.hostApiSpecificStreamInfo = 0
   If INparametri.channelCount > 0 Then
     Print "Supported standard sample rates\n for half-duplex 16 bit "; INparametri.channelCount; "channel input = "
     FrequenzeCampionamentoSupportate(INparametri, Null)
   Endif
   If EXparametri.channelCount > 0 Then
     Print "Supported standard sample rates\n for half-duplex 16 bit "; EXparametri.channelCount; "channel input = "
     FrequenzeCampionamentoSupportate(Null, EXparametri)
   Endif
   If (INparametri.channelCount > 0) And (EXparametri.channelCount > 0) Then
     Print "Supported standard sample rates\n for full-duplex 16 bit "; INparametri.channelCount; "channel Input , "; EXparametri.channelCount; " channel Output = "
     FrequenzeCampionamentoSupportate(INparametri, EXparametri)
   Endif
 Next
 
' Va in chiusura: 
 Pa_Terminate()

End


Private Procedure FrequenzeCampionamentoSupportate(inputParameters As PaStreamParameters, outputParameters As PaStreamParameters)

 Dim standardSampleRates As Float[] = [8000.0, 9600.0, 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, 44100.0, 48000.0, 88200.0, 96000.0, 192000.0, -1]
 Dim i, printCount, err As Integer

 For i = 0 To standardSampleRates.Max
   err = Pa_IsFormatSupported(inputParameters, outputParameters, standardSampleRates[i])
   If err = paFormatIsSupported
     If printCount = 0
       Print standardSampleRates[i]
       printCount = 1
     Else If printCount = 4 Then
       Print standardSampleRates[i]
       printCount = 1
     Else
       Print standardSampleRates[i]
       Inc printCount
     Endif
   Endif
 Next

 If Not printCount Then
   Print "Nessuno\n"
 Else
   Print "\n"
 Endif
 
End


Riferimenti