2009-09-15 39 views
5

Có cách nào để có được đầy đủ tên thiết bị âm thanh trong Windows XP trở lên không?Lấy tên thiết bị âm thanh đầy đủ từ Windows

Tôi có thể sử dụng MIXERCAPS nhưng thành viên szPname sẽ giới hạn trong 32 ký tự (bao gồm NULL). Đối với tên thiết bị âm thanh của "Micrô (Thiết bị âm thanh độ nét cao)", tôi chỉ lấy lại "Micrô (Độ phân giải cao"). Điều này là do MAXPNAMELEN được xác định là 32. Tôi đã thử xác định lại nó thành số lớn hơn để không có hiệu lực .

đây là mã tôi đang sử dụng:

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

tôi thấy this question, nhưng nó tham chiếu Vista và sau

+0

Xin lỗi, nhưng, câu hỏi này là gì? –

Trả lời

1

Nếu bạn sử dụng giao diện Windows Multimedia cổ điển, bạn có thể không nhận được giới hạn MAXPNAMELEN, vì nó được biên dịch vào chính Windows.

Tuy nhiên, bạn có thể có được tên thiết bị đầy đủ nếu bạn sử dụng DirectSound thay thế. Các mã sau đây là chưa được kiểm tra nhưng tôi nghĩ rằng nó sẽ làm việc.

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

Bạn có thể thử sử dụng devcon trống của Microsoft trang web here

...

Tôi nghĩ rằng devclass listclass media có thể cung cấp cho bạn kết quả mà bạn đang tìm kiếm.

+0

hoặc thử: devcon listclass AudioEndpoint –

0

Dưới đây là của tôi (Delphi) mã:

này được sử dụng DirectShow/ActiveX, Nó enumurates thiết bị DirectSound, trong đó bao gồm các thiết bị bọc WaveOut là tốt.

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; 
Các vấn đề liên quan