1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726 |
- #include "StdAfx.h"
- #include "MixerWrap.h"
- #include <windows.h>
- #include <MMSystem.h>
- #include <stdlib.h>
- #include <string>
- #include <iostream>
- using namespace std;
- #include <mmdeviceapi.h>
- #include <endpointvolume.h>
- #include <Functiondiscoverykeys_devpkey.h>
- #include <comdef.h>
- #define SAFE_RELEASE(punk) \
- if ((punk) != NULL) \
- #define EXIT_ON_ERROR(hres) if (FAILED(hres)) { goto Exit; }
- #define SAFE_RELEASE(punk) if ((punk) != NULL) { (punk)->Release(); (punk) = NULL; }
- HRESULT getMicrophoneBoostVolumeLevel(IMMDevice *pEndptDev, IAudioVolumeLevel** ppVolumeLevel)
- {
- HRESULT hr = S_OK;
- DataFlow flow;
- IDeviceTopology *pDeviceTopology = NULL;
- IConnector *pConnFrom = NULL;
- IConnector *pConnTo = NULL;
- IPart *pPartPrev = NULL;
- IPart *pPartNext = NULL;
- *ppVolumeLevel = NULL;
- wchar_t microphoneBoostName[] = L"麦克风加强";//if your system language is English,the name is "microphone boost"
- if (pEndptDev == NULL)
- {
- EXIT_ON_ERROR(hr = E_POINTER)
- }
- // Get the endpoint device's IDeviceTopology interface.
- hr = pEndptDev->Activate(
- __uuidof(IDeviceTopology), CLSCTX_ALL, NULL,
- (void**)&pDeviceTopology);
- EXIT_ON_ERROR(hr)
- // The device topology for an endpoint device always
- // contains just one connector (connector number 0).
- hr = pDeviceTopology->GetConnector(0, &pConnFrom);
- SAFE_RELEASE(pDeviceTopology)
- EXIT_ON_ERROR(hr)
- // Make sure that this is a capture device.
- hr = pConnFrom->GetDataFlow(&flow);
- EXIT_ON_ERROR(hr)
- if (flow != Out)
- {
- // Error -- this is a rendering device.
- //EXIT_ON_ERROR(hr = AUDCLNT_E_WRONG_ENDPOINT_TYPE)
- }
- // Outer loop: Each iteration traverses the data path
- // through a device topology starting at the input
- // connector and ending at the output connector.
- while (TRUE)
- {
- BOOL bConnected;
- hr = pConnFrom->IsConnected(&bConnected);
- EXIT_ON_ERROR(hr)
- // Does this connector connect to another device?
- if (bConnected == FALSE)
- {
- // This is the end of the data path that
- // stretches from the endpoint device to the
- // system bus or external bus. Verify that
- // the connection type is Software_IO.
- ConnectorType connType;
- hr = pConnFrom->GetType(&connType);
- EXIT_ON_ERROR(hr)
- if (connType == Software_IO)
- {
- break; // finished
- }
- EXIT_ON_ERROR(hr = E_FAIL)
- }
- // Get the connector in the next device topology,
- // which lies on the other side of the connection.
- hr = pConnFrom->GetConnectedTo(&pConnTo);
- EXIT_ON_ERROR(hr)
- SAFE_RELEASE(pConnFrom)
- // Get the connector's IPart interface.
- hr = pConnTo->QueryInterface(
- __uuidof(IPart), (void**)&pPartPrev);
- EXIT_ON_ERROR(hr)
- SAFE_RELEASE(pConnTo)
- CComPtr<IAudioAutoGainControl> m_pAGC; //麦克风自动增益接口
- hr = pPartPrev->Activate(CLSCTX_INPROC_SERVER, __uuidof(IAudioAutoGainControl), (void**)&m_pAGC);
- if (SUCCEEDED(hr) && m_pAGC)
- printf("this function\n");
- // Inner loop: Each iteration traverses one link in a
- // device topology and looks for input multiplexers.
- while (TRUE)
- {
- PartType parttype;
- IPartsList *pParts;
- // Follow downstream link to next part.
- hr = pPartPrev->EnumPartsOutgoing(&pParts);
- EXIT_ON_ERROR(hr)
- hr = pParts->GetPart(0, &pPartNext);
- pParts->Release();
- EXIT_ON_ERROR(hr)
- hr = pPartNext->GetPartType(&parttype);
- EXIT_ON_ERROR(hr)
- LPWSTR pName;
- if (SUCCEEDED(pPartNext->GetName(&pName)))
- {
- // Failure of the following call means only that
- char printStr[200];
- WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, pName, wcslen(pName) + 1, printStr, 200, NULL, NULL);
- if (wcscmp(microphoneBoostName,pName) == 0)
- {
- //get IAudioVolumeLevel to control volume
- hr = pPartNext->Activate(CLSCTX_ALL, __uuidof(IAudioVolumeLevel), (void**)ppVolumeLevel);
- goto Exit;
- }
- CoTaskMemFree(pName);
- }
- GUID subType;
- pPartNext->GetSubType(&subType);
- if (parttype == Connector)
- {
- // We've reached the output connector that
- // lies at the end of this device topology.
- hr = pPartNext->QueryInterface(
- __uuidof(IConnector),
- (void**)&pConnFrom);
- EXIT_ON_ERROR(hr)
- SAFE_RELEASE(pPartPrev)
- SAFE_RELEASE(pPartNext)
- break;
- }
- SAFE_RELEASE(pPartPrev)
- pPartPrev = pPartNext;
- pPartNext = NULL;
- }
- }
- Exit:
- SAFE_RELEASE(pConnFrom)
- SAFE_RELEASE(pConnTo)
- SAFE_RELEASE(pPartPrev)
- SAFE_RELEASE(pPartNext)
- return hr;
- }
- void MixerWrap::MicphoneBoost(bool bIsBoost)
- {
- int mixerNum ;//总的混音器数量
- HMIXER hMixer; //混音器设备句柄
- MMRESULT mmr;//函数调用返回
- MIXERCAPS MixerCaps; //混音器设备能力信息
- MIXERLINE MixerLine;//线路的信息
- //获取当前系统总的混音器数量
- mixerNum= mixerGetNumDevs();
- bool ifFind =false;
- for(int i=0;i<mixerNum;i++)
- {
- //打开混音器,第一个参数是记录混音器的handler,第二个参数是要打开的混音器ID
- mmr = mixerOpen(&hMixer, i, 0, 0L, MIXER_OBJECTF_MIXER);
- ifFind =false;
- //取混音器id,第一个参数是混音器的handler,第二个参数记录混音器的id
- //mmr = mixerGetID((HMIXEROBJ)hMixer,&uMxid,MIXER_OBJECTF_HMIXER);
- //获取混音器能力特征,如声音控制 和录音控制
- mmr = mixerGetDevCaps((UINT)hMixer, &MixerCaps, sizeof(MixerCaps));
- for(int j=0;j<MixerCaps.cDestinations;j++)
- //MixerCaps.cDestinations表示此混音器设备的audio line目标的数量,
- //如一个audio line目标为“音量控制”,另一个audio line目标为“录音控制”。
- {
- memset(&MixerLine, 0, sizeof(MIXERLINE));
- MixerLine.cbStruct = sizeof(MixerLine);
- MixerLine.dwDestination = j;
- // 音量控制目标line的component类型为MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
- // 录音控制目标line的component类型为MIXERLINE_COMPONENTTYPE_DST_WAVEIN
- //MixerLine.dwComponentType=MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
- //mixerGetLineInfo 第三个参数可以是:MIXER_GETLINEINFOF_COMPONENTTYPE,MIXER_GETLINEINFOF_SOURCE,MIXER_GETLINEINFOF_DESTINATION等
- //取录音控制
- mmr = mixerGetLineInfo((HMIXEROBJ)hMixer, &MixerLine, MIXER_GETLINEINFOF_DESTINATION);
- DWORD dwConnections = MixerLine.cConnections;
- for (int count = 0; count < dwConnections; count++)
- {
- MixerLine.dwSource = count;
- mmr = mixerGetLineInfo((HMIXEROBJ)hMixer, &MixerLine, MIXER_OBJECTF_MIXER | MIXER_GETLINEINFOF_SOURCE);
- if (MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE == MixerLine.dwComponentType)
- {
- //如果是录音控制的麦克风选项,则跳出
- ifFind = true;
- break;
- }
- }
- if (ifFind)
- {
- break;
- }
- }
- if (!ifFind)
- continue;
- //获取麦克风选项
- MIXERLINECONTROLS MixerLineControls;
- PMIXERCONTROL paMixerControls;
- paMixerControls = (PMIXERCONTROL)malloc(sizeof(MIXERCONTROL) * MixerLine.cControls);
- MixerLineControls.cbStruct = sizeof(MixerLineControls);
- MixerLineControls.dwLineID = MixerLine.dwLineID;
- MixerLineControls.cControls = MixerLine.cControls;
- MixerLineControls.cbmxctrl = sizeof(MIXERCONTROL);
- MixerLineControls.pamxctrl = paMixerControls;
- mmr = mixerGetLineControls((HMIXEROBJ)hMixer, &MixerLineControls,
- MIXER_GETLINECONTROLSF_ALL);
- int u;
- ifFind = false;
- for (u = 0; u < MixerLine.cControls; u++)
- {
- if (_tcscmp(paMixerControls[u].szName, _T("麦克风加强")) == 0)
- {
- ifFind = true;
- break;
- }
- }
- if (!ifFind)
- {
- continue;
- }
- MIXERCONTROL MixerControl;
- MixerLineControls.cbStruct = sizeof(MixerLineControls);
- MixerLineControls.dwControlID = paMixerControls[u].dwControlID;
- MixerLineControls.cbmxctrl = sizeof(MixerControl);
- MixerLineControls.pamxctrl = &MixerControl;
- mmr = mixerGetLineControls((HMIXEROBJ)hMixer, &MixerLineControls, MIXER_GETLINECONTROLSF_ONEBYID);
- free(paMixerControls);
- MIXERCONTROLDETAILS MixerControlDetails;
- PMIXERCONTROLDETAILS_BOOLEAN pMixerControlDetails_Boolean;
- pMixerControlDetails_Boolean = (PMIXERCONTROLDETAILS_BOOLEAN)malloc(1 * sizeof(MIXERCONTROLDETAILS_BOOLEAN));
- memset(&MixerControlDetails, 0, sizeof(MixerControlDetails));
- MixerControlDetails.cbStruct = sizeof(MixerControlDetails);
- MixerControlDetails.dwControlID = MixerControl.dwControlID;
- MixerControlDetails.cChannels = 1;
- MixerControlDetails.cMultipleItems = 0;
- MixerControlDetails.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
- MixerControlDetails.paDetails = &pMixerControlDetails_Boolean[0];
- // True to turn on boost, False to turn off
- pMixerControlDetails_Boolean[0].fValue = bIsBoost;
- mmr = mixerSetControlDetails((HMIXEROBJ)hMixer, &MixerControlDetails, MIXER_SETCONTROLDETAILSF_VALUE);
- free(pMixerControlDetails_Boolean);
- //关闭混音器
- mixerClose(hMixer);
- if (bIsBoost)
- {
- MicphoneMut(true);
- }
- }
- return;
- }
- #define ERROR_EXIT_HR(hr) if (hr != S_OK){ continue;}
- void MixerWrap::MicphoneBoost_W7(float fValue)
- {
- HRESULT hr=NULL;
- CoInitialize(NULL);
- IMMDeviceEnumerator *deviceEnumerator = NULL;
- IMMDeviceCollection *pEndpoints = NULL;
- hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER,
- __uuidof(IMMDeviceEnumerator), (LPVOID *)&deviceEnumerator);
- IMMDevice *defaultDevice = NULL;
- if (hr != S_OK)
- {
- return ;
- }
- hr = deviceEnumerator->EnumAudioEndpoints(eCapture
- , DEVICE_STATE_ACTIVE, &pEndpoints);
- if (hr != S_OK) return;
- UINT deviceCount;
- hr = pEndpoints->GetCount(&deviceCount);
- if (hr != S_OK) return;
- IMMDevice *pDevice = NULL;
- //printf("devNum: %d\n", deviceCount);
- for (UINT dev = 0; dev < deviceCount; dev++)
- {
- pDevice = NULL;
- hr = pEndpoints->Item(dev, &pDevice);
- ERROR_EXIT_HR(hr);
- IPropertyStore *pProperties = NULL;
- hr = pDevice->OpenPropertyStore(STGM_READ, &pProperties);
- ERROR_EXIT_HR(hr);
- PROPVARIANT varName;
- PropVariantInit(&varName);
- hr = pProperties->GetValue(PKEY_Device_FriendlyName, &varName);
- char printStr[200];
- WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, varName.pwszVal, wcslen(varName.pwszVal) + 1, printStr, 200, NULL, NULL);
- //printf("Name: %s\n", printStr);
- IAudioVolumeLevel* pIaudioVolumeLevel;
- getMicrophoneBoostVolumeLevel(pDevice, &pIaudioVolumeLevel);
- if (pIaudioVolumeLevel != NULL)
- {
- pIaudioVolumeLevel->SetLevelUniform(fValue, NULL);
- }
- SAFE_RELEASE(pProperties);
- SAFE_RELEASE(pDevice);
- }
-
- deviceEnumerator->Release();
- deviceEnumerator = NULL;
- return ;
- }
- bool MixerWrap::checkMicphoneLevel(float fValue)
- {
- HRESULT hr = NULL;
- CoInitialize(NULL);
- IMMDeviceEnumerator *deviceEnumerator = NULL;
- IMMDeviceCollection *pEndpoints = NULL;
- hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER,
- __uuidof(IMMDeviceEnumerator), (LPVOID *)&deviceEnumerator);
- IMMDevice *defaultDevice = NULL;
- bool result = true;
- if (hr != S_OK) return false;
- hr = deviceEnumerator->EnumAudioEndpoints(eCapture
- , DEVICE_STATE_ACTIVE, &pEndpoints);
- if (hr != S_OK) return false;
- UINT deviceCount;
- hr = pEndpoints->GetCount(&deviceCount);
- if (hr != S_OK) return false;
- IMMDevice *pDevice = NULL;
- //printf("devNum: %d\n", deviceCount);
- for (UINT dev = 0; dev < deviceCount; dev++)
- {
- pDevice = NULL;
- hr = pEndpoints->Item(dev, &pDevice);
- ERROR_EXIT_HR(hr);
- IPropertyStore *pProperties = NULL;
- hr = pDevice->OpenPropertyStore(STGM_READ, &pProperties);
- ERROR_EXIT_HR(hr);
- PROPVARIANT varName;
- PropVariantInit(&varName);
- hr = pProperties->GetValue(PKEY_Device_FriendlyName, &varName);
- char printStr[200];
- WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, varName.pwszVal, wcslen(varName.pwszVal) + 1, printStr, 200, NULL, NULL);
- //printf("Name: %s\n", printStr);
- IAudioVolumeLevel* pIaudioVolumeLevel;
- getMicrophoneBoostVolumeLevel(pDevice, &pIaudioVolumeLevel);
- if (pIaudioVolumeLevel != NULL)
- {
- float tempLevel;
- pIaudioVolumeLevel->GetLevel(0, &tempLevel);//0-30
- if (tempLevel != fValue) result = false;
- }
- SAFE_RELEASE(pProperties);
- SAFE_RELEASE(pDevice);
- }
- deviceEnumerator->Release();
- deviceEnumerator = NULL;
- return result;
- }
- void MixerWrap::GetMicphoneLevel(float &fValue)
- {
- HRESULT hr=NULL;
- CoInitialize(NULL);
- IMMDeviceEnumerator *deviceEnumerator = NULL;
- hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER,
- __uuidof(IMMDeviceEnumerator), (LPVOID *)&deviceEnumerator);
- IMMDevice *defaultDevice = NULL;
- if (hr != S_OK)
- {
- return ;
- }
- hr = deviceEnumerator->GetDefaultAudioEndpoint(eCapture, eMultimedia, &defaultDevice);
- deviceEnumerator->Release();
- deviceEnumerator = NULL;
- IAudioVolumeLevel* pIaudioVolumeLevel;
- getMicrophoneBoostVolumeLevel(defaultDevice,&pIaudioVolumeLevel);
- defaultDevice->Release();
- defaultDevice = NULL;
- if (pIaudioVolumeLevel==NULL)
- {
- return ;
- }
- pIaudioVolumeLevel->GetLevel(0,&fValue);//0-30
- return ;
- }
- void MixerWrap::GetMicphoneLevelData(float &nMin, float &nMax, float &nStep)
- {
- HRESULT hr=NULL;
- CoInitialize(NULL);
- IMMDeviceEnumerator *deviceEnumerator = NULL;
- hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER,
- __uuidof(IMMDeviceEnumerator), (LPVOID *)&deviceEnumerator);
- IMMDevice *defaultDevice = NULL;
- if (hr != S_OK)
- {
- return ;
- }
- hr = deviceEnumerator->GetDefaultAudioEndpoint(eCapture, eMultimedia, &defaultDevice);
- deviceEnumerator->Release();
- deviceEnumerator = NULL;
- IAudioVolumeLevel* pIaudioVolumeLevel;
- getMicrophoneBoostVolumeLevel(defaultDevice,&pIaudioVolumeLevel);
- defaultDevice->Release();
- defaultDevice = NULL;
- if (pIaudioVolumeLevel==NULL)
- {
- return ;
- }
- pIaudioVolumeLevel->GetLevelRange(0,&nMin, &nMax, &nStep);//0-30
- }
- void MixerWrap::MicphoneMut(bool bIsMut)
- {
- int mixerNum ;//总的混音器数量
- HMIXER hMixer; //混音器设备句柄
- MMRESULT mmr;//函数调用返回
- MIXERCAPS MixerCaps; //混音器设备能力信息
- MIXERLINE MixerLine;//线路的信息
- //获取当前系统总的混音器数量
- mixerNum= mixerGetNumDevs();
- bool ifFind =false;
- for(int i=0;i<mixerNum;i++)
- {
- //打开混音器,第一个参数是记录混音器的handler,第二个参数是要打开的混音器ID
- mmr = mixerOpen(&hMixer, i, 0, 0L, MIXER_OBJECTF_MIXER);
- ifFind =false;
- //取混音器id,第一个参数是混音器的handler,第二个参数记录混音器的id
- //mmr = mixerGetID((HMIXEROBJ)hMixer,&uMxid,MIXER_OBJECTF_HMIXER);
- //获取混音器能力特征,如声音控制 和录音控制
- mmr = mixerGetDevCaps((UINT)hMixer, &MixerCaps, sizeof(MixerCaps));
- for(int j=0;j<MixerCaps.cDestinations;j++)
- //MixerCaps.cDestinations表示此混音器设备的audio line目标的数量,
- //如一个audio line目标为“音量控制”,另一个audio line目标为“录音控制”。
- {
- memset(&MixerLine,0,sizeof(MIXERLINE));
- MixerLine.cbStruct = sizeof(MixerLine);
- MixerLine.dwDestination = j;
- // 音量控制目标line的component类型为MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
- // 录音控制目标line的component类型为MIXERLINE_COMPONENTTYPE_DST_WAVEIN
- //MixerLine.dwComponentType=MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
- //mixerGetLineInfo 第三个参数可以是:MIXER_GETLINEINFOF_COMPONENTTYPE,MIXER_GETLINEINFOF_SOURCE,MIXER_GETLINEINFOF_DESTINATION等
- //取录音控制
- mmr = mixerGetLineInfo((HMIXEROBJ)hMixer, &MixerLine, MIXER_GETLINEINFOF_DESTINATION);
- DWORD dwConnections = MixerLine.cConnections;
- for ( int count = 0; count < dwConnections; count++ )
- {
- MixerLine.dwSource = count;
- mmr=mixerGetLineInfo((HMIXEROBJ)hMixer,&MixerLine,MIXER_OBJECTF_MIXER | MIXER_GETLINEINFOF_SOURCE);
- if (MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE == MixerLine.dwComponentType)
- {
- //如果是录音控制的麦克风选项,则跳出
- ifFind =true;
- break;
- }
- }
- if (ifFind)
- {
- break;
- }
- }
- if(!ifFind)
- continue;
- //获取麦克风选项
- MIXERLINECONTROLS MixerLineControls;
- PMIXERCONTROL paMixerControls;
- paMixerControls = (PMIXERCONTROL)malloc(sizeof(MIXERCONTROL) * MixerLine.cControls);
- MixerLineControls.cbStruct = sizeof(MixerLineControls);
- MixerLineControls.dwLineID = MixerLine.dwLineID;
- MixerLineControls.cControls = MixerLine.cControls;
- MixerLineControls.cbmxctrl = sizeof(MIXERCONTROL);
- MixerLineControls.pamxctrl = paMixerControls;
- mmr = mixerGetLineControls((HMIXEROBJ)hMixer, &MixerLineControls,
- MIXER_GETLINECONTROLSF_ALL);
- int u ;
- ifFind =false;
- for ( u = 0; u < MixerLine.cControls; u++)
- {
- if (_tcscmp(paMixerControls[u].szName,_T("麦克风静音"))==0 || _tcscmp(paMixerControls[u].szName,_T("静音"))==0)
- {
- ifFind =true;
- break;
- }
- }
- if (!ifFind)
- {
- continue;
- }
- MIXERCONTROL MixerControl;
- MixerLineControls.cbStruct = sizeof(MixerLineControls);
- MixerLineControls.dwControlID = paMixerControls[u].dwControlID;
- MixerLineControls.cbmxctrl = sizeof(MixerControl);
- MixerLineControls.pamxctrl = &MixerControl;
- mmr = mixerGetLineControls((HMIXEROBJ)hMixer, &MixerLineControls, MIXER_GETLINECONTROLSF_ONEBYID);
- free(paMixerControls);
- MIXERCONTROLDETAILS MixerControlDetails;
- PMIXERCONTROLDETAILS_BOOLEAN pMixerControlDetails_Boolean;
- pMixerControlDetails_Boolean = (PMIXERCONTROLDETAILS_BOOLEAN)malloc(1 * sizeof(MIXERCONTROLDETAILS_BOOLEAN));
- memset(&MixerControlDetails,0,sizeof(MixerControlDetails));
- MixerControlDetails.cbStruct = sizeof(MixerControlDetails);
- MixerControlDetails.dwControlID = MixerControl.dwControlID;
- MixerControlDetails.cChannels =1;
- MixerControlDetails.cMultipleItems =0;
- MixerControlDetails.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
- MixerControlDetails.paDetails = &pMixerControlDetails_Boolean[0];
- // True to turn on boost, False to turn off
- pMixerControlDetails_Boolean[0].fValue = bIsMut;
- mmr = mixerSetControlDetails((HMIXEROBJ)hMixer, &MixerControlDetails, MIXER_SETCONTROLDETAILSF_VALUE);
- free(pMixerControlDetails_Boolean);
- //关闭混音器
- mixerClose(hMixer);
-
- }
- return ;
- }
- void MixerWrap::StereoMix(bool bIsMix)
- {
- int mixerNum ;//总的混音器数量
- HMIXER hMixer; //混音器设备句柄
- MMRESULT mmr;//函数调用返回
- MIXERCAPS MixerCaps; //混音器设备能力信息
- MIXERLINE MixerLine;//线路的信息
- //获取当前系统总的混音器数量
- mixerNum= mixerGetNumDevs();
- bool ifFind =false;
- for(int i=0;i<mixerNum;i++)
- {
- //打开混音器,第一个参数是记录混音器的handler,第二个参数是要打开的混音器ID
- mmr = mixerOpen(&hMixer, i, 0, 0L, MIXER_OBJECTF_MIXER);
- ifFind =false;
- //取混音器id,第一个参数是混音器的handler,第二个参数记录混音器的id
- //mmr = mixerGetID((HMIXEROBJ)hMixer,&uMxid,MIXER_OBJECTF_HMIXER);
- //获取混音器能力特征,如声音控制 和录音控制
- mmr = mixerGetDevCaps((UINT)hMixer, &MixerCaps, sizeof(MixerCaps));
- for(int j=0;j<MixerCaps.cDestinations;j++)
- //MixerCaps.cDestinations表示此混音器设备的audio line目标的数量,
- //如一个audio line目标为“音量控制”,另一个audio line目标为“录音控制”。
- {
- memset(&MixerLine,0,sizeof(MIXERLINE));
- MixerLine.cbStruct = sizeof(MixerLine);
- MixerLine.dwDestination = j;
- // 音量控制目标line的component类型为MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
- // 录音控制目标line的component类型为MIXERLINE_COMPONENTTYPE_DST_WAVEIN
- //MixerLine.dwComponentType=MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
- //mixerGetLineInfo 第三个参数可以是:MIXER_GETLINEINFOF_COMPONENTTYPE,MIXER_GETLINEINFOF_SOURCE,MIXER_GETLINEINFOF_DESTINATION等
- //取录音控制
- mmr = mixerGetLineInfo((HMIXEROBJ)hMixer, &MixerLine, MIXER_GETLINEINFOF_DESTINATION);
- DWORD dwConnections = MixerLine.cConnections;
- for ( int count = 0; count < dwConnections; count++ )
- {
- MixerLine.dwSource = count;
- mmr=mixerGetLineInfo((HMIXEROBJ)hMixer,&MixerLine,MIXER_OBJECTF_MIXER | MIXER_GETLINEINFOF_SOURCE);
- //_tprintf(_T("MixerLine.dwComponentType:%d,MixerLine.szName:%s,\r\n"),MixerLine.dwComponentType,MixerLine.szName);
- if (_tcscmp(MixerLine.szName,_T("立体声混音"))==0/*MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC == MixerLine.dwComponentType &&*/ )
- {
- //如果是立体声混音选项,则跳出
- //_tprintf(_T("MixerLine.szName:%s,result:%d\r\n"),MixerLine.szName,wcscmp(MixerLine.szName,_T("立体声混音")));
- ifFind =true;
- break;
- }
- }
- if (ifFind)
- {
- break;
- }
- }
- if(!ifFind)
- continue;
- //_tprintf(_T("ifFind%d\r\n"),ifFind);
- //获取麦克风选项
- MIXERLINECONTROLS MixerLineControls;
- PMIXERCONTROL paMixerControls;
- paMixerControls = (PMIXERCONTROL)malloc(sizeof(MIXERCONTROL) * MixerLine.cControls);
- MixerLineControls.cbStruct = sizeof(MixerLineControls);
- MixerLineControls.dwLineID = MixerLine.dwLineID;
- MixerLineControls.cControls = MixerLine.cControls;
- MixerLineControls.cbmxctrl = sizeof(MIXERCONTROL);
- MixerLineControls.pamxctrl = paMixerControls;
- mmr = mixerGetLineControls((HMIXEROBJ)hMixer, &MixerLineControls,MIXER_GETLINECONTROLSF_ALL);
- int u ;
- ifFind =false;
- for ( u = 0; u < MixerLine.cControls; u++)
- {
- //_tprintf(_T("MixerLine.cControls:%d,MpaMixerControls[u].szName:%s,\r\n"),MixerLine.cControls,paMixerControls[u].szName);
- if (_tcscmp(paMixerControls[u].szName,_T("立体声混音静音"))==0 ||
- _tcscmp(paMixerControls[u].szName,_T("静音"))==0 ||
- _tcscmp(paMixerControls[u].szName,_T("立体声混音"))==0 )
- {
- ifFind =true;
- break;
- }
- }
- if (!ifFind)
- {
- continue;
- }
- MIXERCONTROL MixerControl;
- MixerLineControls.cbStruct = sizeof(MixerLineControls);
- MixerLineControls.dwControlID = paMixerControls[u].dwControlID;
- MixerLineControls.cbmxctrl = sizeof(MixerControl);
- MixerLineControls.pamxctrl = &MixerControl;
- mmr = mixerGetLineControls((HMIXEROBJ)hMixer, &MixerLineControls, MIXER_GETLINECONTROLSF_ONEBYID);
- free(paMixerControls);
- MIXERCONTROLDETAILS MixerControlDetails;
- PMIXERCONTROLDETAILS_BOOLEAN pMixerControlDetails_Boolean;
- pMixerControlDetails_Boolean = (PMIXERCONTROLDETAILS_BOOLEAN)malloc(1 * sizeof(MIXERCONTROLDETAILS_BOOLEAN));
- memset(&MixerControlDetails,0,sizeof(MixerControlDetails));
- MixerControlDetails.cbStruct = sizeof(MixerControlDetails);
- MixerControlDetails.dwControlID = MixerControl.dwControlID;
- MixerControlDetails.cChannels =1;
- MixerControlDetails.cMultipleItems =0;
- MixerControlDetails.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
- MixerControlDetails.paDetails = &pMixerControlDetails_Boolean[0];
- // True to turn on boost, False to turn off
- pMixerControlDetails_Boolean[0].fValue = bIsMix;
- mmr = mixerSetControlDetails((HMIXEROBJ)hMixer, &MixerControlDetails, MIXER_SETCONTROLDETAILSF_VALUE);
- free(pMixerControlDetails_Boolean);
- //关闭混音器
- mixerClose(hMixer);
- }
- return ;
- }
- void MixerWrap::StereoMixVolume(int nVolume)
- {
- int mixerNum ;//总的混音器数量
- HMIXER hMixer; //混音器设备句柄
- MMRESULT mmr;//函数调用返回
- MIXERCAPS MixerCaps; //混音器设备能力信息
- MIXERLINE MixerLine;//线路的信息
- //获取当前系统总的混音器数量
- mixerNum= mixerGetNumDevs();
- bool ifFind =false;
- for(int i=0;i<mixerNum;i++)
- {
- //打开混音器,第一个参数是记录混音器的handler,第二个参数是要打开的混音器ID
- mmr = mixerOpen(&hMixer, i, 0, 0L, MIXER_OBJECTF_MIXER);
- ifFind =false;
- //取混音器id,第一个参数是混音器的handler,第二个参数记录混音器的id
- //mmr = mixerGetID((HMIXEROBJ)hMixer,&uMxid,MIXER_OBJECTF_HMIXER);
- //获取混音器能力特征,如声音控制 和录音控制
- mmr = mixerGetDevCaps((UINT)hMixer, &MixerCaps, sizeof(MixerCaps));
- for(int j=0;j<MixerCaps.cDestinations;j++)
- //MixerCaps.cDestinations表示此混音器设备的audio line目标的数量,
- //如一个audio line目标为“音量控制”,另一个audio line目标为“录音控制”。
- {
- memset(&MixerLine,0,sizeof(MIXERLINE));
- MixerLine.cbStruct = sizeof(MixerLine);
- MixerLine.dwDestination = j;
- // 音量控制目标line的component类型为MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
- // 录音控制目标line的component类型为MIXERLINE_COMPONENTTYPE_DST_WAVEIN
- //MixerLine.dwComponentType=MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
- //mixerGetLineInfo 第三个参数可以是:MIXER_GETLINEINFOF_COMPONENTTYPE,MIXER_GETLINEINFOF_SOURCE,MIXER_GETLINEINFOF_DESTINATION等
- //取录音控制
- mmr = mixerGetLineInfo((HMIXEROBJ)hMixer, &MixerLine, MIXER_GETLINEINFOF_DESTINATION);
- DWORD dwConnections = MixerLine.cConnections;
- for ( int count = 0; count < dwConnections; count++ )
- {
- MixerLine.dwSource = count;
- mmr=mixerGetLineInfo((HMIXEROBJ)hMixer,&MixerLine,MIXER_OBJECTF_MIXER | MIXER_GETLINEINFOF_SOURCE);
- //_tprintf(_T("MixerLine.dwComponentType:%d,MixerLine.szName:%s,\r\n"),MixerLine.dwComponentType,MixerLine.szName);
- if (_tcscmp(MixerLine.szName,_T("立体声混音"))==0/*MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC == MixerLine.dwComponentType &&*/ )
- {
- //如果是立体声混音选项,则跳出
- //_tprintf(_T("MixerLine.szName:%s,result:%d\r\n"),MixerLine.szName,wcscmp(MixerLine.szName,_T("立体声混音")));
- ifFind =true;
- break;
- }
- }
- if (ifFind)
- {
- break;
- }
- }
- if(!ifFind)
- continue;
- //_tprintf(_T("ifFind%d\r\n"),ifFind);
- //获取麦克风选项
- MIXERLINECONTROLS MixerLineControls;
- PMIXERCONTROL paMixerControls;
- paMixerControls = (PMIXERCONTROL)malloc(sizeof(MIXERCONTROL) * MixerLine.cControls);
- MixerLineControls.cbStruct = sizeof(MixerLineControls);
- MixerLineControls.dwLineID = MixerLine.dwLineID;
- MixerLineControls.cControls = MixerLine.cControls;
- MixerLineControls.cbmxctrl = sizeof(MIXERCONTROL);
- MixerLineControls.pamxctrl = paMixerControls;
- mmr = mixerGetLineControls((HMIXEROBJ)hMixer, &MixerLineControls,MIXER_GETLINECONTROLSF_ALL);
- int u ;
- ifFind =false;
- for ( u = 0; u < MixerLine.cControls; u++)
- {
- //_tprintf(_T("MixerLine.cControls:%d,MpaMixerControls[u].szName:%s,\r\n"),MixerLine.cControls,paMixerControls[u].szName);
-
- TCHAR temp[50];
-
- _stprintf(temp,_T("Name:%s"),paMixerControls[u].szName);
- _bstr_t strStr = temp;
- // ::MessageBox(NULL,(LPCWSTR)strStr,_T("提示信息"),MB_OK | MB_ICONINFORMATION);
- if (_tcscmp(paMixerControls[u].szName,_T("立体声混音"))==0 || _tcscmp(paMixerControls[u].szName,_T("立体声混音音量"))==0 )
- {
- ifFind =true;
- break;
- }
- }
- if (!ifFind)
- {
- continue;
- }
- MIXERCONTROL MixerControl;
- MixerLineControls.cbStruct = sizeof(MixerLineControls);
- MixerLineControls.dwControlID = paMixerControls[u].dwControlID;
- MixerLineControls.cbmxctrl = sizeof(MixerControl);
- MixerLineControls.pamxctrl = &MixerControl;
- mmr = mixerGetLineControls((HMIXEROBJ)hMixer, &MixerLineControls, MIXER_GETLINECONTROLSF_ONEBYID);
- free(paMixerControls);
- /*MIXERCONTROLDETAILS mxcd;
- MIXERCONTROLDETAILS_UNSIGNED vol;
- vol.dwValue = nVolume;
- mxcd.hwndOwner = 0;
- mxcd.dwControlID = MixerControl.dwControlID;
- mxcd.cbStruct = sizeof(mxcd);
- mxcd.cbDetails = sizeof(vol);
- mxcd.paDetails = &vol;
- mxcd.cChannels = 1;
- mmr =mixerSetControlDetails((HMIXEROBJ)hMixer, &mxcd, MIXER_OBJECTF_HMIXER|MIXER_SETCONTROLDETAILSF_VALUE);
- if(mmr)
- return ;
- return ; */
- MIXERCONTROLDETAILS MixerControlDetails;
- PMIXERCONTROLDETAILS_UNSIGNED pMixerControlDetails_Unsigned;
- pMixerControlDetails_Unsigned = (PMIXERCONTROLDETAILS_UNSIGNED)malloc(1 * sizeof(MIXERCONTROLDETAILS_UNSIGNED));
-
- memset(&MixerControlDetails,0,sizeof(MixerControlDetails));
- MixerControlDetails.cbStruct = sizeof(MixerControlDetails);
- MixerControlDetails.dwControlID = MixerControl.dwControlID;
- MixerControlDetails.cChannels =1;
- MixerControlDetails.cMultipleItems =0;
- MixerControlDetails.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
- MixerControlDetails.paDetails = &pMixerControlDetails_Unsigned[0];
- pMixerControlDetails_Unsigned->dwValue= nVolume;
- mmr = mixerSetControlDetails((HMIXEROBJ)hMixer, &MixerControlDetails, MIXER_SETCONTROLDETAILSF_VALUE);
- free(pMixerControlDetails_Unsigned);
- //关闭混音器
- mixerClose(hMixer);
- }
- return ;
- }
- void MixerWrap::OutPutMicphoneVolume(int nVolume)
- {
- int mixerNum ;//总的混音器数量
- HMIXER hMixer; //混音器设备句柄
- MMRESULT mmr;//函数调用返回
- MIXERCAPS MixerCaps; //混音器设备能力信息
- MIXERLINE MixerLine;//线路的信息
- //获取当前系统总的混音器数量
- mixerNum= mixerGetNumDevs();
- bool ifFind =false;
- for(int i=0;i<mixerNum;i++)
- {
- //打开混音器,第一个参数是记录混音器的handler,第二个参数是要打开的混音器ID
- mmr = mixerOpen(&hMixer, i, 0, 0L, MIXER_OBJECTF_MIXER);
- //取混音器id,第一个参数是混音器的handler,第二个参数记录混音器的id
- //mmr = mixerGetID((HMIXEROBJ)hMixer,&uMxid,MIXER_OBJECTF_HMIXER);
- //获取混音器能力特征,如声音控制 和录音控制
- mmr = mixerGetDevCaps((UINT)hMixer, &MixerCaps, sizeof(MixerCaps));
- for(int j=0;j<MixerCaps.cDestinations;j++)
- //MixerCaps.cDestinations表示此混音器设备的audio line目标的数量,
- //如一个audio line目标为“音量控制”,另一个audio line目标为“录音控制”。
- {
- memset(&MixerLine,0,sizeof(MIXERLINE));
- MixerLine.cbStruct = sizeof(MixerLine);
- MixerLine.dwDestination = j;
- // 音量控制目标line的component类型为MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
- // 录音控制目标line的component类型为MIXERLINE_COMPONENTTYPE_DST_WAVEIN
- //MixerLine.dwComponentType=MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
- //mixerGetLineInfo 第三个参数可以是:MIXER_GETLINEINFOF_COMPONENTTYPE,MIXER_GETLINEINFOF_SOURCE,MIXER_GETLINEINFOF_DESTINATION等
- //取录音控制
- mmr = mixerGetLineInfo((HMIXEROBJ)hMixer, &MixerLine, MIXER_GETLINEINFOF_DESTINATION);
- DWORD dwConnections = MixerLine.cConnections;
- for ( int count = 0; count < dwConnections; count++ )
- {
- MixerLine.dwSource = count;
- mmr=mixerGetLineInfo((HMIXEROBJ)hMixer,&MixerLine,MIXER_OBJECTF_MIXER | MIXER_GETLINEINFOF_SOURCE);
- if (MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE == MixerLine.dwComponentType)
- {
- //如果是录音控制的麦克风选项,则跳出
- ifFind =true;
- break;
- }
- }
- if (ifFind)
- {
- break;
- }
- }
- if(!ifFind)
- continue;
- //获取麦克风选项
- MIXERLINECONTROLS MixerLineControls;
- PMIXERCONTROL paMixerControls;
- paMixerControls = (PMIXERCONTROL)malloc(sizeof(MIXERCONTROL) * MixerLine.cControls);
- MixerLineControls.cbStruct = sizeof(MixerLineControls);
- MixerLineControls.dwLineID = MixerLine.dwLineID;
- MixerLineControls.cControls = MixerLine.cControls;
- MixerLineControls.cbmxctrl = sizeof(MIXERCONTROL);
- MixerLineControls.pamxctrl = paMixerControls;
- mmr = mixerGetLineControls((HMIXEROBJ)hMixer, &MixerLineControls,
- MIXER_GETLINECONTROLSF_ALL);
- int u ;
- ifFind =false;
- for ( u = 0; u < MixerLine.cControls; u++)
- {
- if (_tcscmp(paMixerControls[u].szName,_T("麦克风音量"))==0 || _tcscmp(paMixerControls[u].szName,_T("静音"))==0)
- {
- ifFind =true;
- break;
- }
- }
- if (!ifFind)
- {
- continue;
- }
- MIXERCONTROL MixerControl;
- MixerLineControls.cbStruct = sizeof(MixerLineControls);
- MixerLineControls.dwControlID = paMixerControls[u].dwControlID;
- MixerLineControls.cbmxctrl = sizeof(MixerControl);
- MixerLineControls.pamxctrl = &MixerControl;
- mmr = mixerGetLineControls((HMIXEROBJ)hMixer, &MixerLineControls, MIXER_GETLINECONTROLSF_ONEBYID);
- free(paMixerControls);
- MIXERCONTROLDETAILS MixerControlDetails;
- PMIXERCONTROLDETAILS_UNSIGNED pMixerControlDetails_Unsigned;
- pMixerControlDetails_Unsigned = (PMIXERCONTROLDETAILS_UNSIGNED)malloc(1 * sizeof(MIXERCONTROLDETAILS_UNSIGNED));
-
- memset(&MixerControlDetails,0,sizeof(MixerControlDetails));
- MixerControlDetails.cbStruct = sizeof(MixerControlDetails);
- MixerControlDetails.dwControlID = MixerControl.dwControlID;
- MixerControlDetails.cChannels =1;
- MixerControlDetails.cMultipleItems =0;
- MixerControlDetails.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
- MixerControlDetails.paDetails = &pMixerControlDetails_Unsigned[0];
- pMixerControlDetails_Unsigned->dwValue= nVolume;
- mmr = mixerSetControlDetails((HMIXEROBJ)hMixer, &MixerControlDetails, MIXER_SETCONTROLDETAILSF_VALUE);
- free(pMixerControlDetails_Unsigned);
- /*MIXERCONTROLDETAILS MixerControlDetails;
- PMIXERCONTROLDETAILS_BOOLEAN pMixerControlDetails_Boolean;
- pMixerControlDetails_Boolean = (PMIXERCONTROLDETAILS_BOOLEAN)malloc(1 * sizeof(MIXERCONTROLDETAILS_BOOLEAN));
- memset(&MixerControlDetails,0,sizeof(MixerControlDetails));
- MixerControlDetails.cbStruct = sizeof(MixerControlDetails);
- MixerControlDetails.dwControlID = MixerControl.dwControlID;
- MixerControlDetails.cChannels =1;
- MixerControlDetails.cMultipleItems =0;
- MixerControlDetails.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
- MixerControlDetails.paDetails = &pMixerControlDetails_Boolean[0];
- pMixerControlDetails_Boolean[0].fValue = bIsMut;
- mmr = mixerSetControlDetails((HMIXEROBJ)hMixer, &MixerControlDetails, MIXER_SETCONTROLDETAILSF_VALUE);
- free(pMixerControlDetails_Boolean);*/
- //关闭混音器
- mixerClose(hMixer);
- }
- return ;
- }
- void MixerWrap::InPutMicphoneVolume(int nVolume)
- {
- int mixerNum ;//总的混音器数量
- HMIXER hMixer; //混音器设备句柄
- MMRESULT mmr;//函数调用返回
- MIXERCAPS MixerCaps; //混音器设备能力信息
- MIXERLINE MixerLine;//线路的信息
- //获取当前系统总的混音器数量
- mixerNum= mixerGetNumDevs();
- bool ifFind =false;
- for(int i=1;i<mixerNum;i++)
- {
- //打开混音器,第一个参数是记录混音器的handler,第二个参数是要打开的混音器ID
- mmr = mixerOpen(&hMixer, i, 0, 0L, MIXER_OBJECTF_MIXER);
- //取混音器id,第一个参数是混音器的handler,第二个参数记录混音器的id
- //mmr = mixerGetID((HMIXEROBJ)hMixer,&uMxid,MIXER_OBJECTF_HMIXER);
- //获取混音器能力特征,如声音控制 和录音控制
- mmr = mixerGetDevCaps((UINT)hMixer, &MixerCaps, sizeof(MixerCaps));
- for(int j=0;j<MixerCaps.cDestinations;j++)
- //MixerCaps.cDestinations表示此混音器设备的audio line目标的数量,
- //如一个audio line目标为“音量控制”,另一个audio line目标为“录音控制”。
- {
- memset(&MixerLine,0,sizeof(MIXERLINE));
- MixerLine.cbStruct = sizeof(MixerLine);
- MixerLine.dwDestination = j;
- // 音量控制目标line的component类型为MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
- // 录音控制目标line的component类型为MIXERLINE_COMPONENTTYPE_DST_WAVEIN
- //MixerLine.dwComponentType=MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
- //mixerGetLineInfo 第三个参数可以是:MIXER_GETLINEINFOF_COMPONENTTYPE,MIXER_GETLINEINFOF_SOURCE,MIXER_GETLINEINFOF_DESTINATION等
- //取录音控制
- mmr = mixerGetLineInfo((HMIXEROBJ)hMixer, &MixerLine, MIXER_GETLINEINFOF_DESTINATION);
- DWORD dwConnections = MixerLine.cConnections;
- for ( int count = 0; count < dwConnections; count++ )
- {
- MixerLine.dwSource = count;
- mmr=mixerGetLineInfo((HMIXEROBJ)hMixer,&MixerLine,MIXER_OBJECTF_MIXER | MIXER_GETLINEINFOF_SOURCE);
- if (MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE == MixerLine.dwComponentType)
- {
- //如果是录音控制的麦克风选项,则跳出
- ifFind =true;
- break;
- }
- }
- if (ifFind)
- {
- break;
- }
- }
- if(!ifFind)
- continue;
- //获取麦克风选项
- MIXERLINECONTROLS MixerLineControls;
- PMIXERCONTROL paMixerControls;
- paMixerControls = (PMIXERCONTROL)malloc(sizeof(MIXERCONTROL) * MixerLine.cControls);
- MixerLineControls.cbStruct = sizeof(MixerLineControls);
- MixerLineControls.dwLineID = MixerLine.dwLineID;
- MixerLineControls.cControls = MixerLine.cControls;
- MixerLineControls.cbmxctrl = sizeof(MIXERCONTROL);
- MixerLineControls.pamxctrl = paMixerControls;
- mmr = mixerGetLineControls((HMIXEROBJ)hMixer, &MixerLineControls,
- MIXER_GETLINECONTROLSF_ALL);
- int u ;
- ifFind =false;
- for ( u = 0; u < MixerLine.cControls; u++)
- {
- if (_tcscmp(paMixerControls[u].szName,_T("麦克风输入音量"))==0 || _tcscmp(paMixerControls[u].szName,_T("麦克风音量"))==0)
- {
- ifFind =true;
- break;
- }
- }
- if (!ifFind)
- {
- continue;
- }
- MIXERCONTROL MixerControl;
- MixerLineControls.cbStruct = sizeof(MixerLineControls);
- MixerLineControls.dwControlID = paMixerControls[u].dwControlID;
- MixerLineControls.cbmxctrl = sizeof(MixerControl);
- MixerLineControls.pamxctrl = &MixerControl;
- mmr = mixerGetLineControls((HMIXEROBJ)hMixer, &MixerLineControls, MIXER_GETLINECONTROLSF_ONEBYID);
- free(paMixerControls);
- MIXERCONTROLDETAILS MixerControlDetails;
- PMIXERCONTROLDETAILS_UNSIGNED pMixerControlDetails_Unsigned;
- pMixerControlDetails_Unsigned = (PMIXERCONTROLDETAILS_UNSIGNED)malloc(1 * sizeof(MIXERCONTROLDETAILS_UNSIGNED));
-
- memset(&MixerControlDetails,0,sizeof(MixerControlDetails));
- MixerControlDetails.cbStruct = sizeof(MixerControlDetails);
- MixerControlDetails.dwControlID = MixerControl.dwControlID;
- MixerControlDetails.cChannels =1;
- MixerControlDetails.cMultipleItems =0;
- MixerControlDetails.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
- MixerControlDetails.paDetails = &pMixerControlDetails_Unsigned[0];
- pMixerControlDetails_Unsigned->dwValue= nVolume;
- mmr = mixerSetControlDetails((HMIXEROBJ)hMixer, &MixerControlDetails, MIXER_SETCONTROLDETAILSF_VALUE);
- free(pMixerControlDetails_Unsigned);
- /*MIXERCONTROLDETAILS MixerControlDetails;
- PMIXERCONTROLDETAILS_BOOLEAN pMixerControlDetails_Boolean;
- pMixerControlDetails_Boolean = (PMIXERCONTROLDETAILS_BOOLEAN)malloc(1 * sizeof(MIXERCONTROLDETAILS_BOOLEAN));
- memset(&MixerControlDetails,0,sizeof(MixerControlDetails));
- MixerControlDetails.cbStruct = sizeof(MixerControlDetails);
- MixerControlDetails.dwControlID = MixerControl.dwControlID;
- MixerControlDetails.cChannels =1;
- MixerControlDetails.cMultipleItems =0;
- MixerControlDetails.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
- MixerControlDetails.paDetails = &pMixerControlDetails_Boolean[0];
- pMixerControlDetails_Boolean[0].fValue = bIsMut;
- mmr = mixerSetControlDetails((HMIXEROBJ)hMixer, &MixerControlDetails, MIXER_SETCONTROLDETAILSF_VALUE);
- free(pMixerControlDetails_Boolean);*/
- //关闭混音器
- mixerClose(hMixer);
- }
- return ;
- }
- bool MixerWrap::GetSpeakerValue_W7(float &fVolume)
- {
-
- IMMDeviceEnumerator* pEnumerator;
- IMMDeviceCollection *pCollection = NULL;
- IMMDevice *pDevice=NULL;
- IPropertyStore *pProperties=NULL;
- IAudioEndpointVolume *pVolumeAPI=NULL;
- UINT deviceCount = 0;
- CoInitializeEx(NULL, COINIT_MULTITHREADED);
- HRESULT hr=CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL,CLSCTX_ALL, __uuidof(IMMDeviceEnumerator),(void**)&pEnumerator);
- if (hr != S_OK)
- {
- printf("CoCreateInstance Failed!/n");
- return 0;
- }
- hr = pEnumerator->EnumAudioEndpoints(/*eCapture*/ eRender, DEVICE_STATE_ACTIVE, &pCollection);
- //hr = pEnumerator->EnumAudioEndpoints( eRender , DEVICE_STATEMASK_ALL , &pCollection );
- if (hr != S_OK)
- {
- printf("EnumAudioEndpoints Failed!/n");
- goto releasepEnumerator;
- }
- hr = pCollection->GetCount(&deviceCount);
- if (hr != S_OK)
- {
- printf("GetCount Failed!/n");
- goto releasepCollection;
- }
-
- for (UINT dev=0;dev<deviceCount;dev++)
- {
- pDevice = NULL;
- hr = pCollection->Item(dev,&pDevice);
- if (hr == S_OK)
- {
- hr = pDevice->OpenPropertyStore(STGM_READ,&pProperties);
-
- if (hr == S_OK)
- {
- PROPVARIANT varName;
- PropVariantInit(&varName);
- hr = pProperties->GetValue(PKEY_Device_FriendlyName, &varName);
-
- if (hr == S_OK )
- {
- //::MessageBox(NULL,varName.pwszVal,_T("提示信息"),MB_OK | MB_ICONINFORMATION);
-
- // if (wcsstr(varName.pwszVal,_T("扬声器"))!=NULL)
- {
- hr=pDevice->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_ALL,NULL,(void **)(&pVolumeAPI));
- if (hr==S_OK)
- {
-
- UINT chanelCount = 0;
- hr =pVolumeAPI->GetChannelCount(&chanelCount);
- for (int i=0;i<chanelCount;i++)
- {
- float fVolumeTemp;
- pVolumeAPI->GetMasterVolumeLevelScalar(&fVolumeTemp);
- if(fabsf(fVolumeTemp -0) > 0.00001)
- fVolume = 100 * fVolumeTemp + 0.5;
- }
- SAFE_RELEASE(pVolumeAPI);
- }
- }
- }
- SAFE_RELEASE(pProperties);
- }
- SAFE_RELEASE(pDevice);
- }
- }
- releasepCollection:
- SAFE_RELEASE(pCollection);
- releasepEnumerator:
- SAFE_RELEASE(pEnumerator);
- return 0;
- }
- bool MixerWrap::SetSpeakerValue_W7(float fVolume) //设置喇叭音量
- {
- IMMDeviceEnumerator* pEnumerator;
- IMMDeviceCollection *pCollection = NULL;
- IMMDevice *pDevice=NULL;
- IPropertyStore *pProperties=NULL;
- IAudioEndpointVolume *pVolumeAPI=NULL;
- IAudioAutoGainControl* pAutoGain=NULL;
- GUID m_guidMyContext;
- UINT deviceCount = 0;
- CoInitializeEx(NULL, COINIT_MULTITHREADED);
- HRESULT hr=CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL,CLSCTX_ALL, __uuidof(IMMDeviceEnumerator),(void**)&pEnumerator);
- if (hr != S_OK)
- {
- printf("CoCreateInstance Failed!/n");
- return 0;
- }
- hr = pEnumerator->EnumAudioEndpoints(/*eCapture*/ eRender, DEVICE_STATE_ACTIVE, &pCollection);
- //hr = pEnumerator->EnumAudioEndpoints( eRender , DEVICE_STATEMASK_ALL , &pCollection );
- if (hr != S_OK)
- {
- printf("EnumAudioEndpoints Failed!/n");
- goto releasepEnumerator;
- }
- hr = pCollection->GetCount(&deviceCount);
- if (hr != S_OK)
- {
- printf("GetCount Failed!/n");
- goto releasepCollection;
- }
- for (UINT dev=0;dev<deviceCount;dev++)
- {
- pDevice = NULL;
- hr = pCollection->Item(dev,&pDevice);
- if (hr == S_OK)
- {
- hr = pDevice->OpenPropertyStore(STGM_READ,&pProperties);
- if (hr == S_OK)
- {
- PROPVARIANT varName;
- PropVariantInit(&varName);
- hr = pProperties->GetValue(PKEY_Device_FriendlyName, &varName);
- if (hr == S_OK )
- {
- //::MessageBox(NULL,varName.pwszVal,_T("提示信息"),MB_OK | MB_ICONINFORMATION);
- // if (wcsstr(varName.pwszVal,_T("扬声器"))!=NULL)
- {
- //hr=pDevice->Activate(__uuidof(IAudioAutoGainControl),CLSCTX_ALL,NULL,(void **)(&pAutoGain));
- hr=pDevice->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_ALL,NULL,(void **)(&pVolumeAPI));
- if (hr==S_OK)
- {
- UINT chanelCount = 0;
- hr =pVolumeAPI->GetChannelCount(&chanelCount);
- for (int i=0;i<chanelCount;i++)
- {
- if((int)fVolume < 0)
- fVolume = 0;
- if((int)fVolume > MAX_VOL)
- fVolume = MAX_VOL;
- pVolumeAPI->SetMasterVolumeLevelScalar((float)fVolume / MAX_VOL, &m_guidMyContext);
- }
- SAFE_RELEASE(pVolumeAPI);
- }
- }
- }
- SAFE_RELEASE(pProperties);
- }
- SAFE_RELEASE(pDevice);
- }
- }
- releasepCollection:
- SAFE_RELEASE(pCollection);
- releasepEnumerator:
- SAFE_RELEASE(pEnumerator);
- return 0;
- }
- bool MixerWrap::MutSpeaker_W7(bool bMute,float fVolume)
- {
- //::MessageBox(NULL,_T("MutSpeaker_W7"),_T("提示信息"),MB_OK | MB_ICONINFORMATION);
- IMMDeviceEnumerator* pEnumerator;
- IMMDeviceCollection *pCollection = NULL;
- IMMDevice *pDevice=NULL;
- IPropertyStore *pProperties=NULL;
- IAudioEndpointVolume *pVolumeAPI=NULL;
- IAudioAutoGainControl* pAutoGain=NULL;
- UINT deviceCount = 0;
- CoInitializeEx(NULL, COINIT_MULTITHREADED);
- HRESULT hr=CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL,CLSCTX_ALL, __uuidof(IMMDeviceEnumerator),(void**)&pEnumerator);
- if (hr != S_OK)
- {
- printf("CoCreateInstance Failed!/n");
- return 0;
- }
- hr = pEnumerator->EnumAudioEndpoints(/*eCapture*/ eRender, DEVICE_STATE_ACTIVE, &pCollection);
- //hr = pEnumerator->EnumAudioEndpoints( eRender , DEVICE_STATEMASK_ALL , &pCollection );
- if (hr != S_OK)
- {
- printf("EnumAudioEndpoints Failed!/n");
- goto releasepEnumerator;
- }
- hr = pCollection->GetCount(&deviceCount);
- if (hr != S_OK)
- {
- printf("GetCount Failed!/n");
- goto releasepCollection;
- }
-
- for (UINT dev=0;dev<deviceCount;dev++)
- {
- pDevice = NULL;
- hr = pCollection->Item(dev,&pDevice);
- if (hr == S_OK)
- {
- hr = pDevice->OpenPropertyStore(STGM_READ,&pProperties);
-
- if (hr == S_OK)
- {
- PROPVARIANT varName;
- PropVariantInit(&varName);
- hr = pProperties->GetValue(PKEY_Device_FriendlyName, &varName);
- /* char temp[20];
- sprintf_s(temp,"%d\0",hr);
- _bstr_t strStr = temp;
- LPCSTR lpctStrName = strStr;
- ::MessageBox(NULL,(LPCWSTR)lpctStrName,_T("提示信息"),MB_OK | MB_ICONINFORMATION);*/
-
- if (hr == S_OK )
- {
- //::MessageBox(NULL,varName.pwszVal,_T("提示信息"),MB_OK | MB_ICONINFORMATION);
-
- if (wcsstr(varName.pwszVal,L"扬声器")!=NULL)
- {
- //hr=pDevice->Activate(__uuidof(IAudioAutoGainControl),CLSCTX_ALL,NULL,(void **)(&pAutoGain));
- hr=pDevice->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_ALL,NULL,(void **)(&pVolumeAPI));
- if (hr==S_OK)
- {
-
- UINT chanelCount = 0;
- hr =pVolumeAPI->GetChannelCount(&chanelCount);
- for (int i=0;i<chanelCount;i++)
- {
- float fLevel =0;
- float minLevel =0;
- float maxLevel =0;
- float stepLevel =0;
- pVolumeAPI->GetVolumeRange(&minLevel,&maxLevel,&stepLevel);
- float fVolumeTemp;
- pVolumeAPI->GetMasterVolumeLevelScalar(&fVolumeTemp);
- if(fVolume != NULL)
- fVolume = 100 * fVolumeTemp + 0.5;
-
- pVolumeAPI->SetChannelVolumeLevelScalar(i,fVolume,NULL);
- int test=55;
- }
- hr = pVolumeAPI->SetMute(bMute,NULL);
- SAFE_RELEASE(pVolumeAPI);
- }
- }
- }
- SAFE_RELEASE(pProperties);
- }
- SAFE_RELEASE(pDevice);
- }
- }
- releasepCollection:
- SAFE_RELEASE(pCollection);
- releasepEnumerator:
- SAFE_RELEASE(pEnumerator);
- return 0;
- }
- int MixerWrap::GetMicphone_W7(DWORD &pdwVolume)
- {
- IMMDeviceEnumerator* pEnumerator;
- IMMDeviceCollection *pCollection = NULL;
- IMMDevice *pDevice=NULL;
- IPropertyStore *pProperties=NULL;
- IAudioEndpointVolume *pVolumeAPI=NULL;
- UINT deviceCount = 0;
- CoInitializeEx(NULL, COINIT_MULTITHREADED);
- HRESULT hr=CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL,CLSCTX_ALL, __uuidof(IMMDeviceEnumerator),(void**)&pEnumerator);
- if (hr != S_OK)
- {
- //printf("CoCreateInstance Failed!/n");
- return 0;
- }
- hr = pEnumerator->EnumAudioEndpoints(eCapture /*eRender*/, DEVICE_STATE_ACTIVE, &pCollection);
- //hr = pEnumerator->EnumAudioEndpoints( eRender , DEVICE_STATEMASK_ALL , &pCollection );
- if (hr != S_OK)
- {
- // printf("EnumAudioEndpoints Failed!/n");
- goto releasepEnumerator;
- }
- //::MessageBox(NULL,_T("MicphoneMut_W7"),_T("提示信息"),MB_OK | MB_ICONINFORMATION);
- hr = pCollection->GetCount(&deviceCount);
- if (hr != S_OK)
- {
- //printf("GetCount Failed!/n");
- goto releasepCollection;
- }
- for (UINT dev=0;dev<deviceCount;dev++)
- {
- pDevice = NULL;
- hr = pCollection->Item(dev,&pDevice);
- if (hr == S_OK)
- {
- hr = pDevice->OpenPropertyStore(STGM_READ,&pProperties);
- if (hr == S_OK)
- {
- PROPVARIANT varName;
- PropVariantInit(&varName);
- //hr = pProperties->GetValue(PKEY_Device_BusTypeGuid, &varName);
- hr = pProperties->GetValue(PKEY_Device_FriendlyName, &varName);
-
- if (hr == S_OK )
- {
- if (wcsstr(varName.pwszVal,L"麦克风")!=NULL)
- {
- hr=pDevice->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_ALL,NULL,(void **)(&pVolumeAPI));
- if (hr==S_OK)
- {
- float fVolume;
- pVolumeAPI->GetMasterVolumeLevelScalar(&fVolume);
- pdwVolume = 100 * fVolume + 0.5;
- SAFE_RELEASE(pVolumeAPI);
- }
- }
- }
- SAFE_RELEASE(pProperties);
- }
- SAFE_RELEASE(pDevice);
- }
- }
- releasepCollection:
- SAFE_RELEASE(pCollection);
- releasepEnumerator:
- SAFE_RELEASE(pEnumerator);
- return 0;
- }
- bool MixerWrap::MicphoneMut_W7(bool bMute,float fVolume)
- {
- IMMDeviceEnumerator* pEnumerator;
- IMMDeviceCollection *pCollection = NULL;
- IMMDevice *pDevice=NULL;
- IPropertyStore *pProperties=NULL;
- IAudioEndpointVolume *pVolumeAPI=NULL;
- UINT deviceCount = 0;
- GUID m_guidMyContext;
- CoInitializeEx(NULL, COINIT_MULTITHREADED);
- HRESULT hr=CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL,CLSCTX_ALL, __uuidof(IMMDeviceEnumerator),(void**)&pEnumerator);
- if (hr != S_OK)
- {
- //printf("CoCreateInstance Failed!/n");
- return 0;
- }
- hr = pEnumerator->EnumAudioEndpoints(eCapture /*eRender*/, DEVICE_STATE_ACTIVE, &pCollection);
- //hr = pEnumerator->EnumAudioEndpoints( eRender , DEVICE_STATEMASK_ALL , &pCollection );
- if (hr != S_OK)
- {
- // printf("EnumAudioEndpoints Failed!/n");
- goto releasepEnumerator;
- }
- //::MessageBox(NULL,_T("MicphoneMut_W7"),_T("提示信息"),MB_OK | MB_ICONINFORMATION);
- hr = pCollection->GetCount(&deviceCount);
- if (hr != S_OK)
- {
- //printf("GetCount Failed!/n");
- goto releasepCollection;
- }
- for (UINT dev=0;dev<deviceCount;dev++)
- {
- pDevice = NULL;
- hr = pCollection->Item(dev,&pDevice);
- if (hr == S_OK)
- {
- hr = pDevice->OpenPropertyStore(STGM_READ,&pProperties);
- if (hr == S_OK)
- {
- PROPVARIANT varName;
- PropVariantInit(&varName);
- //hr = pProperties->GetValue(PKEY_Device_BusTypeGuid, &varName);
- hr = pProperties->GetValue(PKEY_Device_FriendlyName, &varName);
-
- if (hr == S_OK )
- {
- //if (wcsstr(varName.pwszVal,_T("Line In"))!=NULL)
- //if (wcsstr(varName.pwszVal,_T("线路输入"))!=NULL)
- //::MessageBox(NULL,varName.pwszVal,_T("提示信息"),MB_OK | MB_ICONINFORMATION);
- if (wcsstr(varName.pwszVal,L"麦克风")!=NULL)
- {
- hr=pDevice->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_ALL,NULL,(void **)(&pVolumeAPI));
- if (hr==S_OK)
- {
- hr = pVolumeAPI->SetMute(bMute,NULL);
- // hr = pVolumeAPI->SetChannelVolumeLevelScalar(0,fVolume,NULL);
- pVolumeAPI->SetMasterVolumeLevelScalar((float)fVolume / 100,&m_guidMyContext);
- SAFE_RELEASE(pVolumeAPI);
- }
- }
- }
- SAFE_RELEASE(pProperties);
- }
- SAFE_RELEASE(pDevice);
- }
- }
- releasepCollection:
- SAFE_RELEASE(pCollection);
- releasepEnumerator:
- SAFE_RELEASE(pEnumerator);
- return 0;
- }
- int MixerWrap::SelectRecordIn(DWORD dwSrcType)
- {
- try{
- HMIXER m_hmx; //混音器设备句柄
- MMRESULT mmr = mixerOpen(&m_hmx, 1, 0, 0L, MIXER_OBJECTF_MIXER);
- MIXERLINE mxl;
- mxl.cbStruct = sizeof(mxl);
- mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
- mixerGetLineInfo((HMIXEROBJ)m_hmx, &mxl,MIXER_GETLINEINFOF_COMPONENTTYPE);
- LPMIXERCONTROL pmxctrl ;
- DWORD cbmxctrls = sizeof(*pmxctrl) * (UINT)mxl.cControls;
- pmxctrl = (LPMIXERCONTROL)LocalAlloc(LPTR, cbmxctrls);
- MIXERLINECONTROLS mxlctrl={sizeof(mxlctrl),mxl.dwLineID,0,mxl.cControls,sizeof(MIXERCONTROL),pmxctrl};
- mixerGetLineControls((HMIXEROBJ)m_hmx, &mxlctrl,MIXER_GETLINECONTROLSF_ALL);
-
- DWORD i;
- for(i=0; i < mxl.cControls; i++)
- if (MIXERCONTROL_CT_CLASS_LIST == (pmxctrl[i].dwControlType&MIXERCONTROL_CT_CLASS_MASK))
- break;
- wchar_t temp[50];
- swprintf(temp,L"mxl.cControls:%d ",mxl.cControls);
- _bstr_t strStr = temp;
- // ::MessageBox(NULL,(LPCWSTR)strStr,_T("提示信息"),MB_OK | MB_ICONINFORMATION);
- if (i < mxl.cControls)
- {
- BOOL bOneItemOnly = FALSE;
- switch (pmxctrl[i].dwControlType)
- {
- case MIXERCONTROL_CONTROLTYPE_MUX:
- case MIXERCONTROL_CONTROLTYPE_SINGLESELECT:
- bOneItemOnly = TRUE;
- }
- DWORD cChannels = mxl.cChannels, cMultipleItems = 0;
- if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl[i].fdwControl)
- cChannels = 1;
- if (MIXERCONTROL_CONTROLF_MULTIPLE & pmxctrl[i].fdwControl)
- cMultipleItems = pmxctrl[i].cMultipleItems;
- // Get the text description of each item
- LPMIXERCONTROLDETAILS_LISTTEXT plisttext =(LPMIXERCONTROLDETAILS_LISTTEXT)
- malloc(cChannels * cMultipleItems * sizeof(MIXERCONTROLDETAILS_LISTTEXT));
- MIXERCONTROLDETAILS mxcd = {sizeof(mxcd), pmxctrl[i].dwControlID,cChannels,(HWND)cMultipleItems, sizeof(MIXERCONTROLDETAILS_LISTTEXT),(LPVOID) plisttext};
- mixerGetControlDetails((HMIXEROBJ)m_hmx, &mxcd,MIXER_GETCONTROLDETAILSF_LISTTEXT);
- LPMIXERCONTROLDETAILS_BOOLEAN plistbool =(LPMIXERCONTROLDETAILS_BOOLEAN)
- malloc(cChannels * cMultipleItems * sizeof(MIXERCONTROLDETAILS_BOOLEAN));
- mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
- mxcd.paDetails = plistbool;
- mixerGetControlDetails((HMIXEROBJ)m_hmx, &mxcd,MIXER_GETCONTROLDETAILSF_VALUE);
- wchar_t temp[50];
- swprintf(temp,L"cMultipleItems:%d ",cMultipleItems);
- _bstr_t strStr = temp;
- // ::MessageBox(NULL,(LPCWSTR)strStr,_T("提示信息"),MB_OK | MB_ICONINFORMATION);
- for (DWORD j=0; j <cMultipleItems; j = j + cChannels)
- {
- wchar_t temp[50];
- swprintf(temp,L"Name:%s,P1:%d P2:%d,Type:%d",plisttext[j].szName,plisttext[j].dwParam1,plisttext[j].dwParam2,dwSrcType);
- _bstr_t strStr = temp;
- // ::MessageBox(NULL,(LPCWSTR)strStr,_T("提示信息"),MB_OK | MB_ICONINFORMATION);
- if (plisttext[j].dwParam2==dwSrcType||plisttext[j].dwParam1==dwSrcType)
- {
- plistbool[j].fValue = plistbool[j+ cChannels - 1].fValue = 1;
- }
- else if (bOneItemOnly)
- plistbool[j].fValue = plistbool[j+ cChannels - 1].fValue = 0;
- }
- mixerSetControlDetails((HMIXEROBJ)m_hmx, &mxcd,MIXER_GETCONTROLDETAILSF_VALUE);
- // free(pmxctrl);
- free(plisttext);
- free(plistbool);
- }
- else
- free(pmxctrl);
- return TRUE;
- }
- catch(...)
- {
- return FALSE;
- }
- }
- int MixerWrap::SelectRecordInByName(TCHAR* szSrcName)
- {
- try{
- HMIXER m_hmx; //混音器设备句柄
- MMRESULT mmr = mixerOpen(&m_hmx, 1, 0, 0L, MIXER_OBJECTF_MIXER);
- MIXERLINE mxl;
- mxl.cbStruct = sizeof(mxl);
- mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
- mixerGetLineInfo((HMIXEROBJ)m_hmx, &mxl,MIXER_GETLINEINFOF_COMPONENTTYPE);
- LPMIXERCONTROL pmxctrl ;
- DWORD cbmxctrls = sizeof(*pmxctrl) * (UINT)mxl.cControls;
- pmxctrl = (LPMIXERCONTROL)LocalAlloc(LPTR, cbmxctrls);
- MIXERLINECONTROLS mxlctrl={sizeof(mxlctrl),mxl.dwLineID,0,mxl.cControls,sizeof(MIXERCONTROL),pmxctrl};
- mixerGetLineControls((HMIXEROBJ)m_hmx, &mxlctrl,MIXER_GETLINECONTROLSF_ALL);
- DWORD i;
- for(i=0; i < mxl.cControls; i++)
- if (MIXERCONTROL_CT_CLASS_LIST == (pmxctrl[i].dwControlType&MIXERCONTROL_CT_CLASS_MASK))
- break;
- wchar_t temp[50];
- swprintf(temp,L"mxl.cControls:%d ",mxl.cControls);
- _bstr_t strStr = temp;
- // ::MessageBox(NULL,(LPCWSTR)strStr,_T("提示信息"),MB_OK | MB_ICONINFORMATION);
- if (i < mxl.cControls)
- {
- BOOL bOneItemOnly = FALSE;
- switch (pmxctrl[i].dwControlType)
- {
- case MIXERCONTROL_CONTROLTYPE_MUX:
- case MIXERCONTROL_CONTROLTYPE_SINGLESELECT:
- bOneItemOnly = TRUE;
- }
- DWORD cChannels = mxl.cChannels, cMultipleItems = 0;
- if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl[i].fdwControl)
- cChannels = 1;
- if (MIXERCONTROL_CONTROLF_MULTIPLE & pmxctrl[i].fdwControl)
- cMultipleItems = pmxctrl[i].cMultipleItems;
- // Get the text description of each item
- LPMIXERCONTROLDETAILS_LISTTEXT plisttext =(LPMIXERCONTROLDETAILS_LISTTEXT)
- malloc(cChannels * cMultipleItems * sizeof(MIXERCONTROLDETAILS_LISTTEXT));
- MIXERCONTROLDETAILS mxcd = {sizeof(mxcd), pmxctrl[i].dwControlID,cChannels,(HWND)cMultipleItems, sizeof(MIXERCONTROLDETAILS_LISTTEXT),(LPVOID) plisttext};
- mixerGetControlDetails((HMIXEROBJ)m_hmx, &mxcd,MIXER_GETCONTROLDETAILSF_LISTTEXT);
- LPMIXERCONTROLDETAILS_BOOLEAN plistbool =(LPMIXERCONTROLDETAILS_BOOLEAN)
- malloc(cChannels * cMultipleItems * sizeof(MIXERCONTROLDETAILS_BOOLEAN));
- mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
- mxcd.paDetails = plistbool;
- mixerGetControlDetails((HMIXEROBJ)m_hmx, &mxcd,MIXER_GETCONTROLDETAILSF_VALUE);
- wchar_t temp[50];
- swprintf(temp,L"cMultipleItems:%d ",cMultipleItems);
- _bstr_t strStr = temp;
- // ::MessageBox(NULL,(LPCWSTR)strStr,_T("提示信息"),MB_OK | MB_ICONINFORMATION);
- for (DWORD j=0; j <cMultipleItems; j = j + cChannels)
- {
- wchar_t temp[50];
- swprintf(temp,L"Name:%s,P1:%d P2:%d,Type:%s",plisttext[j].szName,plisttext[j].dwParam1,plisttext[j].dwParam2,szSrcName);
- _bstr_t strStr = temp;
- // ::MessageBox(NULL,(LPCWSTR)strStr,_T("提示信息"),MB_OK | MB_ICONINFORMATION);
- /*if (plisttext[j].dwParam2==dwSrcType||plisttext[j].dwParam1==dwSrcType)
- {
- plistbool[j].fValue = plistbool[j+ cChannels - 1].fValue = 1;
- }
- else if (bOneItemOnly)
- plistbool[j].fValue = plistbool[j+ cChannels - 1].fValue = 0; */
- if (_tcsstr(plisttext[j].szName,szSrcName)!=NULL )
- {
- plistbool[j].fValue = plistbool[j+ cChannels - 1].fValue = 1;
- }
- else if (bOneItemOnly)
- plistbool[j].fValue = plistbool[j+ cChannels - 1].fValue = 0;
-
- }
- mixerSetControlDetails((HMIXEROBJ)m_hmx, &mxcd,MIXER_GETCONTROLDETAILSF_VALUE);
- // free(pmxctrl);
- free(plisttext);
- free(plistbool);
- }
- else
- free(pmxctrl);
- return TRUE;
- }
- catch(...)
- {
- return FALSE;
- }
- }
|