我们有一段SDL代码如下所示。
SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO);
atexit(SDL_Quit);
g_pDisplaySurface =
SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,0,SDL_ANYFORMAT);
g_SpecDesired=new SDL_AudioSpec;
g_SpecObtained=new SDL_AudioSpec;
g_SpecDesired->freq=22050;
g_SpecDesired->format=AUDIO_U8;
g_SpecDesired->channels=1;
g_SpecDesired->samples=8192;
g_SpecDesired->callback=FOSDLAudioCallback;
g_SpecDesired->userdata=NULL;
回调函数是
void FOSDLAudioCallback(void* userdata,Uint8* buffer,int len)
{
int index;
printf("LEn is :%d",&len);
for(index=0;index<len;index++)
{
buffer[index]=rand()%256;
}
}
这里的问题即使我们将频道改为1或2,它仍然会在立体声频道播放?为什么它以这种方式表现?
答案 0 :(得分:1)
如果obtained
说它是单声道 - 它是单声道的。这意味着你没有多少个扬声器,但有多少个频道。对于单声道,你可能有任意数量的扬声器(比方说6),但你不能,但任何意思,它们都会播放不同的声音 - 只有一个声道,所以所有的扬声器在每个时刻播放相同的声音。
音频驱动程序的工作是根据它的设置进行插值。对于更多的通道,它甚至可能更棘手 - 驱动程序可以将立体声分成5.1左右。
如果您只想在左扬声器上播放声音,则应创建最大可用上下文并使用相应的“左”扬声器。
这是你的回调的修改版本,它将第二个通道填充为0(完全静音)(需要2通道音频模式和AUDIO_U8 - 修改初始化以匹配此功能):
void FOSDLAudioCallback(void* userdata,Uint8* buffer,int len)
{
int index;
printf("LEn is :%d",&len);
for(index=0;index<len;index++)
{
buffer[index]= (index % 2) ? rand()%256 : 0;
}
}