GTK wrapper for LibVLC. This library allows you to use libvlc from C code in a GTK interface with GTK widget representing the player.
http://code.google.com/p/libvlc-gtk/
svn checkout
http://libvlc-gtk.googlecode.com/svn/trunk/ libvlc-gtk-read-only
This is the example application supplyed by libvlc-gtk
Note: You need a current stable vlc.
Code:
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8-*- */
#include "gtk-libvlc-media-player.h"
static void
on_window_destroy(GtkWindow *window, gpointer user_data)
{
gtk_main_quit();
}
static void
on_scale_value_changed(GtkRange *range, gpointer user_data)
{
GtkLibVLCMediaPlayer *vlc = (GtkLibVLCMediaPlayer*)user_data;
g_print("value-changed\n");
}
static void
on_button_play_clicked(GtkButton *button, gpointer user_data)
{
GtkLibVLCMediaPlayer *vlc = (GtkLibVLCMediaPlayer*)user_data;
g_print("play\n");
gtk_libvlc_media_player_play(vlc, NULL);
}
static void
on_button_stop_clicked(GtkButton *button, gpointer user_data)
{
GtkLibVLCMediaPlayer *vlc = (GtkLibVLCMediaPlayer*)user_data;
g_print("stop\n");
gtk_libvlc_media_player_stop(vlc);
}
static void
on_button_record_clicked(GtkButton *button, gpointer user_data)
{
GtkLibVLCMediaPlayer *vlc = (GtkLibVLCMediaPlayer*)user_data;
g_print("record\n");
// gchar *options[] = {":vout-filter=transform", ":transform-type=90", NULL};
gchar *options[] = {":sout=#duplicate{dst=display,dst=std{access=file,mux=ts,dst='./test.ts'}}", NULL};
gtk_libvlc_media_player_play(vlc, options);
}
static void
on_button_next_clicked(GtkButton *button, gpointer user_data)
{
GtkLibVLCMediaPlayer *vlc = (GtkLibVLCMediaPlayer*)user_data;
g_print("play next\n");
gtk_libvlc_media_player_play_next(vlc, NULL);
}
static void
on_button_value_changed (GtkScaleButton *button,
gdouble value, gpointer user_data)
{
GtkLibVLCMediaPlayer *vlc = (GtkLibVLCMediaPlayer*)user_data;
g_print("value-changed : %f\n", value);
gtk_libvlc_media_player_set_volume (vlc, value);
gtk_libvlc_media_player_get_volume(vlc);
}
static void
on_button_fullscreen_clicked(GtkButton *button, gpointer user_data)
{
GtkLibVLCMediaPlayer *vlc = (GtkLibVLCMediaPlayer*)user_data;
g_print("fullscreen\n");
gtk_libvlc_media_player_set_fullscreen(vlc, TRUE);
}
static void
on_button_destroy_clicked(GtkButton *button, gpointer user_data)
{
GtkLibVLCMediaPlayer *vlc = (GtkLibVLCMediaPlayer*)user_data;
g_print("destroy\n");
gtk_widget_destroy(GTK_WIDGET(vlc));
}
static void
on_row_displayed_playlist (GtkTreeViewColumn *col,
GtkCellRenderer *renderer, GtkTreeModel *model,
GtkTreeIter *iter, gpointer user_data)
{
GtkLibVLCMedia* media;
gtk_tree_model_get(model, iter, GTK_LIBVLC_MODEL_MEDIA_COLUMN, &media, -1);
g_object_set(renderer, "text", media->mrl, "visible", TRUE, NULL);
}
static void
on_row_activated (GtkTreeView *tree_view, GtkTreePath *path,
GtkTreeViewColumn *column, gpointer user_data)
{
GtkLibVLCMediaPlayer *vlc = (GtkLibVLCMediaPlayer*)user_data;
gtk_libvlc_media_player_play_media_at_path(vlc, path, NULL);
}
int main (int argc, char ** argv)
{
GtkWidget *window;
GtkWidget *hbox;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "GtkVLCMediaPlayer widget");
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 600, 400);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(on_window_destroy), NULL);
hbox = gtk_hbox_new(TRUE, 2);
GtkLibVLCInstance* instance;
const gchar* vlc_args[] = {
"-I dummy", /* Don't use any interface */
"--ignore-config", /* Don't use VLC's config */
"--extraintf=logger", //log anything
"-vvv" //be much more verbose then normal for debugging purpose
};
instance = gtk_libvlc_instance_new(vlc_args);
//instance = gtk_libvlc_instance_new(NULL);
// Create players
int i;
for(i=0; i<1; i++){
GtkWidget *vbox;
GtkWidget *vlc;
GtkWidget *hbox_button;
GtkWidget *button;
GtkWidget *treeview;
GtkWidget *hpaned;
GtkWidget *scale;
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
hpaned = gtk_hpaned_new ();
gtk_paned_set_position (GTK_PANED(hpaned), 400);
vbox = gtk_vbox_new(FALSE, 0);
gtk_paned_add1 (GTK_PANED(hpaned), vbox);
// Media player
vlc = gtk_libvlc_media_player_new(instance);
gtk_libvlc_media_player_set_volume (GTK_LIBVLC_MEDIA_PLAYER(vlc), 0.7);
gtk_box_pack_start (GTK_BOX(vbox), vlc, TRUE, TRUE, 2);
// HScale
hbox_button = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start (GTK_BOX(vbox), hbox_button, FALSE, TRUE, 0);
scale = gtk_hscale_new_with_range (0.0, 1.0, 0.1);
gtk_scale_set_draw_value (GTK_SCALE(scale), TRUE);
gtk_scale_set_value_pos (GTK_SCALE(scale), GTK_POS_RIGHT);
g_signal_connect(G_OBJECT(scale), "value-changed",
G_CALLBACK(on_scale_value_changed), vlc);
gtk_box_pack_start (GTK_BOX(hbox_button), scale, TRUE, TRUE, 0);
// Button bar
hbox_button = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start (GTK_BOX(vbox), hbox_button, FALSE, FALSE, 0);
// Play button
button = gtk_button_new();
gtk_button_set_image (GTK_BUTTON(button),
gtk_image_new_from_stock(GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_BUTTON));
gtk_box_pack_start (GTK_BOX(hbox_button), button, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(on_button_play_clicked), vlc);
// Stop button
button = gtk_button_new();
gtk_button_set_image (GTK_BUTTON(button),
gtk_image_new_from_stock(GTK_STOCK_MEDIA_STOP, GTK_ICON_SIZE_BUTTON));
gtk_box_pack_start (GTK_BOX(hbox_button), button, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(on_button_stop_clicked), vlc);
// Record button
button = gtk_button_new();
gtk_button_set_image (GTK_BUTTON(button),
gtk_image_new_from_stock(GTK_STOCK_MEDIA_RECORD, GTK_ICON_SIZE_BUTTON));
gtk_box_pack_start (GTK_BOX(hbox_button), button, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(on_button_record_clicked), vlc);
// Media next button
button = gtk_button_new();
gtk_button_set_image (GTK_BUTTON(button),
gtk_image_new_from_stock(GTK_STOCK_MEDIA_NEXT, GTK_ICON_SIZE_BUTTON));
gtk_box_pack_start (GTK_BOX(hbox_button), button, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(on_button_next_clicked), vlc);
// Volume button
button = gtk_volume_button_new ();
gdouble value = gtk_libvlc_media_player_get_volume(GTK_LIBVLC_MEDIA_PLAYER(vlc));
gtk_scale_button_set_value (GTK_SCALE_BUTTON(button), value);
gtk_box_pack_start (GTK_BOX(hbox_button), button, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(button), "value-changed",
G_CALLBACK(on_button_value_changed), vlc);
// Fullscreen button
button = gtk_button_new();
gtk_button_set_image (GTK_BUTTON(button),
gtk_image_new_from_stock(GTK_STOCK_FULLSCREEN, GTK_ICON_SIZE_BUTTON));
gtk_box_pack_start (GTK_BOX(hbox_button), button, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(on_button_fullscreen_clicked), vlc);
// Destroy button
button = gtk_button_new_with_label("destroy");
gtk_box_pack_start (GTK_BOX(hbox_button), button, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(on_button_destroy_clicked), vlc);
// Playlist
treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (GTK_LIBVLC_MEDIA_PLAYER(vlc)->media_list));
column = gtk_tree_view_column_new();
gtk_tree_view_column_set_title (column, "Playlist");
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start(column, renderer, FALSE);
gtk_tree_view_column_set_cell_data_func(column, renderer, on_row_displayed_playlist,
NULL, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
g_signal_connect(G_OBJECT(treeview), "row-activated",
G_CALLBACK(on_row_activated), vlc);
GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
//gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW(scrolled_window), treeview);
gtk_container_add(GTK_CONTAINER(scrolled_window), treeview);
gtk_paned_add2 (GTK_PANED(hpaned), scrolled_window);
//gtk_box_pack_start (GTK_BOX(hbox_player), treeview, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX(hbox), hpaned, TRUE, TRUE, 0);
// Populate the playlist
GtkLibVLCMedia *media;
media = gtk_libvlc_media_new("rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=678&flavour=sd");
gtk_libvlc_media_player_add_media(GTK_LIBVLC_MEDIA_PLAYER(vlc), media);
g_object_unref(media);
media = gtk_libvlc_media_new("rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=201&flavour=ld");
gtk_libvlc_media_player_add_media(GTK_LIBVLC_MEDIA_PLAYER(vlc), media);
g_object_unref(media);
media = gtk_libvlc_media_new("mms://vipmms9.yacast.net/aptv_live03");
gtk_libvlc_media_player_add_media(GTK_LIBVLC_MEDIA_PLAYER(vlc), media);
g_object_unref(media);
media = gtk_libvlc_media_new("mms://vipmms9.yacast.net/bfm_bfmtv");
gtk_libvlc_media_player_add_media(GTK_LIBVLC_MEDIA_PLAYER(vlc), media);
g_object_unref(media);
media = gtk_libvlc_media_new("http://streaming.radio.funradio.fr:80/fun-1-44-96");
gtk_libvlc_media_player_add_media(GTK_LIBVLC_MEDIA_PLAYER(vlc), media);
g_object_unref(media);
media = gtk_libvlc_media_new("http://viphttp.yacast.net/V4/radiofrance/franceinfo_bd.m3u");
gtk_libvlc_media_player_add_media(GTK_LIBVLC_MEDIA_PLAYER(vlc), media);
g_object_unref(media);
media = gtk_libvlc_media_new("./playlist.m3u");
gtk_libvlc_media_player_add_media(GTK_LIBVLC_MEDIA_PLAYER(vlc), media);
g_object_unref(media);
media = gtk_libvlc_media_new("v4l2://");
gtk_libvlc_media_player_add_media(GTK_LIBVLC_MEDIA_PLAYER(vlc), media);
g_object_unref(media);
}
gtk_container_add(GTK_CONTAINER(window), hbox);
gtk_widget_show_all(window);
gtk_main();
g_object_unref(G_OBJECT(instance));
return 0;
}