SDK Index Previous page Next page

ミキサー その2(ミュート)


はじめに

予告通り今回は、ミュートのON/OFFについて説明します。しかし、2週間もあいたせいで前回なにやってたか忘れるところでした。

今回のサンプルファイルは前回のと全く同じなので、持ってない人だけ落としてください。2000/07/23 バグ修正

マスターミュートIDを手に入れる

ボリュームの時と同じように、ミュートデバイスのIDを取得しておきます。
ボリュームの時との違いは、mxlc.dwControlTypeの値がMIXERCONTROL_CONTROLTYPE_MUTEになっていることだけです。
BOOL InitMasterMuteControl()     2000/07/23 staticを取った
{
    MIXERLINE mxl;
    MIXERCONTROL mxc;
    MIXERLINECONTROLS mxlc;

    if(g_dwMuteControlID != -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_MUTE;
    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_dwMuteControlID = mxc.dwControlID;

    return TRUE;
}

ミュートの状態を調べる

ミュートのON/OFFを調べます。これも、前回の音量を取得するのとほとんど同じです。違うのは、mxcd.cbDetailssizeof(MIXERCONTROLDETAILS_BOOLEAN)になっていることぐらいです。
BOOL GetMasterMute(BOOL *Val)
{
    MIXERCONTROLDETAILS_BOOLEAN mxcdMute;
    MIXERCONTROLDETAILS mxcd;

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

    mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = g_dwMuteControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = 0;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
    mxcd.paDetails = &mxcdMute;
    if (mixerGetControlDetails((HMIXEROBJ)g_hMixer,&mxcd,
                 MIXER_OBJECTF_HMIXER | MIXER_GETCONTROLDETAILSF_VALUE)!=MMSYSERR_NOERROR) return FALSE;
    
    *Val = mxcdMute.fValue;

    return TRUE;
}

ミュートの状態を設定する

やっぱり、前回の音量の設定とほとんど同じです。
BOOL SetMasterMute(BOOL Val)
{
    MIXERCONTROLDETAILS_BOOLEAN mxcdMute;
    MIXERCONTROLDETAILS mxcd;

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

    mxcdMute.fValue=Val;

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

おわりに

今回は、なんかすごく説明が楽でした。でも、よく分からなかったと思います。しかし、ミキサーは一度作ってしまえばそんなに変更することもないので、分からなくてもいいと思います。
次回は、音量の調節をしても左右バランスが中央に戻らないように、音量調節ルーチンを改良します。


to sdk prev next