La gestione dei file MIDI mediante le funzioni esterne del API di Rhythmbox

Da Gambas-it.org - Wikipedia.

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, err 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 !")
  
  err = Alloc(SizeOf(gb.Pointer), 1)
  
  bo = rb_player_open(pl, g_filename_to_uri("/percorso/del/file.mid", Null, 0), 0, 0, err)
  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
  
  Free(err)
  
End



Riferimenti