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. | + | 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: | + | Library "libcdio:18.0.0" |
− | Private Enum DRIVER_UNKNOWN = 0, DRIVER_AIX | + | 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 | |
<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 | + | 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