概要

 MM(Multimedia Device)Device APIを用いてマスターボリュームの音量を取得及び変更するプログラムです。本プログラムはWindows Vista以降で使用可能です。
 コマンドラインベースで引数に音量を0~1.0の範囲で指定します。引数を指定しない場合は、現在の音量を表示します。
 以下に本プログラムの実行状況を記載します。
D:¥>volset 0.5
マスターボリューム 0.100000→0.500000

コンパイル方法

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

プログラムソースの概要

_tmain

 MMDevice() APIはCOM(Component Object Model)ベースです。
 CoInitializeExによりCOMライブラリを初期化します。
 CoCreateInstanceによりMMDeviceインターフェースIMMDeviceEnumerator* pEnumを取得します。
 IMMDeviceEnumerator::GetDefaultAudioEndpointにより既定のマルチメディア出力デバイス(IMMDevice* pEndpoint)を取得します。
 IMMDevice::Activateによりボリュームオブジェクトを作成します。
 IAudioEndpointVolume::GetMasterVolumeLevelScalarによりボリュームの値を取得します。取得された値は0から1.0の範囲となります。
 IAudioEndpointVolume::SetMasterVolumeLevelScalarによりボリュームの値を変更します。
 ReleaseによりIAudioEndpointVolume,IMMDevice,IMMDeviceEnumeratorオブジェクトを解放します。
 CoUninitializeによりCOMを解放します。

ソースコード

//	マスターボリュームの取得・設定
//	Windows Vista以降を対象

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

int _tmain(int argc, TCHAR** argv){
	HRESULT hr;
	IMMDeviceEnumerator *pEnum = NULL;
	IMMDevice *pEndpoint = NULL;
	IAudioEndpointVolume *pAudioEndVol = NULL;
#ifdef _DEBUG	//	デバック用
	argc = 2;
	TCHAR* str[] = { _TEXT("volset.exe"), _TEXT("0.1"), 0 };
	argv = str;
#endif
	if (2 != argc){
		_tprintf(_TEXT("使い方¥nvolset ボリューム値¥n¥tボリューム値は0~1.0の範囲で指定します。¥n"));
	}
	// 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;
	}
	// 既定のマルチメディア出力デバイスを取得
	hr = pEnum->GetDefaultAudioEndpoint(eRender, eConsole, &pEndpoint);
	if (FAILED(hr)) {
		if (pEnum)
			pEnum->Release();
		CoUninitialize();
		return 2;
	}
	// ボリュームオブジェクトを作成
	hr = pEndpoint->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_ALL, NULL, (void **)&pAudioEndVol);
	if (FAILED(hr)) {
		if (pEndpoint)
			pEndpoint->Release();
		if (pEnum)
			pEnum->Release();
		CoUninitialize();
		return 3;
	}
	// マスターボリュームの音量を取得(0.0~1.0)
	float getVol;
	hr = pAudioEndVol->GetMasterVolumeLevelScalar(&getVol);
	if (FAILED(hr)) {
		if (pAudioEndVol)
			pAudioEndVol->Release();
		if (pEndpoint)
			pEndpoint->Release();
		if (pEnum)
			pEnum->Release();
		CoUninitialize();
		return 4;
	}
	// マスターボリュームの音量を変更(0.0~1.0)
	if (argc != 2){
		_tprintf(_TEXT("現在のマスターボリュームの値(0~1.0) %f¥n"), double(getVol));
	}else{
		float setVol = (float)_ttof(argv[1]);
		hr = pAudioEndVol->SetMasterVolumeLevelScalar(setVol, &GUID_NULL);
		_tprintf(_TEXT("マスターボリューム %f→%f¥n"), double(getVol), double(setVol));
	}
	if (pAudioEndVol)
		pAudioEndVol->Release();
	if (pEndpoint)
		pEndpoint->Release();
	if (pEnum)
		pEnum->Release();
	CoUninitialize();
	return 0;
}

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

ダウンロード volset.zip(54.5kByte)

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