static gboolean render_cb(GtkGLArea* area, GdkGLContext* ctxt, gpointer udata) { GtPlayerMpv* self = GT_PLAYER_MPV(udata); GtPlayerMpvPrivate* priv = gt_player_mpv_get_instance_private(self); int width; int height; int fbo; if (!priv->opengl_ready) { check_mpv_error(mpv_opengl_cb_init_gl(priv->mpv_opengl, NULL, get_proc_address, NULL)); priv->opengl_ready = TRUE; } width = gtk_widget_get_allocated_height(priv->opengl_area); height = (-1)*gtk_widget_get_allocated_width(priv->opengl_area); fbo = -1; glGetIntegerv(GL_FRAMEBUFFER_BINDING, &fbo); mpv_opengl_cb_draw(priv->mpv_opengl, fbo, width, height); return TRUE; }
static void stop(GtPlayerBackendMpvOpenGL* self) { GtPlayerBackendMpvOpenGLPrivate* priv = gt_player_backend_mpv_opengl_get_instance_private(self); const gchar* mpv_cmd[] = {"stop", NULL}; check_mpv_error(mpv_command(priv->mpv, mpv_cmd)); }
static void play(GtPlayerBackendMpvOpenGL* self) { GtPlayerBackendMpvOpenGLPrivate* priv = gt_player_backend_mpv_opengl_get_instance_private(self); if (priv->uri) { const gchar* mpv_cmd[] = {"loadfile", priv->uri, "replace", NULL}; check_mpv_error(mpv_command(priv->mpv, mpv_cmd)); } }
static void stop(GtPlayer* player) { GtPlayerMpv* self = GT_PLAYER_MPV(player); GtPlayerMpvPrivate* priv = gt_player_mpv_get_instance_private(self); const gchar* mpv_cmd[] = {"stop", NULL}; check_mpv_error(mpv_command(priv->mpv, mpv_cmd)); priv->playing = FALSE; g_object_notify_by_pspec(G_OBJECT(self), props[PROP_PLAYING]); }
static void play(GtPlayer* player) { GtPlayerMpv* self = GT_PLAYER_MPV(player); GtPlayerMpvPrivate* priv = gt_player_mpv_get_instance_private(self); const gchar* mpv_cmd[] = {"loadfile", priv->current_uri, "replace", NULL}; check_mpv_error(mpv_command(priv->mpv, mpv_cmd)); priv->playing = TRUE; g_object_notify_by_pspec(G_OBJECT(self), props[PROP_PLAYING]); }
static void realise_oneshot_cb(GtkWidget* widget, gpointer udata) { GtPlayerBackendMpvOpenGL* self = GT_PLAYER_BACKEND_MPV_OPENGL(udata); GtPlayerBackendMpvOpenGLPrivate* priv = gt_player_backend_mpv_opengl_get_instance_private(self); gtk_gl_area_make_current(GTK_GL_AREA(priv->widget)); check_mpv_error(mpv_opengl_cb_init_gl(priv->mpv_opengl, NULL, get_proc_address, NULL)); g_signal_handlers_disconnect_by_func(widget, realise_oneshot_cb, udata); }
static void gt_player_mpv_init(GtPlayerMpv* self) { GtPlayerMpvPrivate* priv = gt_player_mpv_get_instance_private(self); priv->mpv = mpv_create(); priv->opengl_area = gtk_gl_area_new(); priv->opengl_ready = FALSE; priv->chat_view = GTK_WIDGET(gt_chat_new()); check_mpv_error(mpv_set_option_string(priv->mpv, "vo", "opengl-cb")); check_mpv_error(mpv_initialize(priv->mpv)); priv->mpv_opengl = mpv_get_sub_api(priv->mpv, MPV_SUB_API_OPENGL_CB); mpv_opengl_cb_set_update_callback(priv->mpv_opengl, (mpv_opengl_cb_update_fn) opengl_cb, self); g_signal_connect(priv->opengl_area, "render", G_CALLBACK(render_cb), self); gtk_container_add(GTK_CONTAINER(self), priv->opengl_area); gtk_widget_show_all(GTK_WIDGET(self)); }
static void gt_player_backend_mpv_opengl_init(GtPlayerBackendMpvOpenGL* self) { GtPlayerBackendMpvOpenGLPrivate* priv = gt_player_backend_mpv_opengl_get_instance_private(self); MESSAGE("Init"); setlocale(LC_NUMERIC, "C"); priv->widget = gtk_gl_area_new(); priv->mpv = mpv_create(); g_object_set(priv->widget, "expand", TRUE, NULL); gtk_widget_add_events(priv->widget, GDK_BUTTON_PRESS_MASK); check_mpv_error(mpv_set_option_string(priv->mpv, "audio-client-name", "GNOME Twitch")); check_mpv_error(mpv_set_option_string(priv->mpv, "title", "")); check_mpv_error(mpv_set_option_string(priv->mpv, "vo", "opengl-cb")); check_mpv_error(mpv_set_option_string(priv->mpv, "softvol", "yes")); check_mpv_error(mpv_set_option_string(priv->mpv, "softvol-max", "100")); check_mpv_error(mpv_observe_property(priv->mpv, 0, "volume", MPV_FORMAT_DOUBLE)); check_mpv_error(mpv_observe_property(priv->mpv, 0, "cache-buffering-state", MPV_FORMAT_INT64)); check_mpv_error(mpv_initialize(priv->mpv)); mpv_set_wakeup_callback(priv->mpv, mpv_wakeup_cb, self); priv->mpv_opengl = mpv_get_sub_api(priv->mpv, MPV_SUB_API_OPENGL_CB); mpv_opengl_cb_set_update_callback(priv->mpv_opengl, (mpv_opengl_cb_update_fn) opengl_cb, self); g_signal_connect(priv->widget, "destroy", G_CALLBACK(widget_destroy_cb), self); g_signal_connect(priv->widget, "realize", G_CALLBACK(realise_oneshot_cb), self); g_signal_connect(priv->widget, "render", G_CALLBACK(render_cb), self); }