www.pudn.com > VirtualVCR-src-v2.6.9.zip > CAudioMixer.cpp
// AudioMixer.cpp: implementation of the AudioMixer class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "CAudioMixer.h" #include#include ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CAudioMixer::CAudioMixer(IBaseFilter *audioDevice) { audioCapDevice = NULL; if(audioDevice == NULL) return; audioCapDevice = audioDevice; } CAudioMixer::~CAudioMixer() { } double CAudioMixer::getPan(int inputIndex) { if(audioCapDevice == NULL) return 0; int counter = 0; double panLevel = 0; IAMAudioInputMixer *mixer = NULL; IPin *pP; ULONG u; IEnumPins *pins = NULL; PIN_INFO pininfo; HRESULT hr = audioCapDevice->EnumPins(&pins); pins->Reset(); while(hr == NOERROR) { hr = pins->Next(1, &pP, &u); if(hr == S_OK && pP) { hr = pP->QueryPinInfo(&pininfo); if(hr == NOERROR) { if(pininfo.dir == PINDIR_INPUT) { pP->QueryInterface(IID_IAMAudioInputMixer, (void **)&mixer); if(mixer) { if(inputIndex == counter) mixer->get_Pan(&panLevel); mixer->Release(); } counter++; } if(pininfo.pFilter) pininfo.pFilter->Release(); } pP->Release(); } } if(pins) pins->Release(); return panLevel; } int CAudioMixer::setPan(double panLevel, int inputIndex) { if(audioCapDevice == NULL) return -1; int counter = 0; IAMAudioInputMixer *mixer = NULL; IPin *pP; ULONG u; IEnumPins *pins = NULL; PIN_INFO pininfo; HRESULT hr = audioCapDevice->EnumPins(&pins); pins->Reset(); while(hr == NOERROR) { hr = pins->Next(1, &pP, &u); if(hr == S_OK && pP) { hr = pP->QueryPinInfo(&pininfo); if(hr == NOERROR) { if(pininfo.dir == PINDIR_INPUT) { pP->QueryInterface(IID_IAMAudioInputMixer, (void **)&mixer); if(mixer) { if(inputIndex == counter) mixer->put_Pan(panLevel); mixer->Release(); } counter++; } if(pininfo.pFilter) pininfo.pFilter->Release(); } pP->Release(); } } if(pins) pins->Release(); return 0; } double CAudioMixer::getLevel(int inputIndex) { if(audioCapDevice == NULL) return -1.0; int counter = 0; double inputLevel = -1.0; IAMAudioInputMixer *mixer = NULL; IPin *pP; ULONG u; IEnumPins *pins = NULL; PIN_INFO pininfo; HRESULT hr = audioCapDevice->EnumPins(&pins); pins->Reset(); while(hr == NOERROR) { hr = pins->Next(1, &pP, &u); if(hr == S_OK && pP) { hr = pP->QueryPinInfo(&pininfo); if(hr == NOERROR) { if(pininfo.dir == PINDIR_INPUT) { pP->QueryInterface(IID_IAMAudioInputMixer, (void **)&mixer); if(mixer) { if(inputIndex == counter) mixer->get_MixLevel(&inputLevel); mixer->Release(); } counter++; } if(pininfo.pFilter) pininfo.pFilter->Release(); } pP->Release(); } } if(pins) pins->Release(); return inputLevel; } int CAudioMixer::setLevel(double inputLevel, int inputIndex) { if(audioCapDevice == NULL) return -1; int counter = 0; IAMAudioInputMixer *mixer = NULL; IPin *pP; ULONG u; IEnumPins *pins = NULL; PIN_INFO pininfo; HRESULT hr = audioCapDevice->EnumPins(&pins); pins->Reset(); while(hr == NOERROR) { hr = pins->Next(1, &pP, &u); if(hr == S_OK && pP) { hr = pP->QueryPinInfo(&pininfo); if(hr == NOERROR) { if(pininfo.dir == PINDIR_INPUT) { pP->QueryInterface(IID_IAMAudioInputMixer, (void **)&mixer); if(mixer) { if(inputIndex == counter) mixer->put_MixLevel(inputLevel); mixer->Release(); } counter++; } if(pininfo.pFilter) pininfo.pFilter->Release(); } pP->Release(); } } if(pins) pins->Release(); return 0; } int CAudioMixer::getInput() { if(audioCapDevice == NULL) return -1; int inputIndex = 0; int counter = 0; IAMAudioInputMixer *mixer = NULL; IPin *pP; ULONG u; IEnumPins *pins = NULL; PIN_INFO pininfo; HRESULT hr = audioCapDevice->EnumPins(&pins); pins->Reset(); while(hr == NOERROR) { hr = pins->Next(1, &pP, &u); if(hr == S_OK && pP) { hr = pP->QueryPinInfo(&pininfo); if(hr == NOERROR) { if(pininfo.dir == PINDIR_INPUT) { BOOL mEnabled = false; pP->QueryInterface(IID_IAMAudioInputMixer, (void **)&mixer); if(mixer) { mixer->get_Enable(&mEnabled); mixer->Release(); } if(mEnabled) { inputIndex = counter; } counter++; } if(pininfo.pFilter) pininfo.pFilter->Release(); } pP->Release(); } } if(pins) pins->Release(); return inputIndex; } int CAudioMixer::setInput(int inputIndex) { if(audioCapDevice == NULL) return -1; int counter = 0; IAMAudioInputMixer *mixer = NULL; IPin *pP; ULONG u; IEnumPins *pins = NULL; PIN_INFO pininfo; HRESULT hr = audioCapDevice->EnumPins(&pins); pins->Reset(); while(hr == NOERROR) { hr = pins->Next(1, &pP, &u); if(hr == S_OK && pP) { hr = pP->QueryPinInfo(&pininfo); if(hr == NOERROR) { if(pininfo.dir == PINDIR_INPUT) { pP->QueryInterface(IID_IAMAudioInputMixer, (void **)&mixer); if(mixer) { BOOL mEnabled = false; if(inputIndex == counter) mEnabled = true; mixer->put_Enable(mEnabled); mixer->Release(); } counter++; } if(pininfo.pFilter) pininfo.pFilter->Release(); } pP->Release(); } } if(pins) pins->Release(); return 0; } int CAudioMixer::populateCombo(HWND hwndCombo) { if(audioCapDevice == NULL) return -1; SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0); char name[256]; IPin *pP; ULONG u; IEnumPins *pins = NULL; PIN_INFO pininfo; HRESULT hr = audioCapDevice->EnumPins(&pins); pins->Reset(); while(hr == NOERROR) { hr = pins->Next(1, &pP, &u); if(hr == S_OK && pP) { hr = pP->QueryPinInfo(&pininfo); if(hr == NOERROR) { if(pininfo.dir == PINDIR_INPUT) { WideCharToMultiByte(CP_ACP, 0, pininfo.achName , -1, name, 128, NULL, NULL); SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM) (LPSTR)name); } if(pininfo.pFilter) pininfo.pFilter->Release(); } pP->Release(); } } if(pins) pins->Release(); return 0; }