From: Kouhei S. <ko...@co...> - 2012-02-03 15:20:11
|
須藤です。 In <CAMyNdeUGnr=0HM...@ma...> "[ruby-gnome2-devel-ja] ruby外のスレッドとの排他制御について" on Fri, 3 Feb 2012 22:09:29 +0900, Masaaki Aoyagi <mas...@gm...> wrote: > 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外で生成されたスレッドとメインスレッドとの間で何らかの排他制御が必要 > ということなのだと思いますが、こういった場合どういう対応をするのが良いのでしょうか? この説明を読んだだけでまだ動かしていないのですが、GStreamer と同じような仕組みな気がします。GStreamerもGStreamerが作った スレッドからシグナルが飛んできます。(ここでいうシグナルはOS のシグナルじゃなくてGLibのシグナルのことです。念のため。) で、Ruby/GStreamerはどうしているのかというと、Rubyのものじゃ ないスレッドからシグナルが飛んできたらRubyのスレッドでイベン トを処理して、元のシグナルを受け取ったスレッドにもどしてやる、 ということをしています。 rbgutil_start_callback_dispatch_thread()というのを呼ぶとこれ が動き出すようになります。 > ちなみに、このバインディングはGTK向けであることと、メンテ(特にリファレンス)を手伝って欲しいなぁ > と思っているので、もしまともに動くようになったらRuby-GNOME2プロジェクトに入れて頂くことは > 可能でしょうか? > ライセンス的にはlibVLCの1.2からLGPLに変わったそうなので、問題ないと思います。 > (このバインディングはlibVLC 2.0以降対応としています) あ、今の状態でいれちゃっていいですよ。 リポジトリに入っていたほうが参照しやすいですし。 |