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; 
}