【问题标题】:Cannot create an array of SinkInputInfo无法创建 SinkInputInfo 数组
【发布时间】:2021-11-01 06:00:37
【问题描述】:

我无法创建 SinkInputInfo 对象数组。我已经 posted this 到相应的仓库,但没有得到任何回复。

最小复制:

using PulseAudio;

public void main () {
    SinkInputInfo[] sink_inputs;
}

输出

/tmp/test.vala.PFQW80.c: In function ‘_vala_pa_sink_input_info_array_free’:
/tmp/test.vala.PFQW80.c:18:4: warning: implicit declaration of function ‘pulse_audio_sink_input_info_destroy’ [-Wimplicit-function-declaration]
   18 |    pulse_audio_sink_input_info_destroy (&array[i]);
      |    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/ld: /tmp/ccZQGm6J.o: in function `_vala_pa_sink_input_info_array_free':
test.vala.PFQW80.c:(.text+0x3f): undefined reference to `pulse_audio_sink_input_info_destroy'
collect2: error: ld returned 1 exit status
error: cc exited with status 256

【问题讨论】:

  • 您是否尝试过将其实例化为对象而不是数组?
  • 我需要存储它们的数组,而不仅仅是一个。我不太清楚你的意思,对不起。我在 var 中存储单个 SinkInputInfo 对象没有问题
  • 那是我的问题。现在我们知道错误不是来自对象本身,我猜你在某处缺少标题。错误基本上说的是,当调用销毁器(即pulse_audio_sink_input_info_array_free)时,由于函数未定义,将导致错误
  • 所以我的 vapis 有什么问题吗?你能复制这个问题吗?
  • 嗯,我以前能够创建单个对象,但现在这给了我类似的问题。

标签: vala pulseaudio meson-build


【解决方案1】:

您不能创建SinkInputInfo 的实例。你也不能在任何地方存储它的实例。

原因是它只在回调内部有效:

https://www.freedesktop.org/software/pulseaudio/doxygen/introspect.html#query_sec

信息结构中的数据成员仅在回调期间有效。如果回调完成后需要它们,则必须执行信息结构的深拷贝。

libpulse 不提供任何方法来复制或释放 SinkInputInfo 指针类型。

但是你可以在结构中使用任何东西:

Gee.ArrayList<string> sink_inputs;

public void cb(PulseAudio.Context c, PulseAudio.SinkInputInfo? i, int eol) {
        sink_inputs.add(i.name);
}

public void main () {
    var loop = new PulseAudio.MainLoop();
    var context = new PulseAudio.Context(loop.get_api(), null);
    sink_inputs = new Gee.ArrayList<string>();
    context.get_sink_input_info_list(cb);
}

这里我只存储name 属性。您可以通过在 vala 中创建自己的数据类型并复制您感兴趣的任何内容来扩展它。

此外,vapi 文件不完整,有一些方法可以告诉 Vala 编译器无法进行复制和内存管理。见https://wiki.gnome.org/Projects/Vala/ManualBindings#Structs

我已经有一段时间没有做任何 Vala 代码了,但我认为 vapi 文件应该将 destroy_function 设置为空字符串。

总结:不要尝试将回调的SinkInputInfo参数存储在任何地方,只需复制您感兴趣的结构的字段即可。

【讨论】:

    猜你喜欢
    • 2015-11-14
    • 2023-03-12
    • 2014-07-28
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    相关资源
    最近更新 更多