Eseguire i file audio mediante la Classe ''MediaPlayer'' del componente gb.media

Da Gambas-it.org - Wikipedia.

La classe MediaPlayer del componente gb.media consente di gestire uno o più file audio anche contemporaneamente.


Uso di applicazione grafica

Vediamo un semplicissimo codice per lanciare ed ascoltare un file audio in un'applicazione grafica utilizzando un Timer.
Porremo sul Form del progetto:

  • tre Button per avviare, mettere in pausa ed arrestare l'esecuzione del file audio;
  • un Timer che ci consentirà di calcolare il tempo trascorso;
  • un RadioButton per far ripetere a volontà il medesimo file audio:
Private mp As New MediaPlayer


Public Sub Form_Open()

' Carica un file audio:
  mp.URL = Media.URL("/percorso/del/file/audio")

' Facciamo in modo che il "Timer", alla sua prima attivazione, parta senza alcun ritardo:
  Timer1.Delay = 1

End
 
Public Sub Button1_Click()

  Suona()

End

Public Sub Suona()
 
' Avvia l'ascolto del file audio:
  mp.Play

  With Timer1
    .Start
' Il "Timer" si attiva ogni 70 millesimi di secondo:
    .Delay = 70
  End With

End

Public Sub Button2_Click()

' Mette in "pausa" l'ascolto del file audio.
' (Per continuare l'ascolto del file, si dovrà nuovamente attivare la proprietà ".Play"):
  mp.Pause

End

Public Sub Button3_Click()

  RadioButton1.Value = False

' Chiama la funzione per arrestare l'esecuzione del file audio:
  Arresta()

End

Public Sub Arresta()

' Arresta l'ascolto del file audio:
  mp.Stop

  Timer1.Stop

' Se è stato cliccato sul "RadioButton", verrà ripetuta l'esecuzione del file audio:
  If RadioButton1.Value Then
    mp.Position = 0
    Suona()
  Else
' Arresta l'ascolto del file audio:
   mp.Stop
 Endif

End

Public Sub Timer1_Timer()

' Mostra in console la posizione, espressa in secondi, all'interno dei dati processati:
  Write "\rDurata del brano: " & CStr(Time(0, 0, 0, mp.Duration * 1000)) &
        "   -   Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000))

' Se la posizione corrente è uguale o maggiore della durata complessiva del file audio, allora arresta l'esecuzione del file audio (altrimenti non sarà possibile riavviarlo semplicemente ri-clkiccando sul "Button1"):
  If mp.Position >= mp.Duration Then Arresta()
 
End


In quest'altro esempio, simile al precedente, verrà utilizzato un ciclo al posto di un oggetto Timer. Si porrà anche un oggetto Dial per poter modificare il volume.

Private mp As New MediaPlayer
Private bo As Boolean


Public Sub Form_Open()

  With Dial1
    .MinValue = 0
    .MaxValue = 100
    .Value = 50
  End With
  
' Carica un file audio:
  mp.URL = Media.URL("/percorso/del/file/audio")

End

Public Sub Button1_Click()

  Suona()

End

Public Sub Suona()

' Avvia l'ascolto del file audio:
  mp.Play
  
  Repeat
' Una brevissima pausa consente di agire sugli eventuali oggetti posti sul Form:
    Wait 0.01
    Write "\rDurata del brano: " & CStr(Time(0, 0, 0, mp.Duration * 1000)) &
          "   -   Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000))
  Until (mp.Position >= mp.Duration) Or (bo = True)
 
  Arresta()
 
End

Public Sub Button2_Click()
 
' Mette in "pausa" l'ascolto del file audio.
' (Per continuare l'ascolto del file, si dovrà nuovamente attivare la proprietà ".Play").
  mp.Pause

End

Public Sub Button3_Click()
 
  RadioButton1.Value = False
 
  bo = True
 
End

Public Sub arresta()
 
' Se è stato cliccato sul "RadioButton", verrà ripetuta l'esecuzione del file audio:
  If RadioButton1.Value Then
    mp.Position = 0
    Suona()
  Else
' Altrimenti arresta l'ascolto del file audio:
    mp.Stop
  Endif
 
End

Public Sub Dial1_Change()
 
  mp.Audio.Volume = Dial1.Value / 10
  Wait 0.1
 
End


Utilizzo in un'applicazione a riga di comando

Vediamo ora un semplice esempio di uso della Classe MediaPlayer in un'applicazione a riga di comando:

Private bo As Boolean


Public Sub Main()

 Dim mp As MediaPlayer
 Dim s As String

 s = "/percorso/del/file/audio"
 Print "File audio:  "; s
 Print
  
 With mp = New MediaPlayer
   .URL = Media.URL(s)
   .Play()
 End With
  
 Repeat
' Mostra in console la posizione, espressa in secondi, all'interno dei dati processati:
   Write "\r\e[0mDurata del brano: " & CStr(Time(0, 0, 0, mp.Duration * 1000)) &
         "   -   Tempo trascorso: \e[1m\e[31m" & CStr(Time(0, 0, 0, mp.Position * 1000))
   Wait 0.01
 Until (mp.Position >= mp.Duration) Or (bo = True)
  
 mp.Stop()
 mp.Close()
 Quit
  
End

Public Sub Application_Read()   ' Premendo il tasto "Invio" della tastiera, si arresta il programma
 
 bo = True
  
End


La proprietà .Duration

La proprietà .Duration restituisce un valore di tipo Float che rappresenta la durata del brano musicale espresso in secondi.
Poiché detta proprietà ritorna più precisamente la durata dei dati processati, essa potrà essere utilizzabile solo successivamente all'attivazione del Metodo ".Play".

Public Sub Main()

 Dim mp As MediaPlayer

 With mp = New MediaPlayer
   .URL = Media.URL("' /percorso/del/file/audio")
   .Play
   Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000)
   Repeat 
     Wait 0.01
     Write "\r       \e[31m" & Str(Time(0, 0, 0, .pos * 1000))
   Until .Pos >= .Duration
   .Stop
   .Close
 End With

End

oppure più semplicemente:

   ......
   .Play
   Print "Durata: \e[34m"; Time(0, 0, 0, .Duration * 1000)
   Wait .Duration
   .Stop
   .Close
 End With


La proprietà .Position

La proprietà .Position restituisce un valore di tipo Float che rappresenta la posizione, espressa in secondi all'interno dei dati processati.
Imposta, altresì, la posizione di esecuzione del brano. Pertanto, essa consente di spostare il processo dei dati, e dunque l'esecuzione del brano, ad un particolare punto temporale.


Modificare il Volume

Per conoscere o modificare il livello del volume d'ascolto si dovrà utilizzare la proprietà ".Volume" della proprietà .Audio della Classe MediaPlayer. Più in particolare la proprietà ".Volume" ritorna od imposta il volume del corrente flusso audio.

Nel primo caso restituisce un valore di tipo Float che rappresenta il volume corrente:

valore_di_tipo_Float = mp.Audio.Volume

nel secondo caso il volume è impostato mediante un valore di tipo Float, il cui ambito di valori impostabili va da 0.00 a 10.00:

mp.Audio.Volume = valore_di_tipo_Float


Annullare l'audio immediatamente

Per annullare l'audio immediatamente, senza modificare i valori del volume, si ha a disposizione la proprietà ".Mute" della proprietà .Audio della Classe MediaPlayer. Alla proprietà .Mute dovrà essere assegnato il valore booleano True.

mp.Audio.Mute = True


L'evento _AboutToFinish()

L'evento "_AboutToFinish()" si scatena circa un secondo prima della fine della durata del file audio che si sta eseguendo.


L'evento _End()

L'evento "_End()" si scatena quando l'esecuzione del file audio è terminata.

Per consentire che tale Evento si sollevi, si rende essere necessario porre i Metodi ".Stop()" - in particolar modo - e ".Close()" immediatamente prima dell'uscita dalla routine ove è posto il Metodo ".Play()".
Esempio:

Public Sub Button1_Click()

 Dim mp As MediaPlayer

 With mp = New MediaPlayer As "MediaPlayer1"
   .URL = Media.URL("/percorso/del/file/audio")
   .Play
   Wait .Duration
   .Stop
   .Close
 End With

End

Public Sub MediaPlayer1_End()

 Print "Esecuzione terminata !"

End

oppure un'attesa adeguata con l'istruzione "Wait":

 ...
   .Play
   Wait .Duration
 End With

 Wait 0.3

End


Estrarre i Tag da un file audio

Per estrarre i Tag da un file audio si utilizzerà l'evento "_Tag()" della Classe MediaPlayer.
L'evento avrà come parametro una variabile del tipo MediaTagList, che conterrà la lista dei Tag trovati.

Public Sub Button1_Click()

 Dim mp As MediaPlayer

 With mp = New MediaPlayer As "MediaPlayer1"
   .URL = Media.URL("/percorso/del/file/audio")
   .Play
   Wait .Duration
   .Stop
   .Close
 End With

End


' Se ci sono "Tag" nel file audio, verrà sollevato il seguente evento:
Public Sub MediaPlayer1_Tag(tagLista As MediaTagList)
 
 Dim tag As String
  
 TextArea1.Clear

 For Each tag In tagLista.Tags
' Vediamo nella "TextArea" i Tag trovati del file audio:
   TextArea1.Text &= tag & " -> " & tagLista[tag] & gb.NewLine
 Next

End

V'è da evidenziare che l'evento "_Tag()" sarà sollevato solo con l'attivazione del Metodo ".Play".

Gli effetti video con i plug-in

E' possibile ottenere simpatici effetti video utilizzando i plug-in resi disposibili da GStreamer.

In tal caso si farà uso anche della Classe MediaControl che è serve per gestire appositamente i plug-in di GStreamer.


Mostreremo di seguito il codice esenziale per l'utilizzo degli effetti video con i plug-In (si inserirà anche una DrawingArea sul Form):

Private mp As New MediaPlayer


Public Sub Form_Open()
  
 Dim da As DrawingArea
  
  With da = New DrawingArea(Me)
    .X = 10
    .Y = 10
    .W = 300
    .H = 300
    .Background = Color.Black
  End With
  
  mp.URL = Media.URL("/percorso/del/file/audio")
  
  AvviaPlugin(da)
  
End

Private Procedure AvviaPlugin(drar As DrawingArea)
 
 Dim uscitaVideo, plugVis As MediaControl
 Dim b As Byte
 Dim tipoPlug As String[] = ["goom", "monoscope", "spacescope",
                             "spectrascope", "synaescope", "wavescope"]
 Dim arrplugin As MediaControl[]
  
' Istanzia il controllo di uscita video da usare. In questo caso sarà "ximagesink", un "videosink" basato sullo standard X, e che è esso stesso un plug-in:
  uscitaVideo = New MediaControl(mp, "ximagesink")
  
' Si dice al MediaControl di mostrare il proprio output (gli effetti video) in uno specifico controllo GUI, solitamente una DrawingArea:
  mp.SetWindow(drar)
  
' Imposta il controllo di uscita video da usare:
  mp.Video.Output = uscitaVideo
  
' Un array di variabili di tipo "MediaControl", ossia di vari PlugIn disponibili:
  arrplugin = New MediaControl[]
  For b = 0 To 5
    plugVis = New MediaControl(mp, tipoPlug[b])
    arrplugin.Push(plugVis)
  Next
  
' Imposta il plug-in da utilizzare (ad esempio il 6° fra quelli contenuti dal vettore "arrplugin"):
  mp.Video.Visualisation = arrplugin[5]
     
End

Public Sub Form_Activate()
 
' Esegue il file audio:
  mp.Play()
  
End


Interfacciare la Classe MediaPlayer con il plugin "jackaudiosink" di GStreamer per eseguire i file audio

Per eseguire i file audio con la Classe MediaPlayer è possibile anche effettuare un interfacciamento tra il programma Gambas e il server audio JACK. Per fare ciò, ci si servirà dell'apposito plugin di GStreamer, chiamato "jackaudiosink". [Nota 1]

Ovviamente bisognerà avere l'accortezza di avviare il server Jack (per esempio avviando il programma qjackctl) prima di lanciare il programma Gambas.

All'avvio del programma viene creata dal server Jack una connessione tra il programma sorgente Gambas e la destinazione (di default il primo canale audio d'uscita disponibile della propria scheda audio).


Mostriamo un semplice ed essenziale esempio di esecuzione di un file audio in un'applicazione a riga di comando:

Public Sub Main()

 Dim mp As MediaPlayer

 With mp = New MediaPlayer
   .URL = Media.URL("/percorso/del/file/audio")
   .Audio.Output = New MediaControl(mp, "jackaudiosink")
   .Play
   Wait .Duration
   .Stop
   .Close
 End With

End


Note

[1] La stesura di paragrafo è stata possibile anche grazie al fondamentale apporto e studio del membro allegfede del forum gambas-it.org .