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.18.0.0''".
+
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.
 
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"
+
  Library "libcdio:19.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,
Riga 32: Riga 32:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim p_cdio As Pointer
 
   Dim p_cdio As Pointer
Riga 39: Riga 39:
 
   Dim num_tracce As Byte
 
   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 !")
 
   
 
   
  p_cdio = cdio_open(Null, DRIVER_UNKNOWN)
+
  num_tracce = cdio_get_num_tracks(p_cdio)
  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
+
  For traccia = 1 To num_tracce
      lba = cdio_get_track_lba(p_cdio, traccia)
+
      lba = cdio_get_track_lba(p_cdio, traccia)
      n += Calcolo_cddb(lba / CDIO_CD_FRAMES_PER_SEC)
+
      n += Calcolo_cddb(lba / CDIO_CD_FRAMES_PER_SEC)
  Next
+
  Next
 
    
 
    
  iniz_sec = cdio_get_track_lba(p_cdio, 1) / CDIO_CD_FRAMES_PER_SEC
+
  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
+
  leadout_sec = cdio_get_track_lba(p_cdio, CDIO_CDROM_LEADOUT_TRACK) / CDIO_CD_FRAMES_PER_SEC
 
   
 
   
  totale = leadout_sec - iniz_sec
+
  totale = leadout_sec - iniz_sec
 
   
 
   
  id = ((n Mod 255) * CInt(2 ^ 24)) Or (totale * CInt(2 ^ 8)) Or num_tracce
+
  id = ((n Mod 255) * CInt(2 ^ 24)) Or (totale * CInt(2 ^ 8)) Or num_tracce
 
    
 
    
  Print Hex(id, 8), "Numero tracce = "; num_tracce
+
  Print Hex(id, 8), "Numero tracce = "; num_tracce
 
    
 
    
  For traccia = 1 To num_tracce
+
  For traccia = 1 To num_tracce
    lba = cdio_get_track_lba(p_cdio, traccia)
+
    lba = cdio_get_track_lba(p_cdio, traccia)
    Print CLong(lba)
+
    Print CLong(lba)
  Next
+
  Next
 
    
 
    
  Print CLong(cdio_get_track_lba(p_cdio, CDIO_CDROM_LEADOUT_TRACK) / CDIO_CD_FRAMES_PER_SEC)
+
  Print CLong(cdio_get_track_lba(p_cdio, CDIO_CDROM_LEADOUT_TRACK) / CDIO_CD_FRAMES_PER_SEC)
 
    
 
    
 
 
  <FONT color=gray>' ''Va in chiusura:''</font>
 
  <FONT color=gray>' ''Va in chiusura:''</font>
  cdio_destroy(p_cdio)
+
  cdio_destroy(p_cdio)
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Function Calcolo_cddb(i As Integer) As Integer
+
  Private Function Calcolo_cddb(i As Integer) As Integer
 
   
 
   
 
   Dim ris As Integer
 
   Dim ris As Integer
 
    
 
    
  While (i > 0)
+
  While (i > 0)
    ris += i Mod 10
+
    ris += i Mod 10
    i /= 10
+
    i /= 10
  Wend
+
  Wend
 
   
 
   
  Return ris
+
  Return ris
 
   
 
   
  '''End'''
+
  End
 
 
  
  

Versione attuale delle 08:03, 4 giu 2024

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