如题.

解决方案 »

  1.   

    我这儿有音源设定的程序,只有选从麦克风录音还是从LineIn录音.至于音量调节网上很多,建议去www.codeproject.com搜索一下.//Mixer.c
    //Implementation of Mixer.h
    ///////////////////////////////////////////////////////////////////////////
    #include <WTYPES.H>
    #include <MMSYSTEM.H>
    #include <STDLIB.H>
    #include <STDIO.H>
    #include <LIMITS.H>
    #include "Mixer.h"//Debug Info
    #ifdef _DEBUG
    #define ASSERT(t) \
    if(t!=TRUE)\
    printf("ASSERT FAILURE IN FILE:%s,LINE:%d", __FILE__,__LINE__)
    #else //_DEBUG
    #define ASSERT(t) ((void)0)
    #endif//_DEBUG
    //end DEBUGUINT g_nNumMixers=0;//系统中的混音器数量
    HMIXER g_hMixer=NULL;//混音器句柄
    MIXERCAPS g_mxcaps;//混音器性能
    DWORD g_dwControlType;//控件类型
    DWORD g_dwSelectControlID;//录音音源的check控件ID号
    DWORD g_dwMultipleItems;//备选的录音音源数量
    DWORD g_dwIndex;//当前查询/设置录音音源的录音音源下标//初始化混音器
    BOOL amdInitialize()
    {
    ASSERT(g_hMixer == NULL); // get the number of mixer devices present in the system
    g_nNumMixers = mixerGetNumDevs(); g_hMixer = NULL;
    ZeroMemory(&g_mxcaps, sizeof(MIXERCAPS)); g_dwControlType = 0;
    g_dwSelectControlID = 0;
    g_dwMultipleItems = 0;
    g_dwIndex = ULONG_MAX; // open the first mixer
    // A "mapper" for audio mixer devices does not currently exist.
    if (g_nNumMixers != 0)
    {
    if (mixerOpen(&g_hMixer,
    0,
    0, //no callback mechanism
    0,
    MIXER_OBJECTF_MIXER )
    != MMSYSERR_NOERROR)
    {
    return FALSE;
    } if (mixerGetDevCaps((UINT)(g_hMixer),
      &g_mxcaps, sizeof(MIXERCAPS))
    != MMSYSERR_NOERROR)
    {
    return FALSE;
    }
    return TRUE;
    }
    return FALSE;}BOOL amdUninitialize()
    {
    BOOL bSucc = TRUE; if (g_hMixer != NULL)
    {
    bSucc = (mixerClose(g_hMixer) == MMSYSERR_NOERROR);
    g_hMixer = NULL;
    } return bSucc;
    }
      

  2.   

    BOOL amdGetMicSelectControl()
    {
    MIXERLINE mxl;
    MIXERCONTROL mxc;
    MIXERLINECONTROLS mxlc;
    MIXERCONTROLDETAILS_LISTTEXT *pmxcdSelectText;
    DWORD dwi = 0; if (g_hMixer == NULL)
    {
    return FALSE;
    } // get dwLineID
    mxl.cbStruct = sizeof(MIXERLINE);
    mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
    if (mixerGetLineInfo((HMIXEROBJ)(g_hMixer),
       &mxl,
       MIXER_OBJECTF_HMIXER |
       MIXER_GETLINEINFOF_COMPONENTTYPE)
    != MMSYSERR_NOERROR)
    {
    return FALSE;
    } // get dwControlID
    g_dwControlType = MIXERCONTROL_CONTROLTYPE_MIXER;
    mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
    mxlc.dwLineID = mxl.dwLineID;
    mxlc.dwControlType = g_dwControlType;
    mxlc.cControls = 1;
    mxlc.cbmxctrl = sizeof(MIXERCONTROL);
    mxlc.pamxctrl = &mxc;
    if (mixerGetLineControls((HMIXEROBJ)(g_hMixer),
       &mxlc,
       MIXER_OBJECTF_HMIXER |
       MIXER_GETLINECONTROLSF_ONEBYTYPE)
    != MMSYSERR_NOERROR)
    {
    // no mixer, try MUX
    g_dwControlType = MIXERCONTROL_CONTROLTYPE_MUX;
    mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
    mxlc.dwLineID = mxl.dwLineID;
    mxlc.dwControlType = g_dwControlType;
    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;
    }
    } // store dwControlID, cMultipleItems
    g_dwSelectControlID = mxc.dwControlID;
    g_dwMultipleItems = mxc.cMultipleItems; if (g_dwMultipleItems == 0)
    {
    return FALSE;
    } // get the index of the Microphone Select control
    pmxcdSelectText =
    malloc(sizeof(MIXERCONTROLDETAILS_LISTTEXT)*g_dwMultipleItems); if (pmxcdSelectText != NULL)
    {
    MIXERCONTROLDETAILS mxcd;
    mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = g_dwSelectControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = g_dwMultipleItems;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_LISTTEXT);
    mxcd.paDetails = pmxcdSelectText;
    if (mixerGetControlDetails((HMIXEROBJ)(g_hMixer),
     &mxcd,
     MIXER_OBJECTF_HMIXER |
     MIXER_GETCONTROLDETAILSF_LISTTEXT)
    == MMSYSERR_NOERROR)
    {
    // determine which controls the Microphone source line
    for (dwi = 0; dwi < g_dwMultipleItems; dwi++)
    {
    // get the line information
    MIXERLINE mxl;
    mxl.cbStruct = sizeof(MIXERLINE);
    mxl.dwLineID = pmxcdSelectText[dwi].dwParam1;
    if (mixerGetLineInfo((HMIXEROBJ)(g_hMixer),
       &mxl,
       MIXER_OBJECTF_HMIXER |
       MIXER_GETLINEINFOF_LINEID)
    == MMSYSERR_NOERROR &&
    mxl.dwComponentType == MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE)
    {
    // found, dwi is the index.
    g_dwIndex = dwi;
    break;
    }
    } if (dwi >= g_dwMultipleItems)
    {
    // could not find it using line IDs, some mixer drivers have
    // different meaning for MIXERCONTROLDETAILS_LISTTEXT.dwParam1.
    // let's try comparing the item names.
    for (dwi = 0; dwi < g_dwMultipleItems; dwi++)
    {
    if (lstrcmp(pmxcdSelectText[dwi].szName,
      "Microphone") == 0)
    {
    // found, dwi is the index.
    g_dwIndex = dwi;
    break;
    }
    }
    }
    } free(pmxcdSelectText);
    } return g_dwIndex < g_dwMultipleItems;
    }BOOL amdGetMicSelectValue(LONG* plVal)
    {
    BOOL bRetVal = FALSE;
    MIXERCONTROLDETAILS_BOOLEAN *pmxcdSelectValue ;
    if (g_hMixer == NULL ||
    g_dwMultipleItems == 0 ||
    g_dwIndex >= g_dwMultipleItems)
    {
    return FALSE;
    }
    pmxcdSelectValue =
    malloc(sizeof(MIXERCONTROLDETAILS_BOOLEAN)*g_dwMultipleItems); if (pmxcdSelectValue != NULL)
    {
    MIXERCONTROLDETAILS mxcd;
    mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = g_dwSelectControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = g_dwMultipleItems;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
    mxcd.paDetails = pmxcdSelectValue;
    if (mixerGetControlDetails((HMIXEROBJ)(g_hMixer),
     &mxcd,
     MIXER_OBJECTF_HMIXER |
     MIXER_GETCONTROLDETAILSF_VALUE)
    == MMSYSERR_NOERROR)
    {
    *plVal = pmxcdSelectValue[g_dwIndex].fValue;
    bRetVal = TRUE;
    } free(pmxcdSelectValue);
    } return bRetVal;
    }BOOL amdSetMicSelectValue(LONG lVal)
    {
    BOOL bRetVal = FALSE;
    MIXERCONTROLDETAILS_BOOLEAN *pmxcdSelectValue;
    if (g_hMixer == NULL ||
    g_dwMultipleItems == 0 ||
    g_dwIndex >= g_dwMultipleItems)
    {
    return FALSE;
    }
    // get all the values first
    pmxcdSelectValue =
    malloc(sizeof( MIXERCONTROLDETAILS_BOOLEAN)*g_dwMultipleItems); if (pmxcdSelectValue != NULL)
    {
    MIXERCONTROLDETAILS mxcd;
    mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = g_dwSelectControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = g_dwMultipleItems;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
    mxcd.paDetails = pmxcdSelectValue;
    if (mixerGetControlDetails((HMIXEROBJ)(g_hMixer),
     &mxcd,
     MIXER_OBJECTF_HMIXER |
     MIXER_GETCONTROLDETAILSF_VALUE)
    == MMSYSERR_NOERROR)
    {
    ASSERT(g_dwControlType == MIXERCONTROL_CONTROLTYPE_MIXER ||
       g_dwControlType == MIXERCONTROL_CONTROLTYPE_MUX); // MUX restricts the line selection to one source line at a time.
    if (lVal != 0 && g_dwControlType == MIXERCONTROL_CONTROLTYPE_MUX)
    {
    ZeroMemory(pmxcdSelectValue,
     g_dwMultipleItems * sizeof(MIXERCONTROLDETAILS_BOOLEAN));
    } // set the Microphone value
    pmxcdSelectValue[g_dwIndex].fValue = lVal; mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = g_dwSelectControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = g_dwMultipleItems;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
    mxcd.paDetails = pmxcdSelectValue;
    if (mixerSetControlDetails((HMIXEROBJ)(g_hMixer),
     &mxcd,
     MIXER_OBJECTF_HMIXER |
     MIXER_SETCONTROLDETAILSF_VALUE)
    == MMSYSERR_NOERROR)
    {
    bRetVal = TRUE;
    }
    } free(pmxcdSelectValue);
    } return bRetVal;
    }
      

  3.   

    BOOL amdGetLineInSelectControl()
    {
    MIXERLINE mxl;
    MIXERCONTROL mxc;
    MIXERLINECONTROLS mxlc;
    MIXERCONTROLDETAILS_LISTTEXT *pmxcdSelectText;
    DWORD dwi = 0;
    if (g_hMixer == NULL)
    {
    return FALSE;
    } // get dwLineID
    mxl.cbStruct = sizeof(MIXERLINE);
    mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
    if (mixerGetLineInfo((HMIXEROBJ)(g_hMixer),
       &mxl,
       MIXER_OBJECTF_HMIXER |
       MIXER_GETLINEINFOF_COMPONENTTYPE)
    != MMSYSERR_NOERROR)
    {
    return FALSE;
    } // get dwControlID
    g_dwControlType = MIXERCONTROL_CONTROLTYPE_MIXER;
    mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
    mxlc.dwLineID = mxl.dwLineID;
    mxlc.dwControlType = g_dwControlType;
    mxlc.cControls = 1;
    mxlc.cbmxctrl = sizeof(MIXERCONTROL);
    mxlc.pamxctrl = &mxc;
    if (mixerGetLineControls((HMIXEROBJ)(g_hMixer),
       &mxlc,
       MIXER_OBJECTF_HMIXER |
       MIXER_GETLINECONTROLSF_ONEBYTYPE)
    != MMSYSERR_NOERROR)
    {
    // no mixer, try MUX
    g_dwControlType = MIXERCONTROL_CONTROLTYPE_MUX;
    mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
    mxlc.dwLineID = mxl.dwLineID;
    mxlc.dwControlType = g_dwControlType;
    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;
    }
    } // store dwControlID, cMultipleItems
    g_dwSelectControlID = mxc.dwControlID;
    g_dwMultipleItems = mxc.cMultipleItems; if (g_dwMultipleItems == 0)
    {
    return FALSE;
    } // get the index of the LineIn Select control
    pmxcdSelectText =
    malloc(sizeof( MIXERCONTROLDETAILS_LISTTEXT)*g_dwMultipleItems); if (pmxcdSelectText != NULL)
    {
    MIXERCONTROLDETAILS mxcd;
    mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = g_dwSelectControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = g_dwMultipleItems;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_LISTTEXT);
    mxcd.paDetails = pmxcdSelectText;
    if (mixerGetControlDetails((HMIXEROBJ)(g_hMixer),
     &mxcd,
     MIXER_OBJECTF_HMIXER |
     MIXER_GETCONTROLDETAILSF_LISTTEXT)
    == MMSYSERR_NOERROR)
    {
    // determine which controls the Line In source line
    for (dwi = 0; dwi < g_dwMultipleItems; dwi++)
    {
    // get the line information
    MIXERLINE mxl;
    mxl.cbStruct = sizeof(MIXERLINE);
    mxl.dwLineID = pmxcdSelectText[dwi].dwParam1;
    if (mixerGetLineInfo((HMIXEROBJ)(g_hMixer),
       &mxl,
       MIXER_OBJECTF_HMIXER |
       MIXER_GETLINEINFOF_LINEID)
    == MMSYSERR_NOERROR &&
    mxl.dwComponentType == MIXERLINE_COMPONENTTYPE_SRC_LINE)
    {
    // found, dwi is the index.
    g_dwIndex = dwi;
    break;
    }
    } if (dwi >= g_dwMultipleItems)
    {
    // could not find it using line IDs, some mixer drivers have
    // different meaning for MIXERCONTROLDETAILS_LISTTEXT.dwParam1.
    // let's try comparing the item names.
    for (dwi = 0; dwi < g_dwMultipleItems; dwi++)
    {
    if (lstrcmp(pmxcdSelectText[dwi].szName,
      "Line In") == 0)
    {
    // found, dwi is the index.
    g_dwIndex = dwi;
    break;
    }
    }
    }
    } free(pmxcdSelectText);
    } return g_dwIndex < g_dwMultipleItems;
    }BOOL amdGetLineInSelectValue(LONG* plVal)
    {
    BOOL bRetVal = FALSE;
    MIXERCONTROLDETAILS_BOOLEAN *pmxcdSelectValue ; if (g_hMixer == NULL ||
    g_dwMultipleItems == 0 ||
    g_dwIndex >= g_dwMultipleItems)
    {
    return FALSE;
    }
    pmxcdSelectValue =
    malloc(sizeof(MIXERCONTROLDETAILS_BOOLEAN)*g_dwMultipleItems); if (pmxcdSelectValue != NULL)
    {
    MIXERCONTROLDETAILS mxcd;
    mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = g_dwSelectControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = g_dwMultipleItems;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
    mxcd.paDetails = pmxcdSelectValue;
    if (mixerGetControlDetails((HMIXEROBJ)(g_hMixer),
     &mxcd,
     MIXER_OBJECTF_HMIXER |
     MIXER_GETCONTROLDETAILSF_VALUE)
    == MMSYSERR_NOERROR)
    {
    *plVal = pmxcdSelectValue[g_dwIndex].fValue;
    bRetVal = TRUE;
    } free(pmxcdSelectValue);
    } return bRetVal;
    }BOOL amdSetLineInSelectValue(LONG lVal)
    {
    MIXERCONTROLDETAILS_BOOLEAN *pmxcdSelectValue;
    BOOL bRetVal = FALSE;
    if (g_hMixer == NULL ||
    g_dwMultipleItems == 0 ||
    g_dwIndex >= g_dwMultipleItems)
    {
    return FALSE;
    }
    // get all the values first
    pmxcdSelectValue =
    malloc(sizeof( MIXERCONTROLDETAILS_BOOLEAN)*g_dwMultipleItems); if (pmxcdSelectValue != NULL)
    {
    MIXERCONTROLDETAILS mxcd;
    mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = g_dwSelectControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = g_dwMultipleItems;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
    mxcd.paDetails = pmxcdSelectValue;
    if (mixerGetControlDetails((HMIXEROBJ)(g_hMixer),
     &mxcd,
     MIXER_OBJECTF_HMIXER |
     MIXER_GETCONTROLDETAILSF_VALUE)
    == MMSYSERR_NOERROR)
    {
    ASSERT(g_dwControlType == MIXERCONTROL_CONTROLTYPE_MIXER ||
       g_dwControlType == MIXERCONTROL_CONTROLTYPE_MUX); // MUX restricts the line selection to one source line at a time.
    if (lVal != 0 && g_dwControlType == MIXERCONTROL_CONTROLTYPE_MUX)
    {
    ZeroMemory(pmxcdSelectValue,
     g_dwMultipleItems * sizeof(MIXERCONTROLDETAILS_BOOLEAN));
    } // set the Line In value
    pmxcdSelectValue[g_dwIndex].fValue = lVal; mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = g_dwSelectControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = g_dwMultipleItems;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
    mxcd.paDetails = pmxcdSelectValue;
    if (mixerSetControlDetails((HMIXEROBJ)(g_hMixer),
     &mxcd,
     MIXER_OBJECTF_HMIXER |
     MIXER_SETCONTROLDETAILSF_VALUE)
    == MMSYSERR_NOERROR)
    {
    bRetVal = TRUE;
    }
    } free(pmxcdSelectValue);
    } return bRetVal;
    }
    BOOL SetMicSelected() 
    {
    LONG lVal=1; 
    if(!amdInitialize())
    return FALSE;
    if(!amdGetMicSelectControl())
    return FALSE;
    if(!amdSetMicSelectValue(lVal) )
    return FALSE;
    amdUninitialize();
    return TRUE;
    }BOOL SetLineInSelected() 
    {
    LONG lVal=1; 
    if(!amdInitialize()) 
    return FALSE;
    if(!amdGetLineInSelectControl())
    return FALSE;
    if(!amdSetMicSelectValue(lVal) )
    return FALSE;
    amdUninitialize();
    return TRUE;
    }
      

  4.   

    楼上的byron1大哥,谢谢你哦,结贴时等着算分吧.