Autore: Fabio Di Matteo
Ultima revisione: 17/05/2012
In questo articolo ci occuperemo di creare un lettore multimediale completo di interfaccia grafica capace di leggere gran parte dei media esistenti. Per l'interfaccia grafica abbiamo scelto le gtk+2 ma avremmo potuto scegliere qualunque altra libreria grafica. Inoltre per la realizzazione del makefile ci appoggeremo al cmake in quanto ci garantira' massima portabilita.
Per chi vuole muovere i primi passi con libvlc puo' visitare il loro Wiki .
Per realizzare lo scheletro dell'applicazione che fa uso di gtk e del suo nativo supporto alle interfacce realizzate con glade utilizzero' il nostro script che automatizza il processo ( Creazione automatica dello scheletro per applicazioni gtkbuilder ) .
Dipendenze (debian/ubuntu): libvlccore-dev, libvlc-dev, libgtk2.0-dev, cmake, gcc .
Di seguito il sorgente abbondantemente commentato.
#include <gtk/gtk.h> //includo le librerie gtk e glade. #include <vlc/vlc.h> //includo le librerie vlc #include <gdk/gdkx.h> GtkBuilder *xml; //questo è il puntatore al file xml che contiene l'interfaccia GtkWidget *widget; //questa variabile serve per recuperare di volta in volta il // widget (ovvero l'oggetto ) che vogliamo usare /*Instanza di libvlc (core)*/ libvlc_instance_t * inst; /*Instanza di libvlc media player*/ libvlc_media_player_t *mp; /*Media (file o url da leggere)*/ libvlc_media_t *m; void on_MainWindow_delete_event(GtkWidget *widget, gpointer user_data) //altra callback associata alla chiusura della { // finestra gtk_main_quit(); } void on_btStop_clicked(GtkWidget *widget, gpointer user_data) { /* Stop playing */ libvlc_media_player_stop(mp); } void on_btPause_clicked(GtkWidget *widget, gpointer user_data) { /*Se il lettore sta leggendo qualcosa lo mette in pausa, * altrimenti lo mette in play*/ if (libvlc_media_player_is_playing(mp)==1) { libvlc_media_player_set_pause(mp,1); }else{ libvlc_media_player_play (mp); } } void on_btLoad_clicked (GtkWidget *widget, gpointer user_data) { /*Dialog gtk per caricare il file*/ GtkWidget *dialog, *MainWindow; GtkFileFilter* filter; gchar *filename; MainWindow= GTK_WIDGET (gtk_builder_get_object(xml, "MainWindow")); dialog = gtk_file_chooser_dialog_new ("Seleziona un file", GTK_WINDOW(MainWindow), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); /* Load the VLC engine */ inst = libvlc_new (0, NULL); /* Create a new item */ m = libvlc_media_new_path (inst, (char* )filename); /* Create a media player playing environement */ mp = libvlc_media_player_new_from_media (m); /* No need to keep the media now */ libvlc_media_release (m); /*Include il mediaplayer dentro un widget gtk (drawing area) */ widget= GTK_WIDGET (gtk_builder_get_object(xml, "MediaPlayer")); uint32_t xwin = GDK_WINDOW_XWINDOW (GTK_WIDGET (widget)->window); libvlc_media_player_set_xwindow(mp,xwin); /* play the media_player */ libvlc_media_player_play (mp); } gtk_widget_destroy (dialog); g_free (filename); } int main (int argc, char *argv[]) { gtk_init (&argc, &argv); gchar* base; gchar* glade_file; if (g_find_program_in_path ("gtk-vlc")==NULL){ /*Ricava il percorso dell'eseguibile, senza il nome del file*/ base = g_path_get_dirname(argv[0]); /*Concatena il percorso base al nome file gui.glade */ glade_file = g_build_filename (base,"../share/gtk-vlc", "gui.glade", NULL); }else{ base = g_path_get_dirname(g_find_program_in_path ("gtk-vlc")); glade_file = g_build_filename (base,"../share/gtk-vlc", "gui.glade", NULL); } /*Infine carica come disolito il file dell'interfaccia */ GError* error = NULL; xml = gtk_builder_new (); if (!gtk_builder_add_from_file (xml, glade_file, &error)) { g_warning ("Couldn't load builder file: %s", error->message); g_error_free (error); } /* connette tutti gli eventi dei widget alle rispettive funzioni */ gtk_builder_connect_signals (xml, NULL); /* Avvia il ciclo principale delle Gtk */ gtk_main (); return 0; }
Qualora non si abbia un'installazione sul proprio sistema è opportuno specificare la cartella contenente i plugins (=codec e altro) cambiando la dichairazione del libvlc engine come segue:
/*Path for plugin (bin/plugins)*/ const char * const vlc_args[] = { "--plugin-path=./plugins" }; /* Load the VLC engine */ inst = libvlc_new (1, vlc_args);
gui.glade
<?xml version="1.0" encoding="UTF-8"?> <interface> <requires lib="gtk+" version="2.16"/> <!-- interface-naming-policy project-wide --> <object class="GtkWindow" id="MainWindow"> <property name="visible">True</property> <signal name="delete_event" handler="on_MainWindow_delete_event"/> <child> <object class="GtkVBox" id="vbox1"> <property name="visible">True</property> <child> <placeholder/> </child> <child> <object class="GtkDrawingArea" id="MediaPlayer"> <property name="width_request">640</property> <property name="height_request">360</property> <property name="visible">True</property> </object> <packing> <property name="position">1</property> </packing> </child> <child> <object class="GtkHBox" id="hbox1"> <property name="visible">True</property> <child> <object class="GtkButton" id="btLoad"> <property name="label">Carica</property> <property name="height_request">30</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <signal name="clicked" handler="on_btLoad_clicked"/> </object> <packing> <property name="position">0</property> </packing> </child> <child> <object class="GtkButton" id="btPause"> <property name="label">Play/Pausa</property> <property name="height_request">30</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <signal name="clicked" handler="on_btPause_clicked"/> </object> <packing> <property name="position">1</property> </packing> </child> <child> <object class="GtkButton" id="btStop"> <property name="label">Stop</property> <property name="height_request">30</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <signal name="clicked" handler="on_btStop_clicked"/> </object> <packing> <property name="position">2</property> </packing> </child> </object> <packing> <property name="position">2</property> </packing> </child> </object> </child> </object> <object class="GtkAction" id="action1"/> </interface>
Il nostro script ha creato un CMakeLists.txt
generico per lavorare con le gtk+2 , noi aggiungeremo il supporto alla libreria libvnc .
cmake_minimum_required(VERSION 2.6) PROJECT(gtk-vlc) SET (AUTHOR "Fabio Di Matteo" INTERNAL "Author") SET (VERSION "0.1.0") INCLUDE (FindPkgConfig) IF (NOT PKG_CONFIG_FOUND) MESSAGE (FATAL_ERROR "pkg-config not found...") ENDIF (NOT PKG_CONFIG_FOUND) pkg_check_modules (GTK REQUIRED gtk+-2.0>=2.6) pkg_check_modules (LIBVLC REQUIRED libvlc) IF (NOT GTK_FOUND) MESSAGE(FATAL_ERROR "You don't seem to have gtk >= 2.6 development libraries installed...") ENDIF (NOT GTK_FOUND) IF (NOT LIBVLC_FOUND) MESSAGE(FATAL_ERROR "You don't seem to have libvlc development libraries installed...") ENDIF (NOT LIBVLC_FOUND) ADD_DEFINITIONS() INCLUDE_DIRECTORIES (. ${GTK_INCLUDE_DIRS}) LINK_DIRECTORIES (${GTK_LIBRARY_DIRS}) LINK_LIBRARIES (${GTK_LIBRARIES} ) LINK_LIBRARIES (${LIBVLC_LIBRARIES} ) #Indichiamo dove sara' messo l'eseguibile ADD_EXECUTABLE( bin/gtk-vlc src/main.c) #Se se si ha bisogno di eventuali dipendenze fornite da noi stessi #ADD_DEPENDENCIES (gtk-vlc src/main.c) #Variabili per le directory di installazione #ADD_DEFINITIONS (-DVERSION=\"${VERSION}\") #ADD_DEFINITIONS (-DDATADIR=\"${CMAKE_INSTALL_PREFIX}/share\") #Copia file per l'installazione #ADD_SUBDIRECTORY (src) INSTALL (TARGETS bin/gtk-vlc DESTINATION bin) INSTALL (DIRECTORY share/gtk-vlc DESTINATION share)
Quando vorremo compilare e installare il progetto basteranno i seguenti comandi:
cmake . make sudo make install
oppure
./configure make sudo make install
Qualora si vogliano cambiare le opzioni di configurazione e' sufficente lanciare il comando
ccmake .
se il comando ccmake non e' installato lo si puo' installare in ubuntu con sudo apt-get install cmake-curses-gui
Il nostro wiki installa solamente cookie tecnici necessari al funzionamento della piattaforma "Dokuwiki". Niente analitics, statistiche, tracciamenti o altro.