Ottenere la durata di un file audio mediante le funzioni esterne del API di GStreamer

Da Gambas-it.org - Wikipedia.

Per ottenere la durata di un file audio audio, è possibile usare questo codice:

Library "libgstreamer-1.0"

Private Enum GST_STATE_VOID_PENDING = 0, GST_STATE_NULL, GST_STATE_READY, GST_STATE_PAUSED, GST_STATE_PLAYING
Private Const GST_FORMAT_TIME As Integer = 3

' 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_element_factory_make(const gchar *factoryname, Const gchar * name)
' Create a new element of the type defined by the given element factory.
Private Extern gst_element_factory_make(factoryname As String, name As String) 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

' void g_object_set(gpointer object, const gchar *first_property_name, ...)
' Sets properties on an object.
Private Extern g_object_set(gobject As Pointer, key As String, value As String, tertium As String)

' 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

' gboolean gst_element_query_duration (GstElement *element, GstFormat format, gint64 *duration)
' Queries an element for the total stream duration in nanoseconds.
Private Extern gst_element_query_duration(gstelement As Pointer, gstformat As Pointer, duration As Pointer) As Boolean

' void gst_object_unref(gpointer object)
' Decrements the reference count on object .
Private Extern gst_object_unref(gobject As Pointer)


Public Sub Main()

 Dim fileaudio as string
 Dim elem As Pointer
 Dim durata As Long

 fileaudio = "/percorso/del/file/audio"
 Print "File audio: "; fileaudio

 gst_init(0, 0)

 elem = gst_element_factory_make("playbin", "riproduzione")

 g_object_set(elem, "uri", g_filename_to_uri(fileaudio, Null, 0), Null)

' Avvia la riproduzione audio:
 gst_element_set_state(elem, GST_STATE_PLAYING)
 
 Repeat
   gst_element_query_duration(elem, GST_FORMAT_TIME, VarPtr(durata))
 Until durata > 0

 Print "\nDurata:     \e[31m"; Time(0, 0, 0, durata / 1000000)

 gst_object_unref(elem)
 
End