Differenze tra le versioni di "Calcolare l'ID-disc di un CD con le funzioni del API di libcdio"

Da Gambas-it.org - Wikipedia.
 
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.17.0.0''".
+
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 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.
 
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:17.0.0"
+
  Library "libcdio:18.0.0"
 
   
 
   
 
  Private Enum DRIVER_UNKNOWN = 0, DRIVER_AIX, DRIVER_FREEBSD, DRIVER_NETBSD, DRIVER_LINUX, DRIVER_SOLARIS,
 
  Private Enum DRIVER_UNKNOWN = 0, DRIVER_AIX, DRIVER_FREEBSD, DRIVER_NETBSD, DRIVER_LINUX, DRIVER_SOLARIS,

Versione attuale delle 01:14, 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 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: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_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 IsNull(p_cdio) 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