再生デバイスの一覧とボリュームの取得

icon 項目のみ表示/展開表示の切り替え

概要

 MM(Multimedia Device)Device APIを用いてアクティブな再生デバイス名とボリュームの値を取得します。本プログラムはWindows Vista以降で使用可能です。
 ボリュームの値は0~1.0の範囲となります。
 以下に本プログラムの実行状況を記載します。
D:¥>vollist
0:スピーカー (JBL Pebbles)  0.09
1:デジタル オーディオ (S/PDIF) (High Definition Audio デバイス)  0.06

コンパイル方法

 Visual C++ 2013 Express Win32コンソールアプリケーション
 本プログラムの実行はWindows 32bit/64bitでVista以降

プログラムソースの概要

_tmain

 MMDevice() APIはCOM(Component Object Model)ベースです。
 CoInitializeExによりCOMライブラリを初期化します。
 CoCreateInstanceによりMMDeviceインターフェースIMMDeviceEnumerator* pEnumを取得します。
 IMMDeviceEnumerator::EnumAudioEndpointsによりIMMDeviceのコレクションであるIMMDeviceCollectionを取得します。
 コレクションに含まれるIMMDeviceの個数を取得し各IMMDeviceに以下のA.~H.を実行します。
  1. IMMDeviceCollection::Itemで要素番号で指定しIMMDeviceを取得します。
  2. IMMDevice::OpenPropertyStoreでプロパティストアのインタフェースIPropertyStoreを取得します。
  3. IPropertyStore::GetValueでデバイス名を取得します。
  4. デバイス名を標準出力に表示する。
  5. IMMDevice::ActivateによりボリュームオブジェクトIAudioEndpointVolumeを取得します。
  6. IAudioEndpointVolume::GetMasterVolumeLevelScalarによりボリュームの値を取得します。
  7. ボリュームの値を標準出力に表示する。
  8. IAudioEndpointVolume::Releasedでボリュームオブジェクトを解放する。
 IMMDeviceEnumerator::GetDefaultAudioEndpointにより既定のマルチメディア出力デバイス(IMMDevice* pEndpoint)を取得します。
 IMMDevice::Activateによりボリュームオブジェクトを作成します。
 IAudioEndpointVolume::GetMasterVolumeLevelScalarによりボリュームの値を取得します。取得された値は0から1.0の範囲となります。
 IAudioEndpointVolume::SetMasterVolumeLevelScalarによりボリュームの値を変更します。
 ReleaseによりIMMDeviceCollection,IMMDeviceEnumeratorオブジェクトを解放します。
 CoUninitializeによりCOMを解放します。

ソースコード

//	再生デバイスの一覧とボリューム値の表示
//	Windows Vista以降を対象

#include <windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
#include <Functiondiscoverykeys_devpkey.h>
#include <stdio.h>
#include <locale.h>
#include <tchar.h>

int _tmain(int argc, TCHAR** argv){
	HRESULT hr;
	IMMDeviceEnumerator *pEnum = NULL;
	IMMDeviceCollection *pDevices=NULL;

	// UNICODE文字を標準出力に正しく表示させるためにロケールを設定
	_tsetlocale(LC_ALL, _TEXT(""));
	hr = CoInitializeEx(0, COINIT_MULTITHREADED);
	// MMDevice インターフェースを取得
	hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), 
		NULL, CLSCTX_ALL, IID_PPV_ARGS(&pEnum));
	if (FAILED(hr)) {
		CoUninitialize();
		return 1;
	}
	// IMMDeviceコレクションの取得(出力デバイス アクティブデバイス)
	hr = pEnum->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pDevices);
	UINT count,n;
	pDevices->GetCount(&count);	// IMMDeviceの個数
	for (n = 0; n < count; n++){
		PROPVARIANT vName;
		IMMDevice *pEndpoint;
		IPropertyStore *pProperties;
		IAudioEndpointVolume *pAudioEndVol = NULL;
		pDevices->Item(n,&pEndpoint);
		pEndpoint->OpenPropertyStore(STGM_READ, &pProperties);
		PropVariantInit(&vName);
		pProperties->GetValue(PKEY_Device_FriendlyName, &vName);
		_tprintf(_TEXT("%u:%s "), n,vName.pwszVal);
		PropVariantClear(&vName);
		// ボリュームオブジェクトを作成
		hr = pEndpoint->Activate(__uuidof(IAudioEndpointVolume),
			CLSCTX_ALL, NULL, (void **)&pAudioEndVol);
		if (FAILED(hr)) {
			if (pDevices)
				pDevices->Release();
			if (pEnum)
				pEnum->Release();
			CoUninitialize();
			return 2;
		}
		// ボリュームの音量を取得(0.0~1.0)
		float getVol;
		hr = pAudioEndVol->GetMasterVolumeLevelScalar(&getVol);
		if (FAILED(hr)) {
			if (pAudioEndVol)
				pAudioEndVol->Release();
			if (pDevices)
				pDevices->Release();
			if (pEnum)
				pEnum->Release();
			CoUninitialize();
			return 3;
		}
		_tprintf(_TEXT(" %.2f¥n"), double(getVol));
		if (pAudioEndVol)
			pAudioEndVol->Release();
	}
	if (pDevices)
		pDevices->Release();
	if (pEnum)
		pEnum->Release();
	CoUninitialize();
	return 0;
}

ソースファイルと実行ファイルのダウンロード

ダウンロード vollist.zip(53.3kByte)

ZIPファイルに含まれるファイル
vollist.cpp
vollust.exe