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

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
 
''Rythmbox'' è una libreria del progetto GNOME capace di gestire ed eseguire (oltre a vari formati audio) i file MIDI.
 
''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.9.0.0''" e "''libgstreamer-1.0.so''"
+
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:
 
Mostriamo un semplice esempio pratico, in cui si eseguirà un file Midi:
  Library "librhythmbox-core:9.0.0"
+
  Library "librhythmbox-core:10.0.0"
 
   
 
   
 
  Private Enum RB_PLAYER_PLAY_REPLACE = 0, RB_PLAYER_PLAY_AFTER_EOS, RB_PLAYER_PLAY_CROSSFADE
 
  Private Enum RB_PLAYER_PLAY_REPLACE = 0, RB_PLAYER_PLAY_AFTER_EOS, RB_PLAYER_PLAY_CROSSFADE
Riga 41: Riga 41:
 
   Dim pl, err As Pointer
 
   Dim pl, err As Pointer
 
   Dim bo As Boolean
 
   Dim bo As Boolean
   Dim tm1 As Long
+
   Dim c, tm As Long
 
    
 
    
 
   gst_init(0, 0)
 
   gst_init(0, 0)
Riga 56: Riga 56:
 
   If Not bo Then Error.Raise("ERRORE !")
 
   If Not bo Then Error.Raise("ERRORE !")
 
    
 
    
   Wait 0.3
+
<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
 
    
 
    
 
   Repeat
 
   Repeat
     tm1 = rb_player_get_time(pl)
+
<FONT Color=gray>' ''La variabile "c" sarà incrementata ogni 1/10 di secondo.''</font>
     Write "\r" & CStr(Date(0, 0, 0, 0, 0, 0, tm1 / 1000000))
+
    Inc c
     Wait 0.001
+
     Sleep 0.1
   Until tm1 = 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))
 +
     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()"''
 +
' ''terminerà di restituire il valore di ritorno al termine dell'esecuzione del file Midi:''</font>
 +
   Until (c * 100000000) > tm
 
    
 
    
 
   Free(err)
 
   Free(err)

Versione delle 16:39, 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, 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