我一直試圖找出現在幾個小時。如何使用Vala/SDL初始化音頻
爲了啓動音頻,我需要創建一個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();
^^^^^^^^^^^^^^^^^^^
如果我嘗試只值分配給它的成員乏就像一個結構(它在一個struct正常SDL)我得到:
sdl.vala:20.3-20.25: error: use of possibly unassigned local variable `audiospec'
audiospec.freq = 22050;
^^^^^^^^^^^^^^^^^^^^^^^
我在這裏找到了華劣克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
所以我有點另一個粘滯點。
3rd post: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;
啊,終於我美麗的白色噪音發生器完成了!
這對於編譯它非常有用!我仍然無法讓聲音打開,但我認爲這可能與沒有回調指針的枚舉有關。在原始sdl中: typedef struct ... void(* callback)(void * userdata,Uint8 * stream,int len); 我會看看我是否可以找到一種方法將其添加到sdl.vapi中。 – ioev