2011-01-13 107 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