Получить полное имя аудиоустройства из Windows - PullRequest
5 голосов
/ 15 сентября 2009

Есть ли способ получить полное имя аудиоустройства в Windows XP и более поздних версиях?

Я могу использовать MIXERCAPS, но член szPname будет ограничен 32 символами (включая NULL). Для названия аудиоустройства «Микрофон (аудиоустройство высокой четкости)» я получаю только «Микрофон (аудит высокой четкости»). Это связано с тем, что MAXPNAMELEN определено для 32. Я попытался переопределить его для большего числа, но безрезультатно. .

Вот код, который я использую:

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

Я видел этот вопрос , но он ссылается на Vista и позже.

Ответы [ 3 ]

1 голос
/ 28 сентября 2009

Если вы используете классический мультимедийный интерфейс 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
    }
}
0 голосов
/ 28 сентября 2009

Ниже мой (Delphi) код:

Это использует 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;
0 голосов
/ 21 сентября 2009

Вы можете попробовать использовать devcon. Доступно на сайте Microsoft здесь .

Я думаю, что devcon listclass media может дать вам результат, который вы ищете.

...