5

Windows XP 以降で完全なオーディオ デバイス名を取得する方法はありますか?

MIXERC​​APS を使用できますが、szPname メンバーは 32 文字 (NULL を含む) に制限されます。「Microphone (High Definition Audio Device)」というオーディオ デバイス名の場合、「Microphone (High Definition Aud)」しか返されません。これは、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

以下は私の(Delphi)コードです:

これは DirectShow/ActiveX を使用しており、ラップされた WaveOut デバイスも含む DirectSound デバイスを列挙します。

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 に答える
0

devcon を使用してみてください。こちらの Microsoft のサイトで入手できます。

devcon listclass media で、探している結果が得られる可能性があると思います。

于 2009-09-21T19:15:46.787 に答える