5

有没有办法在 Windows XP 及更高版本中获取完整的音频设备名称?

我可以使用 MIXERC​​APS 但 szPname 成员将限制为 32 个字符(包括 NULL)。对于“麦克风(高清晰度音频设备)”的音频设备名称,我只返回“麦克风(高清晰度音频”)。这是由于 MAXPNAMELEN 被定义为 32。我尝试将其重新定义为更大的数字没有效果.

这是我正在使用的代码:

MIXERCAPS mc;
ZeroMemory( &mc, sizeof(MIXERCAPS) );
mm = mixerGetDevCaps( reinterpret_cast<UINT_PTR>(m_hMixer), &mc, sizeof(MIXERCAPS) );

我看到了这个问题,但它引用了 Vista 和更高版本。

4

3 回答 3

1

如果您使用经典的 Windows 多媒体界面,您可能无法绕过 MAXPNAMELEN 限制,因为它已编译到 Windows 本身中。

但是,如果您改用 DirectSound,您可能可以获得完整的设备名称。以下代码未经测试,但我认为它应该可以工作。

BOOL CALLBACK EnumCallback(LPGUID guid, LPCSTR descr, LPCSTR modname, LPVOID ctx)
{
    std::vector<std::string> *names = (std::vector<std::string>*)ctx;
    names->push_back(std::string(descr));
    return TRUE;
}

int main()
{
    std::vector<std::string> names;
    if (!FAILED(DirectSoundEnumerate(&EnumCallback, &names)))
    {
        // do stuff
    }
}
于 2009-09-28T00:57:08.690 回答
0

您可以尝试使用 devcon。可在此处的 Microsoft 网站上找到。

我认为 devcon listclass media 可能会给你你正在寻找的结果。

于 2009-09-21T19:15:46.787 回答
0

下面是我的(德尔福)代码:

这是使用 DirectShow/ActiveX,它枚举 DirectSound 设备,其中也包括包装的 WaveOut 设备。

procedure EnumAudioDevices;
var
  dsCreateDevEnum  : ICreateDevEnum;
  EnumDevice       : IEnumMoniker;
  DeviceMoniker    : IMoniker;
  Data             : Integer;
  DevicePropBag    : IPropertyBag;
  DeviceName       : OLEVariant;
  I                : Integer;
begin
  // CLSID_CQzFilterClassManager = Entire DirectShow Filter List
  If CoCreateInstance(CLSID_SystemDeviceEnum,nil,CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,dsCreateDevEnum) = S_OK then
  Begin
    If dsCreateDevEnum.CreateClassEnumerator(CLSID_AudioRendererCategory,EnumDevice,0) = S_OK then
    Begin
      I := 0;
      EnumDevice.Reset;
      While EnumDevice.Next(1,DeviceMoniker,@Data) = S_OK do
      Begin
        If DeviceMoniker.BindToStorage(nil,nil,IID_IPropertyBag,DevicePropBag) = NOERROR then
        Begin
          If DevicePropBag.Read('FriendlyName',DeviceName,nil) = NOERROR then
          Begin
            // Success
            ShowMessage(DeviceName);
            Inc(I);
          End;
          DevicePropBag := nil;
        End;
        DeviceMoniker := nil;
      End;
      EnumDevice := nil;
    End;
    dsCreateDevEnum := nil;
  End;
End;
于 2009-09-28T01:07:46.030 回答