Tao.Sdl を介してトーンを再生する短いコードがあります。Linux と Mac (Mono を使用) では問題なく動作しますが、Mono または .NET を使用する 64 ビットの Windows7 ではクラッシュします。コードは次のとおりです。
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 では、2 回目にコールバックを呼び出そうとするとクラッシュします。私が明らかに間違っていることがわかりますか?おそらく、freq の正しい値を持っていないのでしょうか、それとも Windows では形式が問題なのでしょうか?
または、低レベル コードをデバッグする方法がわかりません。Visual Studio または MonoDevelop でクラッシュするだけです。または、別のシステムを使用してこのコードをやり直すことについて提案がある場合。目標: Mac、Windows、および Linux で C# のサウンド システムを介して再生されるバイトを処理できるようにする。