SDK Index Previous page Next page

ミキサー その1(音量の調節)


はじめに

今回を含めて3回で、ミキサーデバイスを使った音量とミュートの設定方法を解説します。今回は音量の調節で、次回はミュート、最後は音量調節の多チャンネル対応化です。最初に白状しておきますが、3回に分けたのは時間稼ぎです。本当は、1回で十分終わる量です。

今回のサンプルファイルです。2000/07/23 バグ修正

ミキサー

音量やミュートを設定しようと思ってミキサーデバイスを調べた人は分かると思いますが、ヘルプファイルをみてもなにがなんだか分かりません。しかし音量とミュートだけなら、理解はできなくても使うことができれば十分です。なぜこんな事を言うかというと、私も全然理解していないからです。だから、まともな解説は出来ません。でもいいんです、使えるから...

ミキサーデバイスを使えるようにする

とりあえず、ミキサーデバイスをオープンします。オープンしたハンドルは変数g_hMixerに保存しておきます。
BOOL InitMixer(void)
{
    if(g_hMixer) return TRUE;
    if(mixerOpen(&g_hMixer,0,0,0,MIXER_OBJECTF_MIXER)!=MMSYSERR_NOERROR)
                                                                 return FALSE;
次に、ミキサデバイスの情報を変数に保存しておきます。今回のサンプルでは使っていませんが、いつか使うこともあるでしょう。
    if(mixerGetDevCaps((UINT)g_hMixer, &g_mxcaps, sizeof(MIXERCAPS))!=MMSYSERR_NOERROR)
                                                                         return FALSE;
    return  TRUE;
}

マスターボリュームIDを手に入れる

ミキサーがオープンできたら、マスターボリュームのIDを手に入れます。音量を変更するときは、このIDを使います。次のようにすればIDが取れますが、なんでかは分かりません。
とりあえず、ID音量の最小値と最大値を保存しておきます。
BOOL InitMasterVolumeControl(void)     2000/07/23 staticを取った
{
    MIXERLINE mxl;
    MIXERCONTROL mxc;
    MIXERLINECONTROLS mxlc;

    if(g_dwVolumeControlID != -1) return TRUE;   2000/07/23 訂正
    if(InitMixer() == FALSE) return FALSE;       2000/07/23 訂正

    mxl.cbStruct = sizeof(MIXERLINE);
    mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
    if(mixerGetLineInfo((HMIXEROBJ)g_hMixer,&mxl,
        MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE)!=MMSYSERR_NOERROR)
                                                                    return FALSE;

    mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
    mxlc.dwLineID = mxl.dwLineID;
    mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
    mxlc.cControls = 1;
    mxlc.cbmxctrl = sizeof(MIXERCONTROL);
    mxlc.pamxctrl = &mxc;
    if(mixerGetLineControls((HMIXEROBJ)g_hMixer,&mxlc,
        MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE) != MMSYSERR_NOERROR)
                                                                    return FALSE;

    g_dwMinimum = mxc.Bounds.dwMinimum;
    g_dwMaximum = mxc.Bounds.dwMaximum;
    g_dwVolumeControlID = mxc.dwControlID;

    return TRUE;
}

現在の音量を手に入れる

現在の音量を取得してみます。次のようにすれば取れるみたいです。しかし、そのままの値だと少し不便なので0から100の値になるように修正します。
BOOL GetMasterVolume(int *Val)
{
    MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
    MIXERCONTROLDETAILS mxcd;

    if(InitMasterVolumeControl() == FALSE) return FALSE;   2000/07/23 訂正

    mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = g_dwVolumeControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = 0;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
    mxcd.paDetails = &mxcdVolume;
    if(mixerGetControlDetails((HMIXEROBJ)g_hMixer,&mxcd,
        MIXER_OBJECTF_HMIXER | MIXER_GETCONTROLDETAILSF_VALUE)!=MMSYSERR_NOERROR)
                                                                     return FALSE;
    
    *Val = ((mxcdVolume.dwValue-g_dwMinimum)*100 + (g_dwMaximum-g_dwMinimum)/2)
                                                        / (g_dwMaximum-g_dwMinimum);

    return TRUE;
}

音量を設定する

今度は、音量を設定します。0から100までの値を実際の大きさに変換してから設定します。
BOOL SetMasterVolume(int Val)
{
    MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
    MIXERCONTROLDETAILS mxcd;

    if(InitMasterVolumeControl() == FALSE) return FALSE;   2000/07/23 訂正

    mxcdVolume.dwValue=Val*(g_dwMaximum-g_dwMinimum)/100+g_dwMinimum;

    mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = g_dwVolumeControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = 0;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
    mxcd.paDetails = &mxcdVolume;
    if (mixerSetControlDetails((HMIXEROBJ)g_hMixer,&mxcd,
                 MIXER_OBJECTF_HMIXER | MIXER_SETCONTROLDETAILSF_VALUE)!=MMSYSERR_NOERROR) return FALSE;
    
    return TRUE;
}

おわりに

まったく解説になってませんでしたが、サンプルファイルをそのまま使えば誰にでも音量の調節が出来るようになると思います。サンプルには、ミュートを設定する関数も入ってますが、それは次回で説明?します。


to sdk prev next