Conoscere le proprietà di un drive CD con le funzioni del API di libcdio

Da Gambas-it.org - Wikipedia.

La libreria Libcdio consente di gestire i CD ed i relativi driver presenti nel sistema.

Per utilizzare le funzioni esterne del API di libcdio sarà necessario richiamare l'attuale libreria: "libcdio.so.18.0.0".


Mostriamo un semplice codice che consentirà di conoscere le proprietà hardware di un drive CD:

Library "libcdio:18.0.0"

Private Enum DRIVER_UNKNOWN = 0, DRIVER_AIX, DRIVER_FREEBSD, DRIVER_NETBSD, DRIVER_LINUX, DRIVER_SOLARIS,
             DRIVER_OSX, DRIVER_WIN32, DRIVER_CDRDAO, DRIVER_BINCUE, DRIVER_NRG, DRIVER_DEVICE

Private Enum CDIO_DRIVE_CAP_ERROR = &40000, CDIO_DRIVE_CAP_UNKNOWN = &80000, CDIO_DRIVE_CAP_MISC_CLOSE_TRAY = &00001, CDIO_DRIVE_CAP_MISC_EJECT = &00002, CDIO_DRIVE_CAP_MISC_LOCK = &00004,
             CDIO_DRIVE_CAP_MISC_SELECT_SPEED = &00008, CDIO_DRIVE_CAP_MISC_SELECT_DISC = &00010, CDIO_DRIVE_CAP_MISC_MULTI_SESSION = &00020, CDIO_DRIVE_CAP_MISC_MEDIA_CHANGED = &00080,
             CDIO_DRIVE_CAP_MISC_RESET = &00100, CDIO_DRIVE_CAP_MISC_FILE = &20000
             
Private Enum CDIO_DRIVE_CAP_READ_AUDIO = &00001, CDIO_DRIVE_CAP_READ_CD_DA = &00002, CDIO_DRIVE_CAP_READ_CD_G = &00004, CDIO_DRIVE_CAP_READ_CD_R = &00008,
             CDIO_DRIVE_CAP_READ_CD_RW = &00010, CDIO_DRIVE_CAP_READ_DVD_R = &00020, CDIO_DRIVE_CAP_READ_DVD_PR = &00040, CDIO_DRIVE_CAP_READ_DVD_RAM = &00080,
             CDIO_DRIVE_CAP_READ_DVD_ROM = &00100, CDIO_DRIVE_CAP_READ_DVD_RW = &00200, CDIO_DRIVE_CAP_READ_DVD_RPW = &00400, CDIO_DRIVE_CAP_READ_C2_ERRS = &00800,
             CDIO_DRIVE_CAP_READ_MODE2_FORM1 = &01000, CDIO_DRIVE_CAP_READ_MODE2_FORM2 = &02000, CDIO_DRIVE_CAP_READ_MCN = &04000, CDIO_DRIVE_CAP_READ_ISRC = &08000
 
Private Enum CDIO_DRIVE_CAP_WRITE_CD_R = &00001, CDIO_DRIVE_CAP_WRITE_CD_RW = &00002, CDIO_DRIVE_CAP_WRITE_DVD_R = &00004, CDIO_DRIVE_CAP_WRITE_DVD_PR = &00008,
             CDIO_DRIVE_CAP_WRITE_DVD_RAM = &00010, CDIO_DRIVE_CAP_WRITE_DVD_RW = &00020, CDIO_DRIVE_CAP_WRITE_DVD_RPW = &00040, CDIO_DRIVE_CAP_WRITE_MT_RAINIER = &00080,
             CDIO_DRIVE_CAP_WRITE_BURN_PROOF = &00100, CDIO_DRIVE_CAP_WRITE_CD = 3, CDIO_DRIVE_CAP_WRITE_DVD = 124, CDIO_DRIVE_CAP_WRITE = 127
           
' CdIo_t * cdio_open (const char *psz_source, driver_id_t driver_id)
' Sets up to read from place specified by psz_source and driver_id.
Private Extern cdio_open(psz_source As String, driver_id As Integer) As Pointer

' char* cdio_get_default_device(const CdIo_t * p_cdio)
' Get the default CD device.
Private Extern cdio_get_default_device(cdioP As Pointer) As String

' const char* cdio_get_driver_name(const CdIo_t * p_cdio)
' Get a string containing the name of the driver in use.
Private Extern cdio_get_driver_name(cdioP As Pointer) As String

' void cdio_get_drive_cap(const CdIo_t *p_cdio, cdio_drive_read_cap_t *p_read_cap, cdio_drive_write_cap_t *p_write_cap, cdio_drive_misc_cap_t *p_misc_cap)
' Get the what kind of device we've got.
Private Extern cdio_get_drive_cap(cdioP As Pointer, p_read_cap As Pointer, p_write_cap As Pointer, p_misc_cap As Pointer)

' bool cdio_have_driver(driver_id_t driver_id)
' Like cdio_have_xxx but uses an enumeration instead.
Private Extern cdio_have_driver(driver_id As Integer) As Boolean

' const char* cdio_driver_describe(driver_id_t driver_id)
' Get a string decribing driver_id.
Private Extern cdio_driver_describe(driver_id As Integer) As String

' void cdio_destroy(CdIo_t * p_cdio)
' Free any resources associated with p_cdio.
Private Extern cdio_destroy(cdioP As Pointer)


Public Sub Main()

 Dim p_cdio As Pointer
 Dim default_device As String
 Dim legge_cap, scrive_cap, i_misc_cap, driver As Integer


  p_cdio = cdio_open(Null, DRIVER_UNKNOWN)
  If IsNull(p_cdio) Then Error.Raise("Impossibile trovare il driver per il CD !")
 
  Print "-- Il driver selezionato è: "; cdio_get_driver_name(p_cdio)
 
  default_device = cdio_get_default_device(p_cdio)
  If IsNull(default_device) = False Then Print "-- Il dispositivo predefinito per questo driver è: "; default_device
 
  cdio_get_drive_cap(p_cdio, VarPtr(legge_cap), VarPtr(scrive_cap), VarPtr(i_misc_cap))
 
  Funzionalita_Drive(legge_cap, scrive_cap, i_misc_cap)

  Print

  For driver = 1 To 12
    If cdio_have_driver(driver)
      Print "-- E' presente: ", cdio_driver_describe(driver)
    Else
      Print "-- Non è presente: ", cdio_driver_describe(driver)
    Endif
  Next


' Va in chiusura:
  cdio_destroy(p_cdio)

End


Private Procedure Funzionalita_Drive(read_cap As Integer, write_cap As Integer, misc_cap As Integer)

 Dim s As String

  If CDIO_DRIVE_CAP_ERROR = misc_cap Then
    Print "Errore nel tentativo di ottenere le proprietà hardware del drive\n"
  Else
    If (misc_cap And CDIO_DRIVE_CAP_MISC_FILE) Then
      s = "Disk Image"
    Else
      s = "CD-ROM o DVD"
    Endif
    Print "-- Hardware: ", s
   
    If (misc_cap And CDIO_DRIVE_CAP_MISC_EJECT) Then
      s = "Sì"
    Else
      s = "No"
    Endif
    Print "-- E' possibile l'espulsione del disco: ", s
    
    If (misc_cap And CDIO_DRIVE_CAP_MISC_CLOSE_TRAY) Then
      s = "Sì"
    Else
      s = "No"
    Endif
    Print "-- E' possibile la chiusura del vassoio: ", s
   
    If (misc_cap And CDIO_DRIVE_CAP_MISC_LOCK) Then
      s = "Sì"
    Else
      s = "No"
    Endif
    Print "-- E' possibile l'espulsione manuale del disco: ", s
   
    If (misc_cap And CDIO_DRIVE_CAP_MISC_SELECT_DISC) Then
      s = "Sì"
    Else
      s = "No"
    Endif
    Print "-- E' possibile selezionare un disco juke-box: ", s
   
    If (misc_cap And CDIO_DRIVE_CAP_MISC_SELECT_SPEED) Then
      s = "Sì"
    Else
      s = "No"
    Endif
    Print "-- E' possibile impostare la velocità del drive: ", s
   
    If (misc_cap And CDIO_DRIVE_CAP_MISC_MEDIA_CHANGED) Then
      s = "Sì"
    Else
      s = "No"
    Endif
    Print "-- E' possibile verificare se il CD è cambiato: ", s
    
    If (misc_cap And CDIO_DRIVE_CAP_MISC_MULTI_SESSION) Then
      s = "Sì"
    Else
      s = "No"
    Endif
    Print "-- E' possibile leggere sessioni multiple: ", s
   
    If (misc_cap And CDIO_DRIVE_CAP_MISC_RESET) Then
      s = "Sì"
    Else
      s = "No"
    Endif
    Print "-- E' possibile un hard reset del dispositivo: ", s
  Endif
 
 
  If (CDIO_DRIVE_CAP_ERROR = read_cap) Then
    Print "\nErrore nel tentativo di ottenere le proprietà di lettura del drive\n"
  Else 
    Print "\n-- LETTURA --"
    If (read_cap And CDIO_DRIVE_CAP_READ_AUDIO) Then
      s = "Sì"
    Else
      s = "No"
    Endif
    Print "--  E' possibile eseguire l'audio: ", s

    If (read_cap And CDIO_DRIVE_CAP_READ_CD_R) Then
      s = "Sì"
    Else
      s = "No"
    Endif
    Print "--  E' possibile leggere un  CD-R: ", s

    If (read_cap And CDIO_DRIVE_CAP_READ_CD_RW) Then
      s = "Sì"
    Else
      s = "No"
    Endif
    Print "--  E' possibile leggere un  CD-RW: ", s

    If (read_cap And CDIO_DRIVE_CAP_READ_DVD_ROM) Then
      s = "Sì"
    Else
      s = "No"
    Endif
    Print "--  E' possibile leggere un  DVD-ROM: ", s
  Endif
 
 
  If CDIO_DRIVE_CAP_ERROR = write_cap Then
    Print "\nErrore nel tentativo di ottenere le proprietà di scrittura del drive\n"
  Else
    Print "\n-- SCRITTURA --"
    
    If (read_cap And CDIO_DRIVE_CAP_READ_CD_RW) Then
      s = "Sì"
    Else
      s = "No"
    Endif
    Print "--  E' possibile scrivere un  CD-RW: ", s
   
    If (write_cap And CDIO_DRIVE_CAP_READ_DVD_R) Then
      s = "Sì"
    Else
      s = "No"
    Endif
    Print "--  E' possibile scrivere un  DVD-R: ", s
    
    If (write_cap And CDIO_DRIVE_CAP_READ_DVD_RAM) Then
      s = "Sì"
    Else
      s = "No"
    Endif
    Print "--  E' possibile scrivere un  DVD-RAM:", s    
  Endif
 
End



Riferimenti