Calcolare l'ID-disc di un 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.19.0.0 ".


Mostriamo un semplice codice che consentirà di calcolare l'ID-disc di un CD, che potrà essere utilizzato per ottenere successivamente informazioni riguardo alle tracce, al titolo ed all'interprete da un server CDDB.

Library "libcdio:19.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_CDROM_LBA = &01, CDIO_CDROM_MSF = &02, CDIO_CDROM_DATA_TRACK = &04, CDIO_CDROM_CDtraccia = &10,
             CDIO_CDROM_XA_TRACK = &20, CDIO_CD_MAX_TRACKS = 99, CDIO_CDROM_LEADOUT_TRACK = &AA, CDIO_INVALID_TRACK = &FF 
            
Private Const CDIO_CD_FRAMES_PER_SEC As Integer = 75

' 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

' track_t cdio_get_num_tracks(const CdIo_t * p_cdio)
' Get the number of tracks on the CD.
Private Extern cdio_get_num_tracks(cdioP As Pointer) As Integer

' lba_t cdio_get_track_lba(const CdIo_t * p_cdio, track_t u_track)
' Get the starting LBA for track number traccia in p_cdio.
Private Extern cdio_get_track_lba(cdioP As Pointer, u_track As Integer) 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 traccia, lba, n, iniz_sec As Integer
 Dim leadout_sec, totale, id As Integer
 Dim num_tracce As Byte

 p_cdio = cdio_open(Null, DRIVER_UNKNOWN)
 If p_cdio == 0 Then Error.Raise("Impossibile trovare il driver per il CD !")

 num_tracce = cdio_get_num_tracks(p_cdio)
 
 For traccia = 1 To num_tracce
     lba = cdio_get_track_lba(p_cdio, traccia)
     n += Calcolo_cddb(lba / CDIO_CD_FRAMES_PER_SEC)
 Next
 
 iniz_sec = cdio_get_track_lba(p_cdio, 1) / CDIO_CD_FRAMES_PER_SEC

 leadout_sec = cdio_get_track_lba(p_cdio, CDIO_CDROM_LEADOUT_TRACK) / CDIO_CD_FRAMES_PER_SEC

 totale = leadout_sec - iniz_sec

 id = ((n Mod 255) * CInt(2 ^ 24)) Or (totale * CInt(2 ^ 8)) Or num_tracce
 
 Print Hex(id, 8), "Numero tracce = "; num_tracce
 
 For traccia = 1 To num_tracce
   lba = cdio_get_track_lba(p_cdio, traccia)
   Print CLong(lba)
 Next
 
 Print CLong(cdio_get_track_lba(p_cdio, CDIO_CDROM_LEADOUT_TRACK) / CDIO_CD_FRAMES_PER_SEC)
 
' Va in chiusura:
 cdio_destroy(p_cdio)

End


Private Function Calcolo_cddb(i As Integer) As Integer

 Dim ris As Integer
 
 While (i > 0)
   ris += i Mod 10
   i /= 10
 Wend

 Return ris

End


Riferimenti