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 つ) を使用できますが、それらで異なるサウンドを再生することはできませんが、1 つのチャネルのみであるため、すべてのスピーカーが各瞬間に同じサウンドを再生します。

設定に従って補間するのは、オーディオドライバーの仕事です。チャンネル数が多い場合は、さらにトリッキーになる可能性があります。ドライバーがステレオを 5.1 程度に分割する可能性があります。

たとえば左のスピーカーだけでサウンドを再生したい場合は、利用可能な最大のコンテキストを作成し、対応する「左」のスピーカーを使用する必要があります。

2 番目のチャネルを 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 に答える