2013-10-08 48 views
0

運作我們有如下SDL代碼片段。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

哪裏是你的SDL_OpenAudioDevice()?另外,爲什麼在AudioSpec結構上使用新的?你需要一次,最好放在堆棧上。 – keltar

+0

@keltar我已更新回調函數。我正在做一個非常粗略的測試,沒有SDL_OpenAudioDevice()。後面的例子我正在使用它們。 – user2711681

+0

我不明白。你沒有OpenAudioDevice()?那麼你沒有音頻。你如何驗證你還有2個頻道(順便說一句,不能保證你會得到你要求的,這就是爲什麼你有'期望'和'獲得')?你應該檢查'獲得的'結構域。或者,您的問題是爲什麼當您打開單聲道設備時,您聽到兩個揚聲器的聲音? – keltar

回答

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; 
    } 
} 
+0

@But然後所有文件聲稱具有單聲道等於1個信道的信道,其在這裏混淆儀式。所以我設置了這個g_SpecObtained-> channels = 1; SDL_OpenAudio(g_SpecDesired,g_SpecObtained); //刪除g_SpecDesired; SDL_PauseAudio(0);但它在兩個揚聲器上播放。 – user2711681

+0

單聲道確實是1聲道。頻道和揚聲器是完全不同的東西。如何將通道映射到揚聲器取決於驅動程序。如果你不喜歡它是如何做到這一點的 - 請求最高的可用頻道數量,並只使用你需要的頻道數量(但是,不能保證你有這麼多的揚聲器 - 假設7.1音頻,但只有兩個揚聲器連接),那麼也許 - 也許 - 司機不會干預。 – keltar

+0

所以在這種情況下,我永遠不會演示一個單聲道映射到一個單一的頻道,我是對嗎? – user2711681