山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他再生デバイスの一覧とボリュームの取得
概要
MM(Multimedia Device)Device APIを用いてアクティブな再生デバイス名とボリュームの値を取得します。本プログラムはWindows Vista以降で使用可能です。
ボリュームの値は0~1.0の範囲となります。
以下に本プログラムの実行状況を記載します。
ボリュームの値は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以降
本プログラムの実行は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.を実行します。
- IMMDeviceCollection::Itemで要素番号で指定しIMMDeviceを取得します。
- IMMDevice::OpenPropertyStoreでプロパティストアのインタフェースIPropertyStoreを取得します。
- IPropertyStore::GetValueでデバイス名を取得します。
- デバイス名を標準出力に表示する。
- IMMDevice::ActivateによりボリュームオブジェクトIAudioEndpointVolumeを取得します。
- IAudioEndpointVolume::GetMasterVolumeLevelScalarによりボリュームの値を取得します。
- ボリュームの値を標準出力に表示する。
- IAudioEndpointVolume::Releasedでボリュームオブジェクトを解放する。
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;
}
ソースファイルと実行ファイルのダウンロード
ZIPファイルに含まれるファイル
vollist.cpp vollust.exe
Copyright (C) 2012 山本ワールド All Rights Reserved.