Core Audio 枚举电脑上音频设备.

代码来源:    https://github.com/skitaoka/windows-core-audio-api-samples  

默认配置是 VS2015编译,如果没有安装,编译会失败,

通过  项目右键->属性->Configuration Properties->General->Platform Toolset 修改 当前已经安装的 平台.  vs2013 (v120).


#include 
#include 

#include 
#include 
#include 
#include 

namespace {

using prop_string_t = std::unique_ptr;

#define prop_string_null prop_string_t(nullptr, CoTaskMemFree)

prop_string_t GetDeviceId(IN Microsoft::WRL::ComPtr const& device) {
  LPWSTR buffer = nullptr;
  if SUCCEEDED(device->GetId(&buffer)) {
    return prop_string_t(buffer, CoTaskMemFree);
  }
  return prop_string_null;
}

std::wstring GetDeviceState(IN Microsoft::WRL::ComPtr const& device) {
  DWORD state = 0;
  if SUCCEEDED(device->GetState(&state)) {
    switch (state) {
    case DEVICE_STATE_ACTIVE: return L"ACTIVE";
    case DEVICE_STATE_DISABLED: return L"DISABLED";
    case DEVICE_STATE_NOTPRESENT: return L"NOTPRESENT";
    case DEVICE_STATE_UNPLUGGED: return L"UNPLUGGED";
    }
  }
  return L"UNKNOWN";
}

prop_string_t GetPropString(IN Microsoft::WRL::ComPtr const& prop,
                            IN PROPERTYKEY const& key) {
  PROPVARIANT var;
  ::PropVariantInit(&var);
  if SUCCEEDED(prop->GetValue(key, &var)) {
    LPWSTR str;
    if SUCCEEDED(::PropVariantToStringAlloc(var, &str)) {
      ::PropVariantClear(&var);
      return prop_string_t(str, CoTaskMemFree);
    }
  }
  ::PropVariantClear(&var);
  return prop_string_null;
}

} // end of anonymous namespace

int main() {
  if SUCCEEDED(::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED)) {
    {
      Microsoft::WRL::ComPtr enumerator;
      if SUCCEEDED(::CoCreateInstance(__uuidof(MMDeviceEnumerator),
                                      nullptr,
                                      CLSCTX_INPROC_SERVER,
                                      IID_PPV_ARGS(enumerator.ReleaseAndGetAddressOf()))) {

        // 出力先デバイスを列挙
        Microsoft::WRL::ComPtr devices;
        if SUCCEEDED(enumerator->EnumAudioEndpoints(EDataFlow::eAll, // eRender, eCapture, eAll
                                                    DEVICE_STATEMASK_ALL,
                                                    // DEVICE_STATE_ACTIVE: 有効化されている
                                                    // DEVICE_STATE_DISABLED: 無効化されている
                                                    // DEVICE_STATE_NOTPRESENT: システムに無登録
                                                    // DEVICE_STATE_UNPLUGGED: 物理的に接続されていない
                                                    devices.ReleaseAndGetAddressOf())) {
          std::wostringstream out;

          // デバイス数を取得
          UINT uNumDevices;
          if SUCCEEDED(devices->GetCount(&uNumDevices)) {
            for (UINT i = 0; i < uNumDevices; ++i) {
              // デバイスを取得
              Microsoft::WRL::ComPtr device;
              if SUCCEEDED(devices->Item(i, device.ReleaseAndGetAddressOf())) {
                // デバイスの情報を取得
                auto const id = GetDeviceId(device); // デバイスID
                auto const state = GetDeviceState(device); // デバイスの状態

                Microsoft::WRL::ComPtr endpoint;
                device.As(&endpoint);

                Microsoft::WRL::ComPtr prop;
                if SUCCEEDED(device->OpenPropertyStore(STGM_READ, prop.ReleaseAndGetAddressOf())) {
                  auto const name = GetPropString(prop, PKEY_Device_FriendlyName); // フルネーム
                  auto const desc = GetPropString(prop, PKEY_Device_DeviceDesc); // ショートネーム
                  auto const audioif = GetPropString(prop, PKEY_DeviceInterface_FriendlyName); // 物理デバイス名
                  out << L"[" << i << L"] id=" << id.get() << L", state=" << state << L", name=" << name.get()
                    << L", desc=" << desc.get() << L", audioif=" << audioif.get() << L'\n';
                }
              }
            }
          }

          std::wstring const names = out.str();
          ::MessageBoxW(HWND_DESKTOP, names.c_str(), L"devices", MB_OK);
        }
      }
    }
    ::CoUninitialize();
  }

  return 0;
}

输出结果如下:

Core Audio 枚举电脑上音频设备._第1张图片


音视频交流欢迎+ 群:

210324637


你可能感兴趣的:(音视频)