2009-09-15 32 views
5

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

私は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)); 

私はthis questionを見たが、それはVistaを参照し、後であなたがDEVCONを使用して試みることができる

+0

すみませんが、どのような先進的な言語についてこの質問はありますか? –

答えて

1

従来のWindowsマルチメディアインターフェイスを使用している場合、Windows自体にコンパイルされているため、おそらくMAXPNAMELENの制限を乗り越えることはできません。

代わりに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

利用可能なMicrosoftのサイトhere

。。。

私はdevcon listclassメディアがあなたに探している結果を与えるかもしれないと思います。

+0

またはtry:devcon listclass AudioEndpoint –

0

私の(デルファイ)コードです:

これは、それが同様にWaveOutデバイスを包ん含まDirectSoundのデバイスを、enumuratesのDirectShow/ActiveXの、 を使用しています。

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; 
関連する問題