OpenAL 和 Vista:设备始终是“通用软件”

Posted

技术标签:

【中文标题】OpenAL 和 Vista:设备始终是“通用软件”【英文标题】:OpenAL and Vista: Device is always 'Generic Software' 【发布时间】:2010-04-26 16:55:55 【问题描述】:

我正在编写游戏的音频部分,并且正在使用 OpenAL。我想使用一些扩展,但测试总是失败:

TRACE: AudioManager - Sound device: 'Generic Software'
TRACE: AudioManager - Enabling OpenAL extensions...
TRACE: AudioManager - Compressor support: NO
TRACE: AudioManager - Reverb support: YES
TRACE: AudioManager - Chorus support: NO
TRACE: AudioManager - Distortion support: NO
TRACE: AudioManager - Echo support: NO
TRACE: AudioManager - Flanger support: NO
TRACE: AudioManager - Frequency shifter support: NO
TRACE: AudioManager - Vocal morpher support: NO
TRACE: AudioManager - Pitch shifter support: NO
TRACE: AudioManager - Ring modulator support: NO
TRACE: AudioManager - AutoWAH support: NO
TRACE: AudioManager - Equalizer support: NO
TRACE: AudioManager - EAX Reverb support: YES

这是因为我只得到了Generic Software驱动,它只支持混响和EAX混响。不仅在我的机器上,在其他机器上也是如此。

以下是我如何检测 OpenAL 使用的驱动程序:

ALchar device[256];
ZeroMemory(device, 256);
if (alcIsExtensionPresent(NULL, "ALC_ENUMERATE_ALL_EXT"))

    strcpy_s(device, 256, alcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER));

else if (alcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT"))

    strcpy_s(device, 256, alcGetString(NULL, ALC_DEVICE_SPECIFIER));


TRACE_AUDIOMANAGER("Sound device: '%s'", device);

g_System = alcOpenDevice(device);

根据规范,设备说明符应返回两个驱动程序:“通用硬件”和“通用软件”,由 NULL 终止符分隔。

我的声卡是“NVIDIA High Definition Audio”设备,它使用 nvhda32v.sys 驱动程序(版本 1.0.0.63,于 2009 年 11 月 11 日更新)。

为什么 OpenAL 没有检测到我的硬件?

【问题讨论】:

如果 alcGetString() 返回 "Generic Software\0Generic Hardware\0\0" 您的代码将完全忽略第二个 除非它没有。它只返回通用软件。 【参考方案1】:

OpenAL 应始终返回默认音频设备,除非您使用的是 Creative 声卡。这些扩展都是特定于广告素材的。这与期望在 NVIDIA 显卡上获得 Intel 特定的 OpenGL 扩展相同。

作为记录,以下是您设置 OpenAL 的方式:

// create a default device
ALCdevice* device = alcOpenDevice("");
if (!device)

    LOG_ERROR("Could not create OpenAL device.");
    return false;


// context attributes, 2 zeros to terminate 
ALint attribs[6] = 
    0, 0
;

ALCcontext* context = alcCreateContext(device, attribs);
if (!context)

    LOG_ERROR("Could not create OpenAL context.");
    alcCloseDevice(device);
    return false;


if (!alcMakeContextCurrent(context))

    LOG_ERROR("Could not enable OpenAL context.");
    alcDestroyContext(context);
    alcCloseDevice(device);
    return false;


LOG_INFO("[OpenAL] Version: %s", alGetString(AL_VERSION));
LOG_INFO("[OpenAL] Vendor: %s", alGetString(AL_VENDOR));
LOG_INFO("[OpenAL] Renderer: %s", alGetString(AL_RENDERER));

【讨论】:

【参考方案2】:

你确定要检查下一个字符串,因为alcGetString(NULL, ALC_DEVICE_SPECIFIER)返回字符串数组,试试这样:

char* devices = (char*)alcGetString(NULL, ALC_DEVICE_SPECIFIER);
while(devices && *devices !=NULL)

    ALCdevice* device = alcOpenDevice(devices);
    ...
    ...
    devices += strlen(devices) + 1; //next device

【讨论】:

【参考方案3】:

对于那些仍在寻找获取所有设备的方法的人//除了输出 - 仍然是通用的,适用于输入//

public:int* CHECK_DEVICES_IN(int MAX_DEVICES) int 设备=0; char* 设备[MAX_DEVICES]; 整数检查=0; 而(设备

  public:ALchar* DEVICES_IN(int REQUIRED)
    ALchar* result="0";
     ALchar* device=(ALchar*)alcGetString(NULL,ALC_CAPTURE_DEVICE_SPECIFIER);
     int POS=0;
     while(device && device!=NULL && strlen(device)>0 && POS<=REQUIRED)
       if(POS==REQUIRED)
          result=device; 
        device+=strlen(device)+1;
        POS++; 
      
     return result;
   

【讨论】:

【参考方案4】:

Vista 上没有“通用硬件”设备:http://connect.creativelabs.com/openal/OpenAL%20Wiki/OpenAL%C2%AE%20and%20Windows%20Vista%E2%84%A2.aspx

干杯!

【讨论】:

请不要发布答案链接 - 如果链接不可用或被移动,则此响应无效。

以上是关于OpenAL 和 Vista:设备始终是“通用软件”的主要内容,如果未能解决你的问题,请参考以下文章

MPNowPlayingInfoCenter 在通过播放音频时始终处于“正在播放”状态

如何在 iOS 中检测铃声开关状态?

IsProcessDPIAware始终返回true

Vista 64 上的 VMWare 6.x 作为 *32 任务运行

OpenAL 3d 定位和平移中心

WIA、Vista 和 VB6。这段代码有效吗?