示例#1
0
 public override void Draw(RenderState rstate)
 {
     Mpv.mpv_event *ev = Mpv.mpv_wait_event(mpvhandle, 0);
     while (ev->event_id != Mpv.mpv_event_id.MPV_EVENT_NONE)
     {
         if (ev->event_id == Mpv.mpv_event_id.MPV_EVENT_END_FILE)
         {
             Playing = false;
         }
         ev = Mpv.mpv_wait_event(mpvhandle, 0);
     }
     if (disposed)
     {
         return;
     }
     game.UnbindAll();
     RenderTarget2D.ClearBinding();
     game.TrashGLState();
     if (firstDraw)
     {
         firstDraw = false;
         framebuffer.BindFramebuffer();
         rstate.ClearColor = Color4.Black;
         rstate.ClearAll();
         RenderTarget2D.ClearBinding();
     }
     if (doDraw)
     {
         rstate.Cull = false;
         rstate.Apply();
         Mpv.mpv_opengl_cb_draw(mpvgl, (int)framebuffer.FBO, game.Width, game.Height);
         doDraw      = false;
         rstate.Cull = true;
     }
 }
示例#2
0
 static void CheckError(int status)
 {
     if (status < 0)
     {
         throw new Exception(Mpv.mpv_error_string(status));
     }
 }
示例#3
0
 public override bool Init()
 {
     FLLog.Info("Video", "Opening mpv backend");
     if (!Mpv.LoadLibrary(mpvo))
     {
         return(false);
     }
     try
     {
         //mpv will not run unless lc_numeric is "C"
         IntPtr locale;
         if ((locale = setlocale(LC_NUMERIC, "C")) == IntPtr.Zero)
         {
             throw new Exception("setlocale(LC_NUMERIC, \"C\") failed");
         }
         mpvhandle = Mpv.mpv_create();
         if (mpvhandle == IntPtr.Zero)
         {
             throw new Exception("mpv_create failed");
         }
         CheckError(Mpv.mpv_initialize(mpvhandle));
         mpvgl = Mpv.mpv_get_sub_api(mpvhandle, Mpv.mpv_sub_api.MPV_SUB_API_OPENGL_CB);
         CheckError(Mpv.mpv_opengl_cb_init_gl(mpvgl, IntPtr.Zero, GetProcAddress, IntPtr.Zero));
         CheckError(Mpv.mpv_set_option_string(mpvhandle, "vo", "opengl-cb"));
         update = ctx => game.QueueUIThread(() => doDraw = true);
         Mpv.mpv_opengl_cb_set_update_callback(mpvgl, update, IntPtr.Zero);
     }
     catch (Exception ex)
     {
         FLLog.Info("mpv", "Failed to initialize: " + ex.Message);
         return(false);
     }
     return(true);
 }
示例#4
0
 public override void Dispose()
 {
     disposed = true;
     if (mpvhandle != IntPtr.Zero)
     {
         FLLog.Info("Video", "Closing mpv backend");
         Mpv.mpv_opengl_cb_uninit_gl(mpvgl);
         Mpv.mpv_terminate_destroy(mpvhandle);
         framebuffer.Dispose();
         Playing = false;
     }
 }
示例#5
0
 public override void PlayFile(string filename)
 {
     Playing = true;
     CheckError(Mpv.mpv_command(mpvhandle, "loadfile", filename));
 }