Differenze tra le versioni di "Conoscere lo stato di un lettore CD con le funzioni del API di libcdio"

Da Gambas-it.org - Wikipedia.
(Creata pagina con '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 r...')
 
(4 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
La libreria '''''Libcdio''''' consente di gestire i CD ed i relativi driver presenti nel sistema.
 
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.13.0.0''".
+
Per utilizzare le funzioni esterne del API di ''libcdio'' sarà necessario richiamare l'attuale libreria: "''libcdio.so.18.0.0''".
  
  
Riga 7: Riga 7:
 
  Private p_cdio As Pointer
 
  Private p_cdio As Pointer
 
   
 
   
  Library "libcdio:13.0.0"
+
  Library "libcdio:18.0.0"
 
   
 
   
  Private Enum DRIVER_UNKNOWN = 0, DRIVER_AIX, DRIVER_BSDI, DRIVER_FREEBSD, DRIVER_NETBSD, DRIVER_LINUX, DRIVER_SOLARIS,
+
  Private Enum DRIVER_UNKNOWN = 0, DRIVER_AIX, DRIVER_FREEBSD, DRIVER_NETBSD, DRIVER_LINUX, DRIVER_SOLARIS,
               DRIVER_OS2, DRIVER_OSX, DRIVER_WIN32, DRIVER_CDRDAO, DRIVER_BINCUE, DRIVER_NRG, DRIVER_DEVICE
+
               DRIVER_OSX, DRIVER_WIN32, DRIVER_CDRDAO, DRIVER_BINCUE, DRIVER_NRG, DRIVER_DEVICE
 
              
 
              
 
  <FONT Color=gray>' ''CdIo_t * cdio_open (const char *psz_source, driver_id_t driver_id)''
 
  <FONT Color=gray>' ''CdIo_t * cdio_open (const char *psz_source, driver_id_t driver_id)''
Riga 28: Riga 28:
 
   
 
   
 
   p_cdio = cdio_open(Null, DRIVER_UNKNOWN)
 
   p_cdio = cdio_open(Null, DRIVER_UNKNOWN)
   If IsNull(p_cdio) Then Error.Raise("Impossibile trovare il driver per il CD !")
+
   If p_cdio = 0 Then Error.Raise("Impossibile trovare il driver per il CD !")
 
      
 
      
 
   If cdio_get_media_changed(p_cdio)
 
   If cdio_get_media_changed(p_cdio)
Riga 57: Riga 57:
 
   Quit
 
   Quit
 
   
 
   
 +
'''End'''
 +
 +
 +
In quest'altro esempio si verificherà oltre allo stato del ''drive'', come nel precedente codice, anche se esso è chiuso oppure aperto:
 +
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_MMC_R_W_ERROR_PAGE = &01, CDIO_MMC_WRITE_PARMS_PAGE = &05, CDIO_MMC_CDR_PARMS_PAGE = &0d, CDIO_MMC_AUDIO_CTL_PAGE = &0e,
 +
              CDIO_MMC_POWER_PAGE = &1a, CDIO_MMC_FAULT_FAIL_PAGE = &1c, CDIO_MMC_TO_PROTECT_PAGE = &1d, CDIO_MMC_CAPABILITIES_PAGE = &2a, CDIO_MMC_ALL_PAGES = &3
 +
           
 +
<FONT Color=gray>' ''char* cdio_get_default_device_driver(driver_id_t * p_driver_id)''
 +
' ''Return a string containing the default CD device if none is specified.''</font>
 +
Private Extern cdio_get_default_device_driver(p_driver_id As Pointer) As String
 +
           
 +
<FONT Color=gray>' ''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.''</font>
 +
Private Extern cdio_open(psz_source As String, driver_id As Integer) As Pointer
 +
 +
<FONT Color=gray>' ''int mmc_get_tray_status(const CdIo_t * p_cdio)''
 +
' ''Find out if media tray is open or closed.''</font>
 +
Private Extern mmc_get_tray_status(cdioP As Pointer) As Integer
 +
 +
<FONT Color=gray>' ''const char* cdio_driver_errmsg(driver_return_code_t drc)''
 +
' ''Returns the string information about drc.''</font>
 +
Private Extern cdio_driver_errmsg(drc As Integer) As String
 +
 +
<FONT Color=gray>' ''int mmc_get_media_changed(const CdIo_t * p_cdio)''
 +
' ''Find out if media has changed since the last call.''</font>
 +
Private Extern mmc_get_media_changed(cdioP As Pointer) As Integer
 +
 +
<FONT Color=gray>' ''void cdio_destroy(CdIo_t * p_cdio)''
 +
' ''Free any resources associated with p_cdio.''</font>
 +
Private Extern cdio_destroy(cdioP As Pointer)
 +
 +
 +
'''Public''' Sub Main()
 +
 +
  Dim p_cdio As Pointer
 +
  Dim dd, ret As Integer
 +
  Dim psz_drive As String
 +
 
 +
  dd = DRIVER_DEVICE
 +
 +
  psz_drive = cdio_get_default_device_driver(VarPtr(dd))
 +
  If IsNull(psz_drive) Then
 +
    Error.Raise("-- Can't find a CD-ROM !")
 +
  Else
 +
    Print "Il 'driver' predefinito è: "; psz_drive
 +
  Endif
 +
 
 +
  p_cdio = cdio_open(Null, DRIVER_UNKNOWN)
 +
  If p_cdio = 0 Then Error.Raise("Impossibile trovare il driver per il CD !")
 +
 
 +
  ret = mmc_get_tray_status(p_cdio)
 +
 
 +
  Select Case ret
 +
    Case 0
 +
      Print "-- Il drive CD-ROM '"; psz_drive; "' è chiuso."
 +
    Case 1
 +
      Print "-- Il drive CD-ROM '"; psz_drive; "' è aperto."
 +
  Case Else
 +
      Error.Raise("Errore relativo al drive " & psz_drive & "':" & cdio_driver_errmsg(ret) & ".")
 +
  End Select
 +
 +
  ret = mmc_get_media_changed(p_cdio)
 +
 +
  Select Case ret
 +
    Case 0
 +
      Print "-- Il drive CD-ROM '"; psz_drive; "' non è cambiato dall'ultimo controllo."
 +
    Case 1
 +
      Print "-- Il drive CD-ROM '"; psz_drive; "' è cambiato dall'ultimo controllo."
 +
    Case Else
 +
      Error.Raise("Errore relativo al drive " & psz_drive & "':" & cdio_driver_errmsg(ret) & ".")
 +
  End Select
 +
 +
 +
<FONT Color=gray>' ''Va in chiusura:''</font>
 +
  cdio_destroy(p_cdio)
 +
 +
'''End'''
 +
 +
 +
In questo terzo esempio si verificherà semplicemente se nel lettore DC-DVD è presente un disco:
 +
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 Const CDIO_DISC_MODE_ERROR As Integer = 17
 +
           
 +
<FONT Color=gray>' ''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.''</font>
 +
Private Extern cdio_open(psz_source As String, driver_id As Integer) As Pointer
 +
 +
<FONT Color=gray>' ''discmode_t cdio_get_discmode (CdIo_t *p_cdio)''
 +
' ''Get disc mode - the kind of CD (CD-DA, CD-ROM mode 1, CD-MIXED, etc. that we've got.''</font>
 +
Private Extern mmc_get_tray_status(cdioP As Pointer) As Integer
 +
 +
<FONT Color=gray>' ''void cdio_destroy(CdIo_t * p_cdio)''
 +
' ''Free any resources associated with p_cdio.''</font>
 +
Private Extern cdio_destroy(cdioP As Pointer)
 +
 +
 +
'''Public''' Sub Main()
 +
 
 +
  Dim p_cdio As Pointer
 +
 
 +
  p_cdio = cdio_open(Null, DRIVER_UNKNOWN)
 +
  If p_cdio = 0 Then Error.Raise("Impossibile trovare il file-device del driver CD/DVD !")
 +
 
 +
<FONT Color=gray>' ''Verifica se nel lettore CD-DVD è presente un disco:''</font>
 +
  If cdio_get_discmode(p_cdio) = CDIO_DISC_MODE_ERROR Then Print "Non è presente nel lettore CD-DVD alcun disco !"
 +
   
 +
<FONT Color=gray>' ''Va in chiusura:''</font>
 +
  cdio_destroy(p_cdio)
 +
 
 
  '''End'''
 
  '''End'''
  

Versione delle 01:18, 14 ago 2020

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 sapere se lo stato del lettore CD è mutato o no; ossia se è stato appena inserito un CD oppure se è stato appena estratto.

Private p_cdio As Pointer

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
            
' 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

' int cdio_get_media_changed(CdIo_t * p_cdio)
' Find out if media has changed since the last call.
Private Extern cdio_get_media_changed(cdioP As Pointer) As Integer

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


Public Sub Form_Open()

 p_cdio = cdio_open(Null, DRIVER_UNKNOWN)
 If p_cdio = 0 Then Error.Raise("Impossibile trovare il driver per il CD !")
   
 If cdio_get_media_changed(p_cdio)
   Print "Stato iniziale del lettore CD: cambiato"
 Else 
   Print "Stato iniziale del lettore CD: non cambiato"
 Endif

End


Public Sub Button1_Click()

 If cdio_get_media_changed(p_cdio)
   Print "Stato attuale del lettore CD: cambiato"
 Else 
   Print "Stato attuale del lettore CD: non cambiato"
 Endif

End


Public Sub Button2_Click()

' Va in chiusura:
 cdio_destroy(p_cdio)
 
 Quit

End


In quest'altro esempio si verificherà oltre allo stato del drive, come nel precedente codice, anche se esso è chiuso oppure aperto:

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_MMC_R_W_ERROR_PAGE = &01, CDIO_MMC_WRITE_PARMS_PAGE = &05, CDIO_MMC_CDR_PARMS_PAGE = &0d, CDIO_MMC_AUDIO_CTL_PAGE = &0e,
             CDIO_MMC_POWER_PAGE = &1a, CDIO_MMC_FAULT_FAIL_PAGE = &1c, CDIO_MMC_TO_PROTECT_PAGE = &1d, CDIO_MMC_CAPABILITIES_PAGE = &2a, CDIO_MMC_ALL_PAGES = &3
            
' char* cdio_get_default_device_driver(driver_id_t * p_driver_id)
' Return a string containing the default CD device if none is specified.
Private Extern cdio_get_default_device_driver(p_driver_id As Pointer) As String
           
' 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

' int mmc_get_tray_status(const CdIo_t * p_cdio)
' Find out if media tray is open or closed.
Private Extern mmc_get_tray_status(cdioP As Pointer) As Integer

' const char* cdio_driver_errmsg(driver_return_code_t drc)
' Returns the string information about drc.
Private Extern cdio_driver_errmsg(drc As Integer) As String

' int mmc_get_media_changed(const CdIo_t * p_cdio)
' Find out if media has changed since the last call.
Private Extern mmc_get_media_changed(cdioP As Pointer) As Integer

' 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 dd, ret As Integer
 Dim psz_drive As String
 
  dd = DRIVER_DEVICE

  psz_drive = cdio_get_default_device_driver(VarPtr(dd))
  If IsNull(psz_drive) Then
    Error.Raise("-- Can't find a CD-ROM !")
  Else
    Print "Il 'driver' predefinito è: "; psz_drive
  Endif
 
  p_cdio = cdio_open(Null, DRIVER_UNKNOWN)
  If p_cdio = 0 Then Error.Raise("Impossibile trovare il driver per il CD !")
 
  ret = mmc_get_tray_status(p_cdio)
 
  Select Case ret
    Case 0
      Print "-- Il drive CD-ROM '"; psz_drive; "' è chiuso."
    Case 1
      Print "-- Il drive CD-ROM '"; psz_drive; "' è aperto."
  Case Else
      Error.Raise("Errore relativo al drive " & psz_drive & "':" & cdio_driver_errmsg(ret) & ".")
  End Select

  ret = mmc_get_media_changed(p_cdio)

  Select Case ret
    Case 0
      Print "-- Il drive CD-ROM '"; psz_drive; "' non è cambiato dall'ultimo controllo."
    Case 1
      Print "-- Il drive CD-ROM '"; psz_drive; "' è cambiato dall'ultimo controllo."
    Case Else
      Error.Raise("Errore relativo al drive " & psz_drive & "':" & cdio_driver_errmsg(ret) & ".")
  End Select


' Va in chiusura:
  cdio_destroy(p_cdio)

End


In questo terzo esempio si verificherà semplicemente se nel lettore DC-DVD è presente un disco:

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 Const CDIO_DISC_MODE_ERROR As Integer = 17
           
' 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

' discmode_t cdio_get_discmode (CdIo_t *p_cdio)
' Get disc mode - the kind of CD (CD-DA, CD-ROM mode 1, CD-MIXED, etc. that we've got.
Private Extern mmc_get_tray_status(cdioP As Pointer) As Integer

' 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
  
  p_cdio = cdio_open(Null, DRIVER_UNKNOWN)
  If p_cdio = 0 Then Error.Raise("Impossibile trovare il file-device del driver CD/DVD !")
  
' Verifica se nel lettore CD-DVD è presente un disco:
  If cdio_get_discmode(p_cdio) = CDIO_DISC_MODE_ERROR Then Print "Non è presente nel lettore CD-DVD alcun disco !"
   
' Va in chiusura:
  cdio_destroy(p_cdio)
  
End



Riferimenti