1

以下の小さな vala プログラムを書きましたが、GLib.Value 型を操作する方法がわかりません。以下のコードを参照してください。

http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-level.html

Gstを使用。


void application_message(Gst.Bus bus, Gst.Message msg) {

        var s = msg.get_structure();

        if(s == null)
            戻る;

        文字列 msgtype = s.get_name();

        if(msgtype != "レベル")
            戻る;
                
        GLib.Value rms = s.get_value("rms");
        GLib.Value st = s.get_value("ストリーム時間");

        // ここのドキュメントによると : http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-level.html

        // "rms" は明らかに "gdouble の GValueArray" です
        // と         
        // 「st」は「typedef guint64 GstClockTime」である GstClockTime です。

        // 2 つの文字列表現を作成したい、例:

        // 72374237490234, [0.234234,0,424234234,0.423423423,0.5345345, ...]

        // そして、変換や型キャストを行う方法がわかりません...
}


ボイドメイン(文字列[]引数){

    Gst.init (参照引数);

    試す {

        var パイプライン = Gst.parse_launch(
          "pulsesrc device=\"alsa_input.usb-046d_08c9_674634A4-02-U0x46d0x8c9.analog-mono\" ! " +
          "レベル名=wavelevel interval=10000000 ! " +
          「wavenc ! ファイルシンクの場所 = audiooz.wav」
        );

        var バス = パイプライン.get_bus();

        bus.add_signal_watch();
        bus.message.connect(application_message);

        // パイプラインの状態を PLAYING に設定します
        pipeline.set_state (State.PLAYING);

        // GLib メインループの作成と開始
        new MainLoop ().run ();        
    }
    キャッチ(エラーe){
        print("%s\n", e.message);
    }
}

アップデート :

GLib.Value のドキュメントはこちら: http://www.valadoc.org/#!api=gobject-2.0/GLib.Value

strdup_contents() を呼び出すと多少は満足ですが、配列を rms で操作したいのですが、

printl(rms.type().name()) はそれが GstValueList であることを教えてくれるので、これにキャストする必要があります: http://www.valadoc.org/#!api=gstreamer-1.0/ Gst.ValueList です が、vala は Gst.ValueList 型について何も知らないようです...

4

1 に答える 1

2

Vala を使用すると、GLib.Value の操作が非常に簡単になります。GLib.Value とネイティブ型の間で暗黙的に変換されます。GLib.StringBuilder をミックスに投入して配列を構築すると、次のような (テストされていない) トリックが実行されます。

GLib.StringBuilder s = new GLib.StringBuilder ();

s.append (((uint64) st).to_string ());
s.append (",[");
{
  bool first = true;
  foreach ( unowned GLib.Value value in rms.values ) {
    if (!first) {
      s.append_c (',');
    } else {
      first = false;
    }
    s.append (((double) value).to_string ());
  }
}
s.append_c (']');
于 2013-10-19T17:22:20.877 に答える