2009-09-15 13 views
5

Czy istnieje sposób uzyskania nazwy urządzenia audio pełnej nazwy w systemie Windows XP i nowszych?Uzyskaj pełną nazwę urządzenia audio z systemu Windows

Mogę używać MIXERCAPS, ale człon szPname będzie ograniczał się do 32 znaków (w tym NULL). W przypadku nazwy urządzenia audio "Microphone (High Definition Audio Device)", otrzymuję tylko "Microphone (High Definition Aud." Wynika to z tego, że MAXPNAMELEN jest zdefiniowany jako 32. Próbowałem przedefiniować go na większą liczbę, aby nie działać .

Oto kod używam:

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

widziałem this question, ale odwołuje Vista i później

+0

Przepraszam, ale jaki to jest język progresywny? –

Odpowiedz

1

Jeśli używasz klasycznego interfejsu multimedialnego systemu Windows, prawdopodobnie nie uda Ci się obejść ograniczenia MAXPNAMELEN, ponieważ jest on wkompilowany w sam system Windows.

Mimo to możesz uzyskać pełną nazwę urządzenia, jeśli używasz DirectSound. Poniższy kod nie został przetestowany, ale myślę, że powinien zadziałać.

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

można spróbować użyć DevCon Dostępne na stronie Microsoftu here

...

Myślę, że media dyskusyjne devcon mogą dać ci wynik, którego szukasz.

+0

lub spróbuj: devcon listclass AudioEndpoint –

0

Poniżej jest moje (Delphi) Kod:

ta używa DirectShow/ActiveX, To enumurates urządzenia DirectSound, które obejmują zapakowane urządzeń WaveOut również.

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; 
Powiązane problemy