Differenze tra le versioni di "La gestione dei file MIDI mediante le funzioni esterne del API di Rhythmbox"

Da Gambas-it.org - Wikipedia.
Riga 43: Riga 43:
 
   Dim c, tm As Long
 
   Dim c, tm As Long
 
    
 
    
  gst_init(0, 0)
+
  gst_init(0, 0)
 
    
 
    
  pl = rb_player_new(False, 0)
+
  pl = rb_player_new(False, 0)
  If pl = 0 Then Error.Raise("ERRORE !")
+
  If pl = 0 Then Error.Raise("ERRORE !")
 
    
 
    
  err = Alloc(SizeOf(gb.Pointer), 1)
+
  bo = rb_player_open(pl, g_filename_to_uri("<FONT Color=gray>''/percorso/del/file.mid''</font>", Null, 0), 0, 0, 0)
 +
  If Not bo Then Error.Raise("ERRORE !")
 
    
 
    
  bo = rb_player_open(pl, g_filename_to_uri("<FONT Color=gray>''/percorso/del/file.mid''</font>", Null, 0), 0, 0, 0)
+
  bo = rb_player_play(pl, RB_PLAYER_PLAY_AFTER_EOS, 0, 0)
  If Not bo Then Error.Raise("ERRORE !")
+
  If Not bo Then Error.Raise("ERRORE !")
 
 
  bo = rb_player_play(pl, RB_PLAYER_PLAY_AFTER_EOS, 0, 0)
 
  If Not bo Then Error.Raise("ERRORE !")
 
 
    
 
    
 
  <FONT Color=gray>' ''Si imposta la variabile "c" a -20 rispetto all'attesa di 1/10 di secondo per non far arrestare il ciclo prima del termine del file:''</font>
 
  <FONT Color=gray>' ''Si imposta la variabile "c" a -20 rispetto all'attesa di 1/10 di secondo per non far arrestare il ciclo prima del termine del file:''</font>
  c = -20
+
  c = -20
 
    
 
    
  Repeat
+
  Repeat
 
  <FONT Color=gray>' ''La variabile "c" sarà incrementata ogni 1/10 di secondo.''</font>
 
  <FONT Color=gray>' ''La variabile "c" sarà incrementata ogni 1/10 di secondo.''</font>
    Inc c
+
    Inc c
    Sleep 0.1
+
    Sleep 0.1
    tm = rb_player_get_time(pl)
+
    tm = rb_player_get_time(pl)
    Write #File.out, "\rTempo trascorso: " & Str(Date(0, 0, 0, 0, 0, 0, tm / 1000000))
+
    Write #File.out, "\rTempo trascorso: " & Str(Date(0, 0, 0, 0, 0, 0, tm / 1000000))
    Flush #File.Out
+
    Flush #File.Out
 
  <FONT Color=gray>' ''La variabile "c" rispetto a "tm" porta un leggero ritardo, che sarà colmato quando la funzione "rb_player_get_time()"''
 
  <FONT Color=gray>' ''La variabile "c" rispetto a "tm" porta un leggero ritardo, che sarà colmato quando la funzione "rb_player_get_time()"''
 
  ' ''terminerà di restituire il valore di ritorno al termine dell'esecuzione del file Midi:''</font>
 
  ' ''terminerà di restituire il valore di ritorno al termine dell'esecuzione del file Midi:''</font>
  Until (c * 100000000) > tm
+
  Until (c * 100000000) > tm
 
    
 
    
 
  '''End'''
 
  '''End'''

Versione delle 16:43, 11 ago 2019

Rythmbox è una libreria del progetto GNOME capace di gestire ed eseguire (oltre a vari formati audio) i file MIDI.

Va utilizzata congiuntamente con alcune funzioni esterne della libreria di GStreamer. Pertanto sarà necessario avere intallate nel sistema e richiamare in Gambas le librerie dinamiche condivise: "librhythmbox-core.so.10.0.0" e "libgstreamer-1.0.so"


Mostriamo un semplice esempio pratico, in cui si eseguirà un file Midi:

Library "librhythmbox-core:10.0.0"

Private Enum RB_PLAYER_PLAY_REPLACE = 0, RB_PLAYER_PLAY_AFTER_EOS, RB_PLAYER_PLAY_CROSSFADE

' RBPlayer * rb_player_new (gboolean want_crossfade, GError **error)
' Creates a new player object.
Private Extern rb_player_new(want_crossfade As Boolean, gerror As Pointer) As Pointer

' gboolean rb_player_open (RBPlayer *player, const char *uri, gpointer stream_data, GDestroyNotify stream_data_destroy, GError **error)
' Prepares a stream for playback.
Private Extern rb_player_open(player As Pointer, uri As String, stream_data As Pointer, stream_data_destroy As Pointer, gerror As Pointer) As Boolean

' gboolean rb_player_play (RBPlayer *player, RBPlayerPlayType play_type, gint64 crossfade, GError **error)
' Starts playback of the most recently opened stream.
Private Extern rb_player_play(player As Pointer, play_type As Integer, crossfade As Long, gerror As Pointer) As Boolean

' gint64 rb_player_get_time (RBPlayer *player)
' Returns the current playback for the current stream in nanoseconds.
Private Extern rb_player_get_time(player As Pointer) As Long


Library "libgstreamer-1.0"

' 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)

' gchar * g_filename_to_uri (const gchar *filename, const gchar *hostname, GError **error)
' Converts an absolute filename to an escaped ASCII-encoded URI.
Private Extern g_filename_to_uri(filename As String, hostname As String, GError As Pointer) As String


Public Sub Main()

 Dim pl As Pointer
 Dim bo As Boolean
 Dim c, tm As Long
  
 gst_init(0, 0)
  
 pl = rb_player_new(False, 0)
 If pl = 0 Then Error.Raise("ERRORE !")
  
 bo = rb_player_open(pl, g_filename_to_uri("/percorso/del/file.mid", Null, 0), 0, 0, 0)
 If Not bo Then Error.Raise("ERRORE !")
  
 bo = rb_player_play(pl, RB_PLAYER_PLAY_AFTER_EOS, 0, 0)
 If Not bo Then Error.Raise("ERRORE !")
  
' Si imposta la variabile "c" a -20 rispetto all'attesa di 1/10 di secondo per non far arrestare il ciclo prima del termine del file:
 c = -20
  
 Repeat
' La variabile "c" sarà incrementata ogni 1/10 di secondo.
   Inc c
   Sleep 0.1
   tm = rb_player_get_time(pl)
   Write #File.out, "\rTempo trascorso: " & Str(Date(0, 0, 0, 0, 0, 0, tm / 1000000))
   Flush #File.Out
' La variabile "c" rispetto a "tm" porta un leggero ritardo, che sarà colmato quando la funzione "rb_player_get_time()"
' terminerà di restituire il valore di ritorno al termine dell'esecuzione del file Midi:
 Until (c * 100000000) > tm
  
End



Riferimenti