У меня есть небольшой кусочек кода для воспроизведения тонов через Tao.Sdl.Он отлично работает на Linux и Mac (с использованием Mono), но происходит сбой на Windows7, 64-разрядная с Mono или .NET.Вот код:
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Студия или в MonoDevelop.Или, если у вас есть предложения по повторному выполнению этого кода с использованием другой системы.Цель: уметь обрабатывать байты, которые будут воспроизводиться через звуковую систему в C # на Mac, Windows и Linux.