1

我写了下面的小vala程序,我不知道如何操作GLib.Value类型,请看下面的代码:

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

使用消费税;


无效应用程序消息(Gst.Bus 总线,Gst.Message 消息){

        var s = msg.get_structure();

        如果(s == null)
            返回;

        字符串 msgtype = s.get_name();

        如果(msgtype!=“级别”)
            返回;
                
        GLib.Value rms = s.get_value("rms");
        GLib.Value st = s.get_value("stream-time");

        //根据这里的文档:http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-level.html

        // "rms" 显然是 "gdouble 的 GValueArray"
        // 和         
        // "st" 是一个 GstClockTime,它是一个 "typedef guint64 GstClockTime"

        // 我想创建两者的字符串表示,例如:

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

        // 而且我对如何进行转换或类型转换一无所知...
}


无效的主要(字符串[] args){

    Gst.init(参考参数);

    尝试 {

        var pipeline = Gst.parse_launch(
          “pulsesrc 设备=\”alsa_input.usb-046d_08c9_674634A4-02-U0x46d0x8c9.analog-mono\“!”+
          "级别名称=wavelevel 间隔=10000000 !" +
          “wavenc!文件接收器位置=audioz.wav”
        );

        var bus = pipeline.get_bus();

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

        // 设置管道状态为 PLAYING
        pipeline.set_state (State.PLAYING);

        // 创建并启动 GLib 主循环
        新的 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 回答