マスタボリュームのミュートの状態を取得・変更

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

概要

 MM(Multimedia Device)Device APIを用いてマスターボリュームのミュートの状態の取得及び変更するプログラムです。本プログラムはWindows Vista以降で使用可能です。
 コマンドラインベースで引数に何も指定しない場合は現在のミュートの状態を反転します。
 ミュートする場合は/on、ミュートを解除する場合は/offをコマンドラインで指定します。
 以下に本プログラムの実行状況を記載します。
D:¥>mute
設定 ミュートon

        

コンパイル方法

 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::GetMuteによりミュートの状態を取得します
 IAudioEndpointVolume::SetMuteによりミュートの状態を変更します。
 ReleaseによりIAudioEndpointVolume,IMMDevice,IMMDeviceEnumeratorオブジェクトを解放します。
 CoUninitializeによりCOMを解放します。

ソースコード

//	マスターボリュームのミュートの状態をss取得・設定
//	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;

	if (2 != argc){
		_tprintf(_TEXT("使い方¥nmute /on 又は /off 又は無指定¥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;
	}
	// マスターボリュームのミュートの状態を取得
	BOOL	pbGetMute;
	hr = pAudioEndVol->GetMute(&pbGetMute);
	if (FAILED(hr)) {
		if (pAudioEndVol)
			pAudioEndVol->Release();
		if (pEndpoint)
			pEndpoint->Release();
		if (pEnum)
			pEnum->Release();
		CoUninitialize();
		return 4;
	}
	// マスターボリュームのミュートの状態を変更
	BOOL pbSetMute;
	if (argc != 2){
		pbSetMute = pbGetMute == TRUE ? FALSE : TRUE;
	}else{
		pbSetMute = _tcscmp(argv[1], _TEXT("/on")) == 0 ? TRUE : FALSE;
	}
	hr = pAudioEndVol->SetMute(pbSetMute, NULL);
	_tprintf(_TEXT("設定 ミュート%s¥n"), pbGetMute == TRUE ? _TEXT("on") : _TEXT("off"));
	
	if (pAudioEndVol)
		pAudioEndVol->Release();
	if (pEndpoint)
		pEndpoint->Release();
	if (pEnum)
		pEnum->Release();
	CoUninitialize();
	return 0;
}

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

ダウンロード mute.zip(53.1kByte)

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