【发布时间】:2011-11-25 15:10:52
【问题描述】:
我已经尝试了几个小时来解决这个问题。
为了启动音频,我需要创建一个 SDL.AudioSpec 对象并将其传递给 SDL.Audio.Open。问题是,AudioSpec 是一个带有私有构造函数的类,所以当我尝试创建一个时,我得到:
sdl.vala:18.25-18.43: error: `SDL.AudioSpec' does not have a default constructor
AudioSpec audiospec = new SDL.AudioSpec();
^^^^^^^^^^^^^^^^^^^
如果我尝试像结构一样将值分配给它的成员变量(它是普通 sdl 中的结构),我得到:
sdl.vala:20.3-20.25: error: use of possibly unassigned local variable `audiospec'
audiospec.freq = 22050;
^^^^^^^^^^^^^^^^^^^^^^^
我在这里找到了 valac 文档:http://valadoc.org/sdl/SDL.AudioSpec.html 但这根本没有多大帮助。
有问题的代码块如下所示:
// setup the audio configuration
AudioSpec audiospec;
AudioSpec specback;
audiospec.freq = 22050;
audiospec.format = SDL.AudioFormat.S16LSB;
audiospec.channels = 2;
audiospec.samples = 512;
// try to initialize sound with these values
if (SDL.Audio.open(audiospec, specback) < 0)
{
stdout.printf("ERROR! Check audio settings!\n");
return 1;
}
任何帮助将不胜感激!
另一个更新,因为我仍然遇到一些问题。我已经更改了 vapi 文件,这就是我现在所拥有的:
public delegate void AudioCallback (out void* userdata, out uchar stream, int len);
[CCode (cname="SDL_AudioSpec")]
[Compact]
public struct AudioSpec {
public int freq;
public AudioFormat format;
public uchar channels;
public uchar silence;
public uint16 samples;
public uint16 padding;
public uint32 size;
public AudioCallback callback;
public void* userdata;
}// AudioSpec
我有一个方法(尝试?)来满足这个函数签名:
public void callback(out void* userdata, out uchar stream, int len)
{
stream = 0;
userdata = null;
}
并将其分配为:
audiospec.callback = gen.callback;
不用说,这仍然不起作用,得到很多错误:
/home/gukid/vala/soundgen.vala.c: In function ‘sound_gen_main’:
/home/gukid/vala/soundgen.vala.c:766:12: error: ‘SDL_AudioSpec’ has no member named ‘callback_target_destroy_notify’
/home/gukid/vala/soundgen.vala.c:766:72: error: ‘SDL_AudioSpec’ has no member named ‘callback_target_destroy_notify’
/home/gukid/vala/soundgen.vala.c:766:114: error: ‘SDL_AudioSpec’ has no member named ‘callback_target’
/home/gukid/vala/soundgen.vala.c:768:11: error: ‘SDL_AudioSpec’ has no member named ‘callback_target’
/home/gukid/vala/soundgen.vala.c:769:11: error: ‘SDL_AudioSpec’ has no member named ‘callback_target_destroy_notify’
/home/gukid/vala/soundgen.vala.c:770:21: warning: assignment from incompatible pointer type [enabled by default]
/home/gukid/vala/soundgen.vala.c:771:11: error: ‘SDL_AudioSpec’ has no member named ‘callback_target’
/home/gukid/vala/soundgen.vala.c:772:11: error: ‘SDL_AudioSpec’ has no member named ‘callback_target_destroy_notify’
error: cc exited with status 256
所以我又有点棘手了。
第三篇文章:尤里卡!我有办法! (有争议:P)
首先,sdl.vapi 看起来像:
[CCode (cheader_filename = "SDL.h")]
public delegate void AudioCallback (void* userdata, uchar* stream, int len);
[CCode (cname="SDL_AudioSpec", has_type_id=false)]
public struct AudioSpec {
public int freq;
public AudioFormat format;
public uchar channels;
public uchar silence;
public uint16 samples;
public uint16 padding;
public uint32 size;
[CCode (delegate_target = false, type = "void*")]
public weak AudioCallback callback;
public void* userdata;
}// AudioSpec
然后我可以创建一个函数:
public static void callback(void* userdata, uchar* stream, int len)
还有:
audiospec.callback = callback;
啊哈,我漂亮的白噪声发生器终于完成了!
【问题讨论】: