我已经尝试解决了几个小时。

为了启动音频,我需要创建一个SDL.AudioSpec对象并将其传递给SDL.Audio.Open。问题是,AudioSpec是一个带有私有(private)构造函数的类,因此当我尝试创建一个类时,我得到:

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 doc: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

所以我处于另一个困境。

第三则:EUREKA!我有解决办法! (值得商::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;

啊,终于,我美丽的白噪声发生器完成了!

最佳答案

我认为这是VAPI中的错误。在sdl.vapi中,尝试更改

[Compact]
public class AudioSpec {


public struct AudioSpec {


[CCode (cname="SDL_OpenAudio")]
public static int open(AudioSpec desired, AudioSpec obtained);


[CCode (cname="SDL_OpenAudio")]
public static int open(AudioSpec desired, out AudioSpec obtained);

并使您的代码如下所示:
AudioSpec 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, out specback) < 0)
{
    stdout.printf("ERROR! Check audio settings!\n");
    return 1;
}

并进行测试。似乎根据SDL文档生成了正确的代码。如果可行,请考虑将VAPI更改提交给Vala bugzilla。

10-07 19:27
查看更多