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.25


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

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


Library "libsndfile:1.0.25"

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: ", Null; File.Name(nome_file)
  Print "Dimensione: ", Null; Stat(nome_file).Size; " byte"
  With sfinfo
    Print "Frames: ", Null; .frames
    Print "Frequenza:", "Hz "; .samplerate
    Print "Canali: ", Null; .channels
    Print "Dati grezzi: ", Null; .frames * .channels; " byte"
    If File.Ext(nome_file) = "wav" Then
      Print "Risoluzione: ", Null; Fix(Stat(nome_file).Size / .frames / .channels * 8); " bit"
      Print "Durata: ", Null; Date(0, 0, 0, 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.formatI 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.formatI - (sfinfo.formatI 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: ", Null; major, minor
   
  Print "\nInformazioni sul brano audio:"
  Print "- Titolo: ", Null; sf_get_string(infile, SF_STR_TITLE)
  Print "- Copyright: ", Null; sf_get_string(infile, SF_STR_COPYRIGHT)
  Print "- Software: ", Null; sf_get_string(infile, SF_STR_SOFTWARE)
  Print "- Artista: ", Null; sf_get_string(infile, SF_STR_ARTIST)
  Print "- Commento: ", Null; sf_get_string(infile, SF_STR_COMMENT)
  Print "- Data: ", Null; sf_get_string(infile, SF_STR_DATE)
  Print "- Album: ", Null; sf_get_string(infile, SF_STR_ALBUM)
  Print "- Licenza: ", Null; sf_get_string(infile, SF_STR_LICENSE)
  Print "- Traccia: ", Null; sf_get_string(infile, SF_STR_TRACKNUMBER)
  Print "- Genere: ", Null; sf_get_string(infile, SF_STR_GENRE)
   
   
' Va in chiusura:
  sf_close(infile)
 
End



Riferimenti