0

我们有一段 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 它仍然在两个立体声通道上播放?为什么它会以这种方式运行?

4

1 回答 1

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;
    }
}
于 2013-10-08T05:29:26.637 回答