2011-01-13 82 views
4

我正在將應用程序從Windows移植到Mac OS X.它使用OpenAL處理聲音,但在Mac OS X上的聲音引擎初始化過程中出現奇怪的行爲(代碼在MacBook Pro上運行)。Mac OS X上的OpenAL支持5.1輸出嗎?

下面是代碼:

int InitSoundEngine(void* data[NB_BUFFERS], size_t data_size[NB_BUFFERS]) 
{ 
    ALCdevice *device; 
    ALCcontext *context; 
    ALenum format; 
    ALuint buffers[NB_BUFFERS]; 

    device = alcOpenDevice(NULL); 
    if (device == NULL) 
     goto failed; 

    context = alcCreateContext(device, NULL); 
    if (context == NULL) 
     goto failed; 

    alcMakeContextCurrent(context); 

    format = alGetEnumValue("AL_FORMAT_51CHN16"); 
    if (format == 0) 
     goto failed; 

    alGenBuffers(NB_BUFFERS, buffers); 
    if (alGetError() != AL_NO_ERROR) 
     goto failed; 

    for (int i = 0; i < NB_BUFFERS; ++ i) 
    { 
     alBufferData(buffers[i], format, data[i], data_size[i], 48000); 
     if (alGetError() != AL_NO_ERROR) 
      goto failed; 
    } 

    return NO_ERROR; 

failed: 
    /* Cleanup omitted for brievety */ 
    return INITIALIZATION_FAILED; 
} 

這調用alBufferData,與AL_INVALID_VALUE錯誤期間,當失敗。在追蹤代碼時,我們發現alGetEnumValue("AL_FORMAT_51CHN16")正在返回0xfffffffful,我們懷疑這是問題的根源。

alGetEnumValue說:

ALuint alGetEnumValue(const ALchar *enumName);

返回0如果枚舉無法找到,並設置AL_INVALID_VALUE錯誤條件。枚舉值的存在並不能保證擴展對當前上下文的適用性。非零返回僅表示實現意識到此擴展的存在。

我想我正確地使用該功能。 OpenAL的Mac OS X實現中是否存在錯誤?在Mac OS X上是否通過OpenAL支持5.1輸出?它是否通過Core Audio支持(如果這是真的,移植到Core Audio可能是一個選項)?我應該將5.1音頻轉換爲另一種格式(3.1,立體聲,...)嗎?

回答

3

該枚舉屬於AL_EXT_MCFORMATS擴展名。它在Mac OS X上不可用。

是的,CoreAudio可以處理5.1(或任何我認爲)揚聲器設置。我不知道如何提供數據的細節。

+0

如果enum不受支持,那麼alEnumGetValue函數應該返回0,不是嗎? – 2011-01-26 20:27:09