Differenze tra le versioni di "Conoscere con le funzioni esterne di PortAudio i dispositivi audio presenti nel sistema"
Da Gambas-it.org - Wikipedia.
(5 versioni intermedie di uno stesso utente non sono mostrate) | |||
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 | ||
name As Pointer | name As Pointer | ||
+ | hostApi As Integer | ||
maxInputChannels As Integer | maxInputChannels As Integer | ||
maxOutputChannels As Integer | maxOutputChannels As Integer | ||
Riga 17: | Riga 19: | ||
End Struct | 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 paNoError As Integer = 0 | ||
+ | Private Const paInt16 As Long = 8 | ||
+ | Private Const paFormatIsSupported As Integer = 0 | ||
<FONT color=gray>' ''PaError Pa_Initialize(void)'' | <FONT color=gray>' ''PaError Pa_Initialize(void)'' | ||
Riga 42: | Riga 51: | ||
' ''Retrieve the index of the default output device.''</font> | ' ''Retrieve the index of the default output device.''</font> | ||
Private Extern Pa_GetDefaultOutputDevice() As Integer | Private Extern Pa_GetDefaultOutputDevice() As Integer | ||
+ | |||
+ | <FONT color=gray>' ''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.''</font> | ||
+ | Private Extern Pa_IsFormatSupported(ip As PaStreamParameters, op As PaStreamParameters, sampleRate As Float) As Integer | ||
<FONT color=gray>' ''PaError Pa_Terminate(void)'' | <FONT color=gray>' ''PaError Pa_Terminate(void)'' | ||
Riga 52: | Riga 65: | ||
− | + | Public Sub Main() | |
Dim err, i, j, numDevices As Integer | Dim err, i, j, numDevices As Integer | ||
Dim pdi As New PaDeviceInfo | Dim pdi As New PaDeviceInfo | ||
+ | Dim INparametri, EXparametri As New PaStreamParameters | ||
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)) | ||
− | + | 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 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<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 "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 | ||
+ | |||
+ | <FONT color=gray>' ''Va in chiusura:''</font> | ||
+ | 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= | =Riferimenti= | ||
− | * | + | * http://www.portaudio.com/ |
− | * | + | * http://portaudio.com/docs/v19-doxydocs/index.html |
− |
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