From: Masaaki A. <mas...@gm...> - 2012-02-03 13:09:39
|
青柳です。 Linux環境で使われているメディア再生エンジンとして、gstreamer、mplayer、vlcが 代表的だと思いますが、一長一短な所があるのでエンジンを切り替えられるメディアプレイヤーを 作ろうとしています。そこで、rubyからvlcを利用するための便利なライブラリが見つからなかったので glibの勉強がてらGTK向けのlibVLCバインディングを書いてみました。 ただ、イベント処理について問題があるので、分かりましたら教えて頂けないでしょうか? 問題点: 例えば、以下のようにイベント処理を入れただけで、GTKのシグナルを受け付けなくなることがある。 (GTKのメインループが止まっている?) player.attach_event(:mediaplayer_playing) do |player, event| p :mediaplayer_playing end 分かっていること: * libVLCのイベントは、ruby外で生成されたスレッドから上がってくる * 試しに、rbglib_maincontext.cのrg_poll内の rb_thread_blocking_region(rg_poll_in_blocking, &info, RUBY_UBF_IO, NULL); を rg_poll_in_blocking(&info); のようにして、GVL解除をしないようにしてやると、この問題に関しては起こらなくなるよう。 * 何故かサンプルスクリプトのsimple.rbは問題が起こらない 恐らくruby外で生成されたスレッドとメインスレッドとの間で何らかの排他制御が必要 ということなのだと思いますが、こういった場合どういう対応をするのが良いのでしょうか? ちなみに、このバインディングはGTK向けであることと、メンテ(特にリファレンス)を手伝って欲しいなぁ と思っているので、もしまともに動くようになったらRuby-GNOME2プロジェクトに入れて頂くことは 可能でしょうか? ライセンス的にはlibVLCの1.2からLGPLに変わったそうなので、問題ないと思います。 (このバインディングはlibVLC 2.0以降対応としています) とりあえず、現状のソース(gem)を添付します。 |