Estrarre informazioni e TAG da un file audio con le funzioni esterne del API di SndFile

Da Gambas-it.org - Wikipedia.

SndFile è una libreria, scritta in C, per leggere e scrivere file che contengono suono campionato attraverso una libreria interfaccia standard.

Per poter usufruire delle risorse di SndFile, è necessario avere installata la libreria (nella sua attuale versione): "libsndfile.so.1.0.37 ".

Mostreremo di seguito un semplice codice per estrarre informazioni generali e TAG, qualora possibile, da un file audio (non MP3 !) con le funzioni esterne del API di SndFile:

Library "libsndfile:1.0.37"

Public Struct SF_INFO
  frames As Long
  samplerate As Integer
  channels As Integer  
  format_ As Integer
  sections As Integer
  seekable As Integer
End Struct

Private Enum SF_STR_TITLE = 1,
             SF_STR_COPYRIGHT,
             SF_STR_SOFTWARE,
             SF_STR_ARTIST,
             SF_STR_COMMENT,
             SF_STR_DATE,
             SF_STR_ALBUM,
             SF_STR_LICENSE,
             SF_STR_TRACKNUMBER,
             SF_STR_GENRE = 16

Private Const SFM_READ As Byte = 16

' SNDFILE * sf_open (const char *path, int mode, SF_INFO *sfinfo)
' Open the specified file for read, write or both.
Private Extern sf_open(path As String, mode As Integer, SFinf As SF_INFO) As Pointer

' int sf_format_check  (const SF_INFO *info)
' Return TRUE if fields of the SF_INFO struct are a valid combination of values.
Private Extern sf_format_check(infoStr As SF_INFO) As Boolean

' const char* sf_get_string (SNDFILE *sndfile, int str_type)
' Retrieves and setting string data within sound files.
Private Extern sf_get_string(sndfile As Pointer, str_type As Integer) As String

' int  sf_close  (SNDFILE *sndfile)
' Close the SNDFILE and clean up all memory allocations associated with this file.
Private Extern sf_close(sndfile As Pointer) As Integer


Public Sub Main()
 
 Dim nome_file As String = "/percorso/del/file/audio"
 Dim infile As Pointer
 Dim ver As Boolean
 Dim sfinfo As New SF_INFO
 Dim major, minor As String

' Apre il file audio:
 infile = sf_open(nome_file, SFM_READ, sfinfo)
     
 ver = sf_format_check(sfinfo)
 If ver == False Then Error.Raise("Errore nella raccolta delle informazioni dal file audio !")
  
' Ricava alcune informazioni dal file audio:
 Print "== Informazioni del file audio =="
 Print "\nNome file:    "; File.Name(nome_file)
 Print "Dimensione:   "; Stat(nome_file).Size; " byte"
 With sfinfo
   Print "Frames:       "; .frames
   Print "Frequenza:    "; .samplerate; " hertz"
   Print "Canali:       "; .channels
   Print "Dati grezzi:  "; .frames * .channels; " byte"
   If File.Ext(nome_file) = "wav" Then
     Print "Risoluzione:  "; Fix(Stat(nome_file).Size / .frames / .channels * 8); " bit"
     Print "Durata:       "; Time(0, 0, 0, (Stat(nome_file).Size * 8) / (.samplerate * Fix(Stat(nome_file).Size / .frames / .channels * 8) * .channels) * 1000)
   Endif
 End With
    
 Select Case Hex(sfinfo.format_ And &FFF0000&)
   Case "10000"
     major = "Microsoft WAV format (little endian default)."
   Case "20000"
     major = "Apple/SGI AIFF format (big endian)."
   Case "30000"
     major = "Sun/NeXT AU format (big endian)."
   Case "40000"
     major = "RAW PCM data."
   Case "50000"
     major = "Ensoniq PARIS file format."
   Case "60000"
     major = "Amiga IFF / SVX8 / SV16 format."
   Case "70000"
     major = "Sphere NIST format."
   Case "80000"
     major = "VOC files."
   Case "A0000"
     major = "Berkeley/IRCAM/CARL"
   Case "B0000"
     major = "Sonic Foundry's 64 bit RIFF/WAV"
   Case "C0000"
     major = "Matlab (tm) V4.2 / GNU Octave 2.0"
   Case "D0000"
     major = "Matlab (tm) V5.0 / GNU Octave 2.1"
   Case "E0000"
     major = "Portable Voice Format"
   Case "F0000"
     major = "Fasttracker 2 Extended Instrument"
   Case "100000"
     major = "HMM Tool Kit format"
   Case "110000"
     major = "Midi Sample Dump Standard"
   Case "120000"
     major = "Audio Visual Research"
   Case "130000"
     major = "MS WAVE with WAVEFORMATEX"
   Case "160000"
     major = "Sound Designer 2"
   Case "170000"
     major = "FLAC lossless file format"
   Case "180000"
     major = "Core Audio File format"
   Case "190000"
     major = "Psion WVE format"
   Case "200000"
     major = "Xiph OGG container"
   Case "210000"
     major = "Akai MPC 2000 sampler"
   Case "220000"
     major = "RF64 WAV file"
 End Select
  
 Select Case Hex(sfinfo.format_ - (sfinfo.format_ And &FFF0000&), 2)
   Case "01"
     minor = "Signed 8 bit data"
   Case "02"
     minor = "Signed 16 bit data"
   Case "03"
     minor = "Signed 24 bit data"
   Case "04"
     minor = "Signed 32 bit data"
   Case "05"
     minor = "Unsigned 8 bit data (WAV and RAW only)"
   Case "06"
     minor = "32 bit float data"
   Case "07"
     minor = "64 bit float data"
   Case "10"
     minor = "U-Law encoded."
   Case "11"
     minor = "A-Law encoded."
   Case "12"
     minor = "IMA ADPCM."
   Case "13"
     minor = "Microsoft ADPCM."
   Case "20"
     minor = "GSM 6.10 encoding."
   Case "21"
     minor = "OKI / Dialogix ADPCM"
   Case "30"
     minor = "32kbs G721 ADPCM encoding."
   Case "31"
     minor = "24kbs G723 ADPCM encoding."
   Case "32"
     minor = "40kbs G723 ADPCM encoding."
   Case "40"
     minor = "12 bit Delta Width Variable Word encoding."
   Case "41"
     minor = "16 bit Delta Width Variable Word encoding."
   Case "42"
     minor = "24 bit Delta Width Variable Word encoding."
   Case "43"
     minor = "N bit Delta Width Variable Word encoding."
   Case "50"
     minor = "8 bit differential PCM (XI only)"
   Case "51"
     minor = "16 bit differential PCM (XI only)"
   Case "60"
     minor = "Xiph Vorbis encoding."
 End Select
   
 Print "Formato file: "; major, minor
   
 Print "\nInformazioni sul brano audio:"
 Print "- Titolo:    "; sf_get_string(infile, SF_STR_TITLE)
 Print "- Copyright: "; sf_get_string(infile, SF_STR_COPYRIGHT)
 Print "- Software:  "; sf_get_string(infile, SF_STR_SOFTWARE)
 Print "- Artista:   "; sf_get_string(infile, SF_STR_ARTIST)
 Print "- Commento:  "; sf_get_string(infile, SF_STR_COMMENT)
 Print "- Data:      "; sf_get_string(infile, SF_STR_DATE)
 Print "- Album:     "; sf_get_string(infile, SF_STR_ALBUM)
 Print "- Licenza:   "; sf_get_string(infile, SF_STR_LICENSE)
 Print "- Traccia:   "; sf_get_string(infile, SF_STR_TRACKNUMBER)
 Print "- Genere:    "; sf_get_string(infile, SF_STR_GENRE)
 
' Va in chiusura:
 sf_close(infile)
 
End


Riferimenti