先日、自作のアプリケーションから音量を調節したいことがありました。
フォームにTTrackBarを置いて調節するのですが、それように
というサブルーチンを作りました。
クラスにしていますので、記録しておきます。
TswVOLUME.h
//--------------------------------------------------------------------------- // ボリューム管理のクラス // by Shue // 2006.09.07 //--------------------------------------------------------------------------- #ifndef TswVOLUMEH #define TswVOLUMEH //--------------------------------------------------------------------------- class TswVOLUME : TObject { public: __fastcall TswVOLUME(); __fastcall ~TswVOLUME(); int __fastcall GetVolume(); bool __fastcall SetVolume(int iVOL); }; //--------------------------------------------------------------------------- #endif
TswVOLUME.cpp
//--------------------------------------------------------------------------- // ボリューム管理のクラス // by Shue // 2006.09.07 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "TswVOLUME.h" #include <windows.h> #include <mmsystem.h> //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- __fastcall TswVOLUME::TswVOLUME() { // コンストラクタ ; } //--------------------------------------------------------------------------- __fastcall TswVOLUME::~TswVOLUME() { // デストラクタ ; } //--------------------------------------------------------------------------- int __fastcall TswVOLUME::GetVolume() { // 現在のマスター音量を返す int iVOL; long lMC; MIXERCAPS mcDAT; HMIXER hmDAT; MIXERLINE mlDAT; MIXERLINECONTROLS mlCTRL; MIXERCONTROL mCTRL; MIXERCONTROLDETAILS mcdDAT; MIXERCONTROLDETAILS_UNSIGNED mcduDAT; try { // デバイス数を取得 lMC = ::mixerGetNumDevs(); if (lMC > 0) { // デバイス情報を取得 memset(&mcDAT, 0x00, sizeof(MIXERCAPS)); if (::mixerGetDevCaps(0, &mcDAT, sizeof(MIXERCAPS)) != MMSYSERR_NOERROR) { // デバイス情報の取得に失敗 throw("Errro"); } // ミキサーを取得 if (mcDAT.cDestinations != 0) { if (::mixerOpen(&hmDAT, 0, 0, 0, MIXER_OBJECTF_MIXER) != MMSYSERR_NOERROR) { // ミキサーの取得に失敗 throw("Error"); } } // マスター音量情報を取得するためのパラメータをセット memset(&mlDAT, 0x00, sizeof(MIXERLINE)); mlDAT.cbStruct = sizeof(MIXERLINE); mlDAT.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; if (::mixerGetLineInfo((HMIXEROBJ)hmDAT, &mlDAT, MIXER_GETLINEINFOF_COMPONENTTYPE | MIXER_OBJECTF_HMIXER ) != MMSYSERR_NOERROR ) { throw("Errro"); } // マスターボリューム情報の取得 memset(&mlCTRL, 0x00, sizeof(MIXERLINECONTROLS)); memset(&mCTRL, 0x00, sizeof(MIXERCONTROL)); mlCTRL.cbStruct = sizeof(MIXERLINECONTROLS); mlCTRL.dwLineID = mlDAT.dwLineID; mlCTRL.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME; mlCTRL.cControls = 1 ; mlCTRL.pamxctrl = &mCTRL; mlCTRL.cbmxctrl = sizeof(MIXERCONTROL); if (::mixerGetLineControls((HMIXEROBJ)hmDAT, &mlCTRL, MIXER_GETLINECONTROLSF_ONEBYTYPE | MIXER_OBJECTF_HMIXER) != MMSYSERR_NOERROR) { throw("Error"); } // 詳細情報を取得 memset(&mcdDAT, 0x00, sizeof(MIXERCONTROLDETAILS)); memset(&mcduDAT, 0x00, sizeof(MIXERCONTROLDETAILS_UNSIGNED)); mcdDAT.cbStruct = sizeof(MIXERCONTROLDETAILS); mcdDAT.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED); mcdDAT.paDetails = &mcduDAT; mcdDAT.dwControlID = mCTRL.dwControlID; mcdDAT.cChannels = (mCTRL.fdwControl | MIXERCONTROL_CONTROLF_UNIFORM ? 1 : mlDAT.cChannels); if ((mCTRL.fdwControl & MIXERCONTROL_CONTROLF_MULTIPLE)) { mcdDAT.cMultipleItems = mCTRL.cMultipleItems; } if (mixerGetControlDetails((HMIXEROBJ)hmDAT, &mcdDAT, MIXER_SETCONTROLDETAILSF_VALUE) != MMSYSERR_NOERROR) { throw("Error"); } // 音量を取得する iVOL = mcduDAT.dwValue; // ミキサーをクローズ if (hmDAT) { ::mixerClose(hmDAT); } } } catch(...) { iVOL = -1; } return iVOL; } //--------------------------------------------------------------------------- bool __fastcall TswVOLUME::SetVolume(int iVOL) { // マスター音量をセットする long lMC; MIXERCAPS mcDAT; HMIXER hmDAT; MIXERLINE mlDAT; MIXERLINECONTROLS mlCTRL; MIXERCONTROL mCTRL; MIXERCONTROLDETAILS mcdDAT; MIXERCONTROLDETAILS_UNSIGNED mcduDAT; try { // デバイス数を取得 lMC = ::mixerGetNumDevs(); if (lMC > 0) { // デバイス情報を取得 memset(&mcDAT, 0x00, sizeof(MIXERCAPS)); if (::mixerGetDevCaps(0, &mcDAT, sizeof(MIXERCAPS)) != MMSYSERR_NOERROR) { // デバイス情報の取得に失敗 throw("Errro"); } // ミキサーを取得 if (mcDAT.cDestinations != 0) { if (::mixerOpen(&hmDAT, 0, 0, 0, MIXER_OBJECTF_MIXER) != MMSYSERR_NOERROR) { // ミキサーの取得に失敗 throw("Error"); } } // マスター音量情報を取得するためのパラメータをセット memset(&mlDAT, 0x00, sizeof(MIXERLINE)); mlDAT.cbStruct = sizeof(MIXERLINE); mlDAT.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; if (::mixerGetLineInfo((HMIXEROBJ)hmDAT, &mlDAT, MIXER_GETLINEINFOF_COMPONENTTYPE | MIXER_OBJECTF_HMIXER ) != MMSYSERR_NOERROR ) { throw("Errro"); } // マスターボリューム情報の取得 memset(&mlCTRL, 0x00, sizeof(MIXERLINECONTROLS)); memset(&mCTRL, 0x00, sizeof(MIXERCONTROL)); mlCTRL.cbStruct = sizeof(MIXERLINECONTROLS); mlCTRL.dwLineID = mlDAT.dwLineID; mlCTRL.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME; mlCTRL.cControls = 1 ; mlCTRL.pamxctrl = &mCTRL; mlCTRL.cbmxctrl = sizeof(MIXERCONTROL); if (::mixerGetLineControls((HMIXEROBJ)hmDAT, &mlCTRL, MIXER_GETLINECONTROLSF_ONEBYTYPE | MIXER_OBJECTF_HMIXER) != MMSYSERR_NOERROR) { throw("Error"); } // 音量を変更する memset(&mcdDAT, 0x00, sizeof(MIXERCONTROLDETAILS)); memset(&mcduDAT, 0x00, sizeof(MIXERCONTROLDETAILS_UNSIGNED)); mcdDAT.cbStruct = sizeof(MIXERCONTROLDETAILS); mcdDAT.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED); mcduDAT.dwValue = iVOL; mcdDAT.paDetails = &mcduDAT; mcdDAT.dwControlID = mCTRL.dwControlID; mcdDAT.cChannels = (mCTRL.fdwControl | MIXERCONTROL_CONTROLF_UNIFORM ? 1 : mlDAT.cChannels); if ((mCTRL.fdwControl & MIXERCONTROL_CONTROLF_MULTIPLE)) { mcdDAT.cMultipleItems = mCTRL.cMultipleItems; } if (mixerSetControlDetails((HMIXEROBJ)hmDAT, &mcdDAT, MIXER_SETCONTROLDETAILSF_VALUE | MIXER_OBJECTF_HMIXER ) != MMSYSERR_NOERROR) { throw("Error"); } // ミキサーをクローズ if (hmDAT) { ::mixerClose(hmDAT); } } } catch(...) { return false; } return true; } //---------------------------------------------------------------------------
なお、TTrackBarのMaxプロパティは常に「65535」にセットしておきます。