Tao.Sdlで音を鳴らすための短いコードがあります。 LinuxとMac(Monoを使用)ではうまく動作しますが、Monoや.NETを使用してWindows7,64ビットでクラッシュします。ここでは、コードです:Tao.Sdl Windowsでオーディオクラッシュが発生する
using System;
using System.Runtime.InteropServices;
using Tao.Sdl;
namespace ConsoleApplication1
{
class Program
{
delegate void AudioSpecCallbackDelegate(IntPtr userData, IntPtr stream, int length);
static Sdl.SDL_AudioSpec desired;
static IntPtr specPtr;
static IntPtr obtained;
static void Main(string[] args)
{
Sdl.SDL_Init(Sdl.SDL_INIT_AUDIO);
desired = new Sdl.SDL_AudioSpec();
desired.freq = 22050;
desired.format = (short)Sdl.AUDIO_S16LSB;
desired.channels = 1;
desired.samples = (short)1000; //(short)2205;
desired.callback = Marshal.GetFunctionPointerForDelegate((AudioSpecCallbackDelegate)DoCallback);
desired.userdata = null;
specPtr = Marshal.AllocHGlobal(Marshal.SizeOf(desired));
Marshal.StructureToPtr(desired, specPtr, false);
obtained = IntPtr.Zero;
if (Sdl.SDL_OpenAudio((IntPtr)specPtr, (IntPtr)obtained) < 0)
{
Console.WriteLine("Error opening sdl_audio (1)");
Console.WriteLine(Sdl.SDL_GetError());
}
Sdl.SDL_PauseAudio(0);
Sdl.SDL_Delay(1000);
Sdl.SDL_PauseAudio(1);
}
public static void DoCallback(IntPtr userData, IntPtr stream, int len)
{
Console.WriteLine("{0}, ", len);
byte[] buffer = new byte[len];
for (int i = 0; i < len; i++)
buffer[i] = 0;
Marshal.Copy(buffer, 0, stream, len);
}
}
}
それはWindows上で、それがコールバックを呼び出すためにしようとする第二の時間をクラッシュします。私が明らかに間違っている何かを見ることができますか?おそらく、私はfreqの正しい値、あるいはおそらくWindowsのフォーマットの問題を持っていませんか?
また、低レベルのコードをデバッグする方法がわかりません... Visual StudioまたはMonoDevelopでクラッシュするだけです。または、別のシステムを使用してこのコードを再実行することについての提案がある場合。目標:Mac、Windows、およびLinux上のC#でサウンドシステムを通じて再生されるバイトを処理できるようにする。
どのような種類のクラッシュですか?それは 'NullReferenceException'なのでしょうか? – user1071136
トレースはまったくありません...「Windowsがクラッシュしました」と表示されます。 –