5

私はゲームのオーディオ部分を書いており、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

これは、リバーブと EAX リバーブのみをサポートする Generic Software ドライバーしか入手できないためです。私のマシンだけでなく、他のマシンでも同様です。

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 ターミネータで区切られた 'Generic Hardware' と 'Generic Software' の 2 つのドライバーを返す必要があります。

私のサウンド カードは、nvhda32v.sys ドライバー (バージョン 1.0.0.63、2009 年 11 月 11 日更新) を使用する「NVIDIA ハイ デフィニション オーディオ」デバイスです。

OpenAL がハードウェアを検出しないのはなぜですか?

4

4 に答える 4

2

Creativeオーディオカードを使用していない限り、OpenALは常にデフォルトのオーディオデバイスを返す必要があります。拡張機能はすべてクリエイティブ固有です。これは、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));
于 2012-06-12T10:13:18.440 に答える
1

//出力を除くすべてのデバイスを取得する方法をまだ探している人向け - まだ一般的で、入力にもうまく機能します//

public:int* CHECK_DEVICES_IN(int MAX_DEVICES) { int devices=0; char* デバイス[MAX_DEVICES]; int チェック済み = 0; while(devices<=MAX_DEVICES&&checked } checked++; } return devices; /* int returned=0; while(returned

  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;
   }
于 2014-11-03T17:45:15.563 に答える
1

次の文字列を確認してもよろしいですか。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
}
于 2010-07-29T00:54:00.910 に答える
0

Vista には「汎用ハードウェア」デバイスはありません: http://connect.creativelabs.com/openal/OpenAL%20Wiki/OpenAL%C2%AE%20and%20Windows%20Vista%E2%84%A2.aspx

乾杯!

于 2010-08-03T07:36:46.543 に答える