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