Differenze tra le versioni di "Conoscere con le funzioni esterne di ALSA i dispositivi Midi presenti nel sistema"

Da Gambas-it.org - Wikipedia.
(Creata pagina con 'Alcune funzioni esterne del API di Alsa consentono di conoscere i dispositivi Midi dell'hardware audio presenti nel proprio sistema, con i quali poter ricevere ed inviare dati...')
 
Riga 3: Riga 3:
  
 
Mostriamo di seguito un esempio:
 
Mostriamo di seguito un esempio:
 +
Library "libasound:2"
 +
 +
 +
<FONT color=gray>' ''int snd_card_next (int *card)''
 +
' ''Try To determine the Next card.''</font>
 +
Private Extern snd_card_next(card As Pointer) As Integer
 +
 +
<FONT color=gray>' ''int  snd_ctl_open (snd_ctl_t **ctl, const char *name, int mode)
 +
' ''Opens a CTL.''</font>
 +
Private Extern snd_ctl_open(card As Pointer, name As String, mode As Integer) As Integer
 +
 +
<FONT color=gray>' ''int  snd_ctl_rawmidi_next_device (snd_ctl_t *ctl, int *device)''
 +
' ''Get Next RawMidi device number.''</font>
 +
Private Extern snd_ctl_rawmidi_next_device(ctl As Pointer, device As Pointer) As Integer
 +
 +
<FONT color=gray>' ''int  snd_rawmidi_info_malloc (snd_rawmidi_info_t **ptr)''
 +
' ''Allocate a New Snd_rawmidi_info_t structure.''</font>
 +
Private Extern snd_rawmidi_info_malloc(ptr As Pointer) As Integer
 +
 +
<FONT color=gray>' ''size_t snd_rawmidi_info_sizeof (void)''
 +
' ''Get size Of the 'snd_rawmidi_info_t' structure in bytes.''</font>
 +
Private Extern snd_rawmidi_info_sizeof() As Integer
 +
 +
<FONT color=gray>' ''void snd_rawmidi_info_set_device (snd_rawmidi_info_t *obj, unsigned int val)''
 +
' ''Set rawmidi device number.''</font>
 +
Private Extern snd_rawmidi_info_set_device(obj As Pointer, ValInt As Integer)
 +
 +
<FONT color=gray>' ''void snd_rawmidi_info_set_stream (snd_rawmidi_info_t *obj, snd_rawmidi_stream_t val)''
 +
' ''Set rawmidi stream identifier.''</font>
 +
Private Extern snd_rawmidi_info_set_stream(obj As Pointer, ValInt As Integer)
 +
 +
<FONT color=gray>' ''void snd_rawmidi_info_set_subdevice (snd_rawmidi_info_t *obj, unsigned int val)''
 +
' ''Set rawmidi subdevice number.''</font>
 +
Private Extern snd_rawmidi_info_set_subdevice(obj As Pointer, ValInt As Integer)
 +
 +
<FONT color=gray>' ''int snd_ctl_rawmidi_info (snd_ctl_t *ctl, snd_rawmidi_info_t *info)''
 +
' ''Get info about a RawMidi device.''</font>
 +
Private Extern snd_ctl_rawmidi_info(ctl As Pointer, info As Pointer) As Integer
 +
 +
<FONT color=gray>' ''int snd_ctl_close (snd_ctl_t *ctl)''
 +
' ''Closes CTL handle.''</font>
 +
Private Extern snd_ctl_close(ctl As Pointer) As Integer
 +
 +
<FONT color=gray>' ''int snd_config_update_free_global (void)''
 +
' ''Frees the global configuration tree In snd_config.''</font>
 +
Private Extern snd_config_update_free_global() As Integer
 +
 +
<FONT color=gray>' ''void *memset(void *str, int c, size_t n)''
 +
' ''Copies the character c (an unsigned char) to the first n characters of the string pointed to by the argument str.''</font>
 +
Private Extern memset(StrP As Pointer, c As Integer, n As Integer) As Pointer In "libc:6"
 +
 +
 +
'''Public''' Sub Main()
 +
 +
  Dim err, cardNum, devNum, subDevCount, i As Integer
 +
  Dim cardHandle, rawMidiInfo As Pointer
 +
  Dim $str As String
 +
  Dim j, k As Byte
 +
  Dim SND_RAWMIDI_STREAM_OUTPUT As Byte = 0
 +
 
 +
 +
  Print "---- DISPOSITIVI HARDWARE MIDI PRESENTI ----\n"
 +
 
 +
  cardNum = -1
 +
 
 +
 
 +
  While True
 +
 +
    err = snd_card_next(VarPtr(cardNum))
 +
    If err < 0 Then Error.Raise("Impossibile ottenere il numero della scheda audio successiva !")
 +
   
 +
<FONT color=gray>' ''Se non vi sono più schede, Alsa imposta "cardNum" a -1:''</font>
 +
    If cardNum < 0 Then Exit
 +
     
 +
    $str = "hw:" & CStr(cardNum)
 +
 +
    err = snd_ctl_open(VarPtr(cardHandle), $Str, 0)
 +
    If err < 0 Then Error.Raise("Impossibile aprire la connessione con la scheda audio !")
 +
       
 +
<FONT color=gray>' ''Parte con il primo dispositivo Midi sulla scheda individuata:''</font>
 +
    devNum = -1
 +
 +
      While True
 +
 +
<FONT color=gray>' ''Ricava il numero del successivo dispositivo Midi sulla scheda attuale:''</font>
 +
        err = snd_ctl_rawmidi_next_device(cardHandle, VarPtr(devNum))
 +
        If err < 0 Then Error.Raise("Impossibile ottenere il numero del successivo dispositivo Midi !")
 +
 +
<FONT color=gray>' ''Se non ci sono altri dispositivi Midi sulla scheda audio, Alsa imposta "devNum" a -1.''
 +
' ''NOTA: E' possibile che la scheda audio (ad esempio una scheda audio digitale) possa non avere dispositivi Midi:''</font>
 +
        If devNum < 0 Then Exit
 +
       
 +
<FONT color=gray>' ''Per ottenere informazioni sui sub-dispositivi del presente dispositivo Midi (sulla scheda),''
 +
' ''bisogna chiamare la funzione "snd_rawmidi_info_t", previa allocazione di memeoria sullo stack:''</font>
 +
        snd_rawmidi_info_malloc(VarPtr(rawMidiInfo))
 +
        memset(rawMidiInfo, 0, snd_rawmidi_info_sizeof())
 +
         
 +
<FONT color=gray>' ''Si dice ad Alsa di quale numero di dispositivo vogliamo ottenere informazioni:''</font>
 +
        snd_rawmidi_info_set_device(rawMidiInfo, devNum)
 +
       
 +
<FONT color=gray>' ''Si ottengono le informazioni Midi del dispositivo:''</font>
 +
        snd_rawmidi_info_set_stream(rawMidiInfo, SND_RAWMIDI_STREAM_OUTPUT)
 +
       
 +
        i = -1
 +
       
 +
        subDevCount = 1
 +
       
 +
        While (i < subDevCount - 1)
 +
          Inc i
 +
<FONT color=gray>' ''Si dice ad Alsa di riempire la funzione "our snd_rawmidi_info_t" con le informazioni sul presente sub-dispositivo:''</font>
 +
          snd_rawmidi_info_set_subdevice(rawMidiInfo, i)
 +
          err = snd_ctl_rawmidi_info(cardHandle, rawMidiInfo)
 +
          If err < 0 Then Error.Raise("Impossibile ottenere informazioni dal subdispositivo Midi output !")
 +
             
 +
<FONT color=gray>' ''NOTA: Se v'è un solo subdevice, allora il numero del subdispositivo è virtuale,''
 +
' ''e può essere omesso quando viene specificato il nome dell'hardware Midi:''</font>
 +
          If subDevCount > 1 Then
 +
            Print "hw:"; cardNum; ","; devNum; ","; i; Chr(10)
 +
          Else
 +
            Print"hw:"; cardNum; ","; devNum; Chr(10)
 +
          Endif
 +
        Wend
 +
       
 +
       
 +
      Wend
 +
 +
    snd_ctl_close(cardHandle)
 +
   
 +
  Wend
 +
 +
  snd_config_update_free_global()
 +
 +
'''End'''
  
 
+
Per vedere il funzionamento pratico di questo codice esemplificativo, lanciare il codice dopo aver collegato una tastiera Midi estern al proprio computer.
 
 
 
 
<FONT color=red size=4><B>Pagina in costruzione !</b></font>
 

Versione delle 13:08, 28 mag 2014

Alcune funzioni esterne del API di Alsa consentono di conoscere i dispositivi Midi dell'hardware audio presenti nel proprio sistema, con i quali poter ricevere ed inviare dati Midi grezzi.


Mostriamo di seguito un esempio:

Library "libasound:2"


' int snd_card_next (int *card)
' Try To determine the Next card.
Private Extern snd_card_next(card As Pointer) As Integer

' int   snd_ctl_open (snd_ctl_t **ctl, const char *name, int mode)
' Opens a CTL.
Private Extern snd_ctl_open(card As Pointer, name As String, mode As Integer) As Integer

' int   snd_ctl_rawmidi_next_device (snd_ctl_t *ctl, int *device)
' Get Next RawMidi device number.
Private Extern snd_ctl_rawmidi_next_device(ctl As Pointer, device As Pointer) As Integer

' int   snd_rawmidi_info_malloc (snd_rawmidi_info_t **ptr)
' Allocate a New Snd_rawmidi_info_t structure.
Private Extern snd_rawmidi_info_malloc(ptr As Pointer) As Integer

' size_t snd_rawmidi_info_sizeof (void)
' Get size Of the 'snd_rawmidi_info_t' structure in bytes.
Private Extern snd_rawmidi_info_sizeof() As Integer

' void snd_rawmidi_info_set_device (snd_rawmidi_info_t *obj, unsigned int val)
' Set rawmidi device number.
Private Extern snd_rawmidi_info_set_device(obj As Pointer, ValInt As Integer)

' void snd_rawmidi_info_set_stream (snd_rawmidi_info_t *obj, snd_rawmidi_stream_t val)
' Set rawmidi stream identifier.
Private Extern snd_rawmidi_info_set_stream(obj As Pointer, ValInt As Integer)

' void snd_rawmidi_info_set_subdevice (snd_rawmidi_info_t *obj, unsigned int val)
' Set rawmidi subdevice number.
Private Extern snd_rawmidi_info_set_subdevice(obj As Pointer, ValInt As Integer)

' int snd_ctl_rawmidi_info (snd_ctl_t *ctl, snd_rawmidi_info_t *info)
' Get info about a RawMidi device.
Private Extern snd_ctl_rawmidi_info(ctl As Pointer, info As Pointer) As Integer

' int snd_ctl_close (snd_ctl_t *ctl)
' Closes CTL handle.
Private Extern snd_ctl_close(ctl As Pointer) As Integer

' int snd_config_update_free_global (void)
' Frees the global configuration tree In snd_config.
Private Extern snd_config_update_free_global() As Integer

' void *memset(void *str, int c, size_t n)
' Copies the character c (an unsigned char) to the first n characters of the string pointed to by the argument str.
Private Extern memset(StrP As Pointer, c As Integer, n As Integer) As Pointer In "libc:6"


Public Sub Main()

 Dim err, cardNum, devNum, subDevCount, i As Integer
 Dim cardHandle, rawMidiInfo As Pointer
 Dim $str As String
 Dim j, k As Byte
 Dim SND_RAWMIDI_STREAM_OUTPUT As Byte = 0
 

  Print "---- DISPOSITIVI HARDWARE MIDI PRESENTI ----\n"
 
  cardNum = -1
 
 
  While True

    err = snd_card_next(VarPtr(cardNum))
    If err < 0 Then Error.Raise("Impossibile ottenere il numero della scheda audio successiva !")
   
' Se non vi sono più schede, Alsa imposta "cardNum" a -1:
    If cardNum < 0 Then Exit
     
    $str = "hw:" & CStr(cardNum)

    err = snd_ctl_open(VarPtr(cardHandle), $Str, 0)
    If err < 0 Then Error.Raise("Impossibile aprire la connessione con la scheda audio !")
       
' Parte con il primo dispositivo Midi sulla scheda individuata:
    devNum = -1

     While True

' Ricava il numero del successivo dispositivo Midi sulla scheda attuale:
       err = snd_ctl_rawmidi_next_device(cardHandle, VarPtr(devNum))
       If err < 0 Then Error.Raise("Impossibile ottenere il numero del successivo dispositivo Midi !")

' Se non ci sono altri dispositivi Midi sulla scheda audio, Alsa imposta "devNum" a -1.
' NOTA: E' possibile che la scheda audio (ad esempio una scheda audio digitale) possa non avere dispositivi Midi:
       If devNum < 0 Then Exit
       
' Per ottenere informazioni sui sub-dispositivi del presente dispositivo Midi (sulla scheda),
' bisogna chiamare la funzione "snd_rawmidi_info_t", previa allocazione di memeoria sullo stack:
       snd_rawmidi_info_malloc(VarPtr(rawMidiInfo))
       memset(rawMidiInfo, 0, snd_rawmidi_info_sizeof())
         
' Si dice ad Alsa di quale numero di dispositivo vogliamo ottenere informazioni:
       snd_rawmidi_info_set_device(rawMidiInfo, devNum)
        
' Si ottengono le informazioni Midi del dispositivo:
       snd_rawmidi_info_set_stream(rawMidiInfo, SND_RAWMIDI_STREAM_OUTPUT)
       
       i = -1
       
       subDevCount = 1
       
       While (i < subDevCount - 1)
         Inc i
' Si dice ad Alsa di riempire la funzione "our snd_rawmidi_info_t" con le informazioni sul presente sub-dispositivo:
         snd_rawmidi_info_set_subdevice(rawMidiInfo, i)
         err = snd_ctl_rawmidi_info(cardHandle, rawMidiInfo)
         If err < 0 Then Error.Raise("Impossibile ottenere informazioni dal subdispositivo Midi output !")
             
' NOTA: Se v'è un solo subdevice, allora il numero del subdispositivo è virtuale,
' e può essere omesso quando viene specificato il nome dell'hardware Midi:
         If subDevCount > 1 Then
           Print "hw:"; cardNum; ","; devNum; ","; i; Chr(10)
         Else
           Print"hw:"; cardNum; ","; devNum; Chr(10)
         Endif
       Wend
       
       
     Wend

    snd_ctl_close(cardHandle)
   
  Wend

  snd_config_update_free_global()

End

Per vedere il funzionamento pratico di questo codice esemplificativo, lanciare il codice dopo aver collegato una tastiera Midi estern al proprio computer.