|
From: Kouhei S. <ko...@co...> - 2013-02-04 14:18:36
|
須藤です。
In <510...@ni...>
"[ruby-gnome2-devel-ja] gi使用時Gst::Bus.add_watchの引数" on Mon, 04 Feb 2013 00:45:04 +0900,
NAKAJIMA Takashi <nak...@ni...> wrote:
> playbin = Gst::ElementFactory.make("playbin")
> bus = playbin.bus
> bus.add_watch do |bus, message|
> (イベント捕捉)
> end
>
> だと、add_watchのところで以下のエラーが起きます。
おぉ。。。
> /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:243:in
> `invoke': no implicit conversion from nil to integer (TypeError)
> from
> /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:243:in
> `block in load_method_info'
> from helloworld.rb:32:in `<main>'
>
> intパラメータを要求しているようなので、priorityかなと思い
>
> bus.add_watch(GLib::PRIORITY_DEFAULT) do |bus, message|
>
> にしたところ、次のエラーに変わりました。
はい、priorityであっています。
たしかに、
> なおGst-1.0.girによると、add_watchは
> <parameters>
> <parameter name="func" transfer-ownership="none" closure="1">
> <doc xml:whitespace="preserve">A function to call when a message is
> received.</doc>
> <type name="BusFunc" c:type="GstBusFunc"/>
> </parameter>
> <parameter name="user_data" transfer-ownership="none">
> <doc xml:whitespace="preserve">user data passed to @func.</doc>
> <type name="gpointer" c:type="gpointer"/>
> </parameter>
> </parameters>
> なので、priorityを渡したのも違っているのかもしれませんけど。(?)
となっているのですが、
<method name="add_watch"
c:identifier="gst_bus_add_watch"
shadowed-by="add_watch_full"
introspectable="0">
となっている通り、add_watchの実体はadd_watch_fullとして提供
されていて、add_watch_fullは
<method name="add_watch_full"
c:identifier="gst_bus_add_watch_full"
shadows="add_watch">
<parameters>
<parameter name="priority" transfer-ownership="none">
<doc xml:whitespace="preserve">The priority of the watch.</doc>
<type name="gint" c:type="gint"/>
</parameter>
なので、最初の引数はpriorityであっています!
> /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:243:in
> `invoke': TODO: GSourceFunc callback is only supported.
> (NotImplementedError)
> from
> /home/nakajima/Projects/ruby/gtk/ruby-gnome2/gobject-introspection/lib/gobject-introspection/loader.rb:243:in
> `block in load_method_info'
> from helloworld.rb:32:in `<main>'
>
> GSourceFuncのcallbackでない(?)と怒られているようですが、ブロックで
> 渡しているところが違うのでしょうか。
いえ、あっているのですが、Ruby/GObjectIntrospectionが対応し
ていないのです。エラーメッセージにもある通り、GSourceFuncに
は対応しているのですが、これは、GObject Introspectionが依存
しているGLibが提供しているものなので対応しています。
が、GstBusFuncはGObjectIntrospectionが依存していない
GStreamerが提供していないものなので、
Ruby/GObjectIntrospectionが対応するのは変ですね。。。
なので、Ruby/GStreamerの方で対応する必要があるので、対応する
ためのコードを追加しておきます!追加したらまた報告します!
なかなか、スムーズにいかずにすみません。。。
|