2007/1/22(月)
最近あんまり書くネタないしプログラムのことでも書いてみようかなと思ったり ちょうどVistaの出てくるタイミングだしVistaで変わるボリューム関係のことを題材にしてみるかな
すでに知ってる人も多いと思うけどVistaになったら今までと違ってアプリケーションごとにボリューム設定ができるようになります 今までのwaveXxxとmixerXxx系のAPIを使うとアプリケーションのボリュームが変わるようになってます ここでメインのボリュームを変更したいときどうするのか?
てことになるけどVistaではCore Audio APIsというのが新しく追加されています(Vista用のWindowsSDKで追加) 名前から想像出来るとおり音関係のコアになるAPIの集まりです これを使うことによってアプリケーションごとのボリュームじゃなくてメインのボリュームも変更できます
しかしこのCore Audio APIsてのはちょっと曲者 COMで作られているみたいなのでCOMやDirectXを使ったことない人には使い方がよくわからないかも COMの使い方自体はここでは説明しないので他のサイト探してみて下さい ここではとりあえずメインのボリュームを変更するサンプルだけのせて起きます
#include <mmdeviceapi.h>
#include <endpointvolume.h>
#define SAFE_RELEASE(punk) \
if ((punk) != NULL) \
{ (punk)->Release(); (punk) = NULL; }
void SetVolume(float fLevel)
{
HRESULT hr;
IMMDeviceEnumerator* pEnumerator = NULL;
IMMDevice* pEndpoint = NULL;
IAudioEndpointVolume* pAudioEndVol = NULL;
//先にどこかでCoInitializeしておくこと
//していないとここでエラー
//まずオーディオデバイス一覧取得用のインターフェースを取得
hr = CoCreateInstance(
__uuidof(MMDeviceEnumerator), NULL,CLSCTX_ALL,
__uuidof(IMMDeviceEnumerator),(void**)&pEnumerator);
if( FAILED(hr) ){
return ;
}
//一覧の中からデフォルトのオーディオデバイスを取得する
hr = pEnumerator->GetDefaultAudioEndpoint(
eRender, eConsole,
&pEndpoint);
if( FAILED(hr) ){
SAFE_RELEASE(pEnumerator)
return ;
}
//取得したオーディオデバイスからメインボリューム操作用のインターフェースを取得
hr = pEndpoint->Activate(
__uuidof(IAudioEndpointVolume), CLSCTX_ALL,
NULL, (void**)&pAudioEndVol);
if( FAILED(hr) ){
SAFE_RELEASE(pEndpoint)
SAFE_RELEASE(pEnumerator)
return ;
}
//メインボリュームの音量を変更 fLevelの範囲は0.0〜1.0
hr = pAudioEndVol->SetMasterVolumeLevelScalar( fLevel, &GUID_NULL );
if( FAILED(hr) ){
return ;
}
//インターフェースの解放処理
SAFE_RELEASE(pAudioEndVol)
SAFE_RELEASE(pEndpoint)
SAFE_RELEASE(pEnumerator)
}
IAudioEndpointVolumeインターフェースでは他にミュートの設定などもできます IAudioEndpointVolumeの変わりにISimpleAudioVolumeを使えばアプリケーションごとのボリューム設定ができます
これでプログラム的にボリューム変更することはできますが、実際にアプリケーションを作るときは ボリュームコントロールで操作されたときにアプリケーション側で変更されたことを検出する必要があります スライダーバーを動かしたりする必要があるので(必要ないならいりませんが)
Core Audio APIsのヘルプを見れば予想が付くと思いますがCallback関数を使ってNotifyを受け取れます これは次回機会があればということで 東方蓄音機のVista対応ではこの辺の処理を放り込んでます
|