Eseguire un file audio ed estrarne informazioni mediante le funzioni esterne del API di libcsfml

Da Gambas-it.org - Wikipedia.

La libreria SFML (Simple and Fast Multimedia Library) fornisce una semplice interfaccia multipiattaforma per facilitare lo sviluppo di giochi e applicazioni multimediali in genere. Essa si compone di cinque moduli: sistema, finestre, grafica, audio e di rete. Qui tratteremo ovviamente del modulo attinente all'audio.

Attualmente la libreria SFML è in grado di eseguire i file audio dei formati: Wav e OggVorbis.

Per poter fruire delle risorse della libreria libcsfml, bisognerà richiamare in Gambas la libreria condivisa: "libcsfml-audio.so.1.6 ".

Di seguito mostreremo un possibile codice utilizzando alcune funzioni principali per la gestione dei predetti tipi di file audio. Porremo sul Form un ToggleButton, un Button, una Label, uno Slider ed un ValueBox:

Private percorsoFile As String


Library "libcsfml-audio:1.6"

Private Enum sfStopped = 0, sfPaused, sfPlaying
Private sfMusic As Pointer

' sfMusic* sfMusic_CreateFromFile(const char* Filename)
' Create a new music and load it from a file
Private Extern sfMusic_CreateFromFile(filename As String) As Pointer

' unsigned int sfMusic_GetChannelsCount(sfMusic* Music)
' Return the number of channels of a music (1 = mono, 2 = stereo)
Private Extern sfMusic_GetChannelsCount(musicP As Pointer) As Integer

' unsigned int sfMusic_GetSampleRate(sfMusic* Music)
' Get the stream sample rate of a music
Private Extern sfMusic_GetSampleRate(musicP As Pointer) As Integer

' float sfMusic_GetDuration(sfMusic* Music)
' Get a music duration
Private Extern sfMusic_GetDuration(musicP As Pointer) As Single

' void sfMusic_Play(sfMusic* Music)
' Start playing a music
Private Extern sfMusic_Play(musicP As Pointer)

' float sfMusic_GetPlayingOffset(sfMusic* Music)
' Get the current playing position of a music
Private Extern sfMusic_GetPlayingOffset(musicP As Pointer) As Single

' void sfMusic_SetVolume(sfMusic* Music, float Volume)
' Set the volume of a music. Param Volume: in range [0, 100]
Private Extern sfMusic_SetVolume(musicP As Pointer, volume as Single)

' void sfMusic_Pause(sfMusic* Music)
' Pause a music
Private Extern sfMusic_Pause(musicP As Pointer)

' void sfMusic_Stop(sfMusic* Music)
' Stop playing a music
Private Extern sfMusic_Stop(musicP As Pointer)

' sfSoundStatus sfMusic_GetStatus(sfMusic* Music)
' Get the status of a music (stopped, paused, playing)
Private Extern sfMusic_GetStatus(musicP As Pointer) As Integer

' void sfMusic_Destroy(sfMusic* Music)
' Destroy an existing music
Private Extern sfMusic_Destroy(musicP As Pointer)


Public Sub Form_Open()

  percorsoFile = "/percorso/del/file/audio"

  sfMusic = sfMusic_CreateFromFile(percorsoFile)
  If IsNull(sfMusic) Then Error.Raise("Impossibile caricare il file audio !")
   
  ToggleButton1.Text = "Avvia"
  Slider1.Value = 100
  ValueBox1.Value = 100
  
' Acquisisce alcune informazioni generali sul file audio caricato:
  Print "Canali audio: "; sfMusic_GetChannelsCount(sfMusic)
  Print "Frequenza di campionamento: "; sfMusic_GetSampleRate(sfMusic)
  Print "Durata del brano: "; Time(0, 0, 0, Fix(sfMusic_GetDuration(sfMusic) * 1000))

End


Public Sub ToggleButton1_Click()

  If ToggleButton1.Value Then
    sfMusic_Play(sfMusic)
    ToggleButton1.Text = "Pausa"
   
    While sfMusic_GetStatus(sfMusic) = sfPlaying
      Wait 0.01
      Label1.Alignment = Align.Right
      Label1.Text = Format(Time(0, 0, 0, Fix(sfMusic_GetPlayingOffset(sfMusic) * 1000)), "nn:ss.uu")
    Wend
' Al termine dell'intera esecuzione del brano va in chiusura:
    sfMusic_Destroy(sfMusic)
  Else
    sfMusic_Pause(sfMusic)
    ToggleButton1.Text = "Riprendi"
  Endif

End


Public Sub Button1_Click()

  ToggleButton1.Value = 0
  
  sfMusic_Stop(sfMusic)
  
  sfMusic_Destroy(sfMusic)
  ToggleButton1.Text = "Avvia"

End


Public Sub Slider1_Change()

  ValueBox1.Value = Slider1.Value
  sfMusic_SetVolume(sfMusic, CSingle(ValueBox1.Value))

End


Riferimenti

[1] La pagina web di SFML

[2] La pagina web del API di libcsfml