Autore Topic: usare Gstreamer per riprodurre audio attraverso Jack Audio Server.  (Letto 799 volte)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Il seguente esempio (post numero 10 http://www.gambas-it.org/smf/index.php?topic=5414.msg40479#msg40479) e' ora COMPLETO e FUNZIONANTE
Citazione
Premettiamo che il seguente esempio e' attualemente INCOMPLETO, poiche' il file audio viene APERTO, ma non riprodotto.

Specifichiamo che l'interfacciamento tra' il programma in GAMBAS e il server audio JACK e' ottenuto ESCLUSIVAMENTE con risorse interne a GAMBAS, ovvero il componente GB.MEDIA

in pratica mi e' passata per la mente l'idea che potesse esserci un "plug in" di gstreamer che potese interfacciarsi con JACK AUDIO e cercando su google e' venuto fuori che  "jackaudiosink" potrebbe essere cio' che ci necessita ().

testando il nostro server audio jack (che deve essere in esecuzione. Vi consiglio l'ottimo QJACKCTL) con questa riga da terminale:
Codice: [Seleziona]
 gst-launch audiotestsrc ! jackaudiosink
possiamo vedere nelle connessioni che viene creato un "CAVO" tra' la sorgente (il programma  gst-launch) e la destinazione (di default il primo canale audio d'uscita disponibile della vostra scheda audio).

quindi parafrasando i vari esempi presenti sul wiki di gambas italia relativi alal gestione del VIDEO, ho cambiato un po' le cose:
Codice: [Seleziona]
' Gambas class file

Private Player_A As MediaPlayer   'player che gestira' i media con gb.media (gstreamer)
Private UscitaAudio As MediaControl 'l'ambito di rendering dei media

Public Sub Button1_Click()

  Dialog.Filter = ["*.mp3", "file audio mp3", "*", "All files"]

  If Dialog.OpenFile() Then
    Return ' User pressed Cancel -
    Else
      Label1.Text = Dialog.Path
      Button2.Enabled = True
  Endif

End

Public Sub Button2_Click()
  Try Player_A.Close

  Player_A = New MediaPlayer As "MediaPlayer"
  'se vuoi riprodurre il media nell'ambiente VERO usa questo
  UscitaAudio = New MediaControl(Player_A, "jackaudiosink")
 
  Button2.Enabled = False
  Button3.Enabled = True

End

Public Sub Button3_Click()

  Player_A.URL = Media.URL(Label1.Text)
  Player_A.Play
 
  Button4.Enabled = True
  Button5.Enabled = False
 
  Timer1.Start
 
End

Public Sub Timer1_Timer()

  ProgressBar1.Value = Player_A.Position / Player_A.Duration

End

Public Sub Button4_Click()
  Timer1.Stop

  Try Player_A.Stop
  Button5.Enabled = True

End

Public Sub Button5_Click()

  Try Player_A.Close
 
  Button2.Enabled = True
  Button3.Enabled = False
  Button4.Enabled = False
  Button5.Enabled = False

End

in allegato il progetto d'esempio.

PS: perche' il file non vada in play ancora non lo so'. Ipotizzo che non sia stato creato "in automatico" il client di jack. Quindi dovro' scoprire come rendere "edotto" il server audio jack della nostra esistenza. Stay tuned


https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-plugin-jack.html
« Ultima modifica: 27 Gennaio 2017, 20:54:58 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.179
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
« Risposta #1 il: 27 Gennaio 2017, 14:43:17 »
Mi dà un errore alla riga e per i motivi visibili nel file immagine qui allegato.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
« Risposta #2 il: 27 Gennaio 2017, 15:14:40 »
hai copiaincollato o preso l'allegato?

hai cliccato su browse per selezionare un file audio?

:D
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.179
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
« Risposta #3 il: 27 Gennaio 2017, 15:55:35 »
hai copiaincollato o preso l'allegato?
Scaricato l'allegato.



hai cliccato su browse per selezionare un file audio?
No, il file audio me l'ha portato la cicogna !      >:(
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.179
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
« Risposta #4 il: 27 Gennaio 2017, 16:12:50 »
Dunque... ho constatato che il problema sorge tenendo attiva questa riga:
Codice: [Seleziona]
UscitaAudio = New MediaControl(Player_A, "jackaudiosink")

Se infatti la disattivo, il file audio viene eseguito regolarmente.

....non capisco, del resto, l'utilità della variabile "UscitaAudio", dato che non viene utilizzata da alcuna funzione.   :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.179
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
« Risposta #5 il: 27 Gennaio 2017, 16:19:19 »
Se attivo quella riga del codice, e se avvio preliminarmente QjackCTL, il problema non viene sollevato, ma ottengo un nuovo errore di "Division by zero" a questa riga:
Codice: [Seleziona]
ProgressBar1.Value = Player_A.Position / Player_A.Duration

Se disattivo questa riga, non viene sollevato alcun errore, ma il file audio non viene eseguito, o comunque (forse pur partendo) non si sente niente.


Suppongo, però, che non parta, perché, ponendo questa riga di verifica nella routine del Timer:
Codice: [Seleziona]
Public Sub Timer1_Timer()

   Print Player_A.Duration

End
la durata del file audio risulta essere sempre zero.

Ad ogni modo ho constatato che, come sempre mi accade, è l'avvio di Jack che mi impedisce l'esecuzione dei flussi audio in genere (tranne il Midi con Alsa).

Sarebbe opportuno che anche altri testassero il tuo programma.
« Ultima modifica: 27 Gennaio 2017, 16:29:00 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.179
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
« Risposta #6 il: 27 Gennaio 2017, 17:29:05 »
Vi consiglio l'ottimo QJACKCTL) con questa riga da terminale:
Codice: [Seleziona]
 gst-launch audiotestsrc ! jackaudiosink
possiamo vedere nelle connessioni che viene creato un "CAVO" tra' la sorgente (il programma  gst-launch) e la destinazione (di default il primo canale audio d'uscita disponibile della vostra scheda audio).

Se vuoi testare con Gambas quella riga, usando le funzioni esterne di GStreamer, eccoti qua il codice: 

Codice: [Seleziona]
Library "libgstreamer-1.0"

Private Enum GST_STATE_VOID_PENDING = 0, GST_STATE_NULL, GST_STATE_READY, GST_STATE_PAUSED, GST_STATE_PLAYING
 
' gst_init (int *argc, char **argv[])
' Initializes the GStreamer library, setting up internal path lists, registering built-in elements, and loading standard plugins.
Private Extern gst_init(argc As Pointer, argv As Pointer)

' GstElement * gst_parse_launch (const gchar *pipeline_description, GError **error)
' Create a new pipeline based on command line syntax.
Private Extern gst_parse_launch(description As String, GError As Pointer) As Pointer

' GstStateChangeReturn gst_element_set_state(GstElement *element, GstState state)
' Sets the state of the element.
Private Extern gst_element_set_state(gstelement As Pointer, state As Integer) As Integer
 
' void gst_object_unref(gpointer object)
' Decrements the reference count on object.
Private Extern gst_object_unref(gobject As Pointer)


Public Sub Main()
 
 Dim audio As Pointer
     
  gst_init(0, 0)
 
  audio = gst_parse_launch("audiotestsrc volume=0.5 freq=440 wave=sine ! jackaudiosink", 0)
         
' Avviamo l'esecuzione dell'onda sinusoidale......:
  gst_element_set_state(audio, GST_STATE_PLAYING)
 
' ...per 10 secondi:
  Sleep 10
 
  gst_object_unref(audio)
         
End
Dovrà essere preliminarmente avviato il server Jack.

« Ultima modifica: 27 Gennaio 2017, 18:18:59 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.179
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
« Risposta #7 il: 27 Gennaio 2017, 17:41:13 »
....se poi proprio vuoi invocare le risorse di Gambas, in particolare quelle delle Classi MediaPipeline e MediaControl del Componente gb.media, puoi fare così:

Codice: [Seleziona]
Public Sub Main()

  Dim pl As MediaPipeline
  Dim src, snk As MediaControl

   pl = New MediaPipeline
   
   src = New MediaControl(pl, "audiotestsrc")
   src["volume"] = "0.5"
   src["freq"] = "440"
   src["wave"] = 0
   snk = New MediaControl(pl, "jackaudiosink")

   src.LinkTo(snk)
   
   pl.Play()

   Sleep 10

End



« Ultima modifica: 27 Gennaio 2017, 18:24:20 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.179
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
« Risposta #8 il: 27 Gennaio 2017, 18:38:07 »
Ad ogni modo se vuoi eseguire un file wav con il Componente gb.media, utilizzando il plugin jackaudiosink di GStreamer, ecco qua:

Codice: [Seleziona]
Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, prs, cnv, snk As MediaControl
 
   pl = New MediaPipeline
   
   src = New MediaControl(pl, "filesrc")
   src["location"] = "/percorso/del/file.wav"      '  "location" è una proprietà del plugin "filesrc"
   prs = New MediaControl(pl, "wavparse")
   cnv = New MediaControl(pl, "audioconvert")
   snk = New MediaControl(pl, "jackaudiosink")
   src.LinkTo(prs)
   prs.LinkTo(cnv)
   cnv.LinkTo(snk)
   
   pl.Play()

   Print "\nDurata: " & Date(0, 0, 0, 0, 0, 0, pl.Duration * 1000)
   Wait pl.Duration
   
End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
« Risposta #9 il: 27 Gennaio 2017, 20:44:15 »
risolto.

Ora funziona e va in play, mancava un pezzo.

Codice: [Seleziona]
Player_A = New MediaPlayer As "MediaPlayer"
  'se vuoi riprodurre il media nell'ambiente VERO usa questo
 
  UscitaAudio = New MediaControl(Player_A, "jackaudiosink")
 
  Player_A.Audio.Output = UscitaAudio

dovevo indicare a gstreamer che l'uscita audio era quella settata nel modo opportuno :D

in allegato la funzione (che a me funziona senza spirito santo ;p)
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.179
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
« Risposta #10 il: 27 Gennaio 2017, 22:59:14 »
....non capisco, del resto, l'utilità della variabile "UscitaAudio", dato che non viene utilizzata da alcuna funzione.

Ora funziona e va in play, mancava un pezzo.

Codice: [Seleziona]
UscitaAudio = New MediaControl(Player_A, "jackaudiosink")
 
  Player_A.Audio.Output = UscitaAudio

dovevo indicare a gstreamer che l'uscita audio era quella settata nel modo opportuno

Ecco, ora sì !

Funziona.
Molto bene. Bravo.   :)
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.179
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
« Risposta #11 il: 28 Gennaio 2017, 00:21:05 »
Ti comunico che la tua applicazione è in grado di eseguire, oltre ai file audio, anche i file Midi.


Sia lodato San Midi !

 sanmidi
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
« Risposta #12 il: 13 Febbraio 2017, 19:11:40 »
secondo te VUOT per fare il play di uno streaming audio?

ho provato con:
Player_A.URL = Media.URL("http://vps222134.ovh.net:8000/low_latency")

che e' il puntamento allo stream mp3, ma il sistema non gradisce ....
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.179
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
« Risposta #13 il: 13 Febbraio 2017, 21:04:57 »
secondo te VUOTT per fare il play di uno streaming audio?
...e se io fossi morto, o meglio...tornato indietro nel passato, come risolveresti ?
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:usare Gstreamer per riprodurre audio attraverso Jack Audio Server.
« Risposta #14 il: 15 Febbraio 2017, 09:59:02 »
Nulla,  me inventerei un altro progetto :-)

No chiedevo a te perché  mi hai detto che avevi sperimentato con i midi e quindi magari avevi testato qualche altra metodologia :p
se corri, morirai stanco (motto degli sniper)