sdl 打开耳机_SDL适合多窗口播放音频打开方式

在实现OCX播放控件中要求可以多个窗口播放,注意这里的需求不是分屏。

官方例子

SDL_AudioSpec want, have;

SDL_AudioDeviceID dev;

SDL_memset(&want, 0, sizeof(want)); /* or SDL_zero(want) */

want.freq = 48000;

want.format = AUDIO_F32;

want.channels = 2;

want.samples = 4096;

want.callback = MyAudioCallback; /* you wrote this function elsewhere -- see SDL_AudioSpec for details */

dev = SDL_OpenAudioDevice(NULL, 0, &want, &have, SDL_AUDIO_ALLOW_FORMAT_CHANGE);

if (dev == 0) {

SDL_Log("Failed to open audio: %s", SDL_GetError());

} else {

if (have.format != want.format) { /* we let this one thing change. */

SDL_Log("We didn't get Float32 audio format.");

}

SDL_PauseAudioDevice(dev, 0); /* start audio playing. */

SDL_Delay(5000); /* let the audio callback play some sound for 5 seconds. */

SDL_CloseAudioDevice(dev);

}

音频播放工具类

public unsafe class SDLAudio

{

// 设备编号索引

uint devIndex;

class aa

{

public byte[] pcm;

public int len;

}

int lastIndex = 0;

private List data = new List();

//private List data = new List();

SDL.SDL_AudioCallback Callback;

public void PlayAudio(IntPtr pcm, int len)

{

lock (this)

{

byte[] bts = new byte[len];

Marshal.Copy(pcm, bts, 0, len);

data.Add(new aa

{

len = len,

pcm = bts

});

}

//SDL.SDL_Delay(10);

}

void SDL_AudioCallback(IntPtr userdata, IntPtr stream, int len)

{

if (data.Count == 0)

{

for (int i = 0; i < len; i++)

{

((byte*)stream)[i] = 0;

}

return;

}

for (int i = 0; i < len; i++)

{

if (data[0].len > i)

{

((byte*)stream)[i] = data[0].pcm[i];

}

else

((byte*)stream)[i] = 0;

}

data.RemoveAt(0);

}

public int SDL_Init()

{

Callback = SDL_AudioCallback;

SDL.SDL_AudioSpec wanted_spec = new SDL.SDL_AudioSpec();

wanted_spec.freq = 8000;

wanted_spec.format = SDL.AUDIO_S16;

wanted_spec.channels = 1;

wanted_spec.silence = 0;

wanted_spec.samples = 320;

wanted_spec.callback = Callback;

SDL.SDL_AudioSpec out_spec= wanted_spec;

// 打开当前索引设备: 传入NULL的设备名称会请求最合理的默认值

devIndex = SDL.SDL_OpenAudioDevice(null, 0, ref wanted_spec, out out_spec, (int)SDL.SDL_AUDIO_ALLOW_FORMAT_CHANGE);

if (devIndex < 0)

{

throw new ApplicationException("Can't open audio device." );

}

//Play

SDL.SDL_PauseAudioDevice(devIndex, 0);

return 0;

}

///

/// 暂停

///

public void PauseAudio()

{

SDL.SDL_PauseAudioDevice(devIndex,1);// 暂停声音

}

///

/// 播放

///

public void PlayAudio()

{

SDL.SDL_PauseAudioDevice(devIndex,0);//播放声音

}

///

/// 关闭设备

///

public void CloseAudioDevice()

{

SDL.SDL_CloseAudioDevice(devIndex);// 关闭播放设备

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值