⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jvoipmixerstatus.cpp

📁 使用VOIP进行网络传输声音的类库
💻 CPP
字号:
/*    This file is a part of JVOIPLIB, a library designed to facilitate    the use of Voice over IP (VoIP).    Copyright (C) 2000-2004  Jori Liesenborgs (jori@lumumba.luc.ac.be)    This library (JVOIPLIB) is based upon work done for my thesis at    the School for Knowledge Technology (Belgium/The Netherlands)    The full GNU Library General Public License can be found in the    file LICENSE.LGPL which is included in the source code archive.    This library is free software; you can redistribute it and/or    modify it under the terms of the GNU Library General Public    License as published by the Free Software Foundation; either    version 2 of the License, or (at your option) any later version.    This library is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    Library General Public License for more details.    You should have received a copy of the GNU Library General Public    License along with this library; if not, write to the Free    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307    USA*/#include "jvoipconfig.h"#include "jvoipmixerstatus.h"#include <stdlib.h>#include "debugnew.h"JVOIPMixerStatus::JVOIPMixerStatus(){	opened = false;	loaded = false;}JVOIPMixerStatus::~JVOIPMixerStatus(){	CloseMixer();	}int JVOIPMixerStatus::OpenMixer(){	if (opened)		return -1;	res = mixerOpen(&hmix,0,0,0,MIXER_OBJECTF_MIXER);	if (res != MMSYSERR_NOERROR)		return -1;	res = mixerGetID((HMIXEROBJ)hmix,&mixid,MIXER_OBJECTF_HMIXER);	if (res != MMSYSERR_NOERROR)		return -1;		opened = true;	loaded = false;	numControlIDs = 0;		return 0;}int JVOIPMixerStatus::LoadStatus(){	unsigned int i,j,k,num;	MIXERLINE mixline;	MIXERCAPS mixercaps;	MIXERLINECONTROLS mixlinectrl;	unsigned int LineIDs[MIXSTAT_MAXNUM];	unsigned int numControls[MIXSTAT_MAXNUM];	int numlineids;	if (!opened)		return -1;		Clear();	numlineids = 0;	res = mixerGetDevCaps(mixid,&mixercaps,sizeof(MIXERCAPS));	if (res != MMSYSERR_NOERROR)		return -1;		for (i = 0 ; i < mixercaps.cDestinations ; i++)	{		mixline.cbStruct = sizeof(MIXERLINE);		mixline.dwDestination = i;		res = mixerGetLineInfo((HMIXEROBJ)hmix,&mixline,MIXER_GETLINEINFOF_DESTINATION);		if (res == MMSYSERR_NOERROR)		{			LineIDs[numlineids] = mixline.dwLineID;			numControls[numlineids] = mixline.cControls;			numlineids++;			num = mixline.cConnections;			for (k = 0 ; k < num ; k++)			{				mixline.cbStruct = sizeof(MIXERLINE);				mixline.dwDestination = i;				mixline.dwSource = k;								res = mixerGetLineInfo((HMIXEROBJ)hmix,&mixline,MIXER_GETLINEINFOF_SOURCE);				if (res == MMSYSERR_NOERROR)				{					LineIDs[numlineids] = mixline.dwLineID;					numControls[numlineids] = mixline.cControls;					numlineids++;				}			}		}	}	for (i = 0 ; i < (unsigned int)numlineids ; i++)	{		int end;		mixlinectrl.cbStruct = sizeof(MIXERLINECONTROLS);		mixlinectrl.cControls = numControls[i];		mixlinectrl.dwLineID = LineIDs[i];		mixlinectrl.pamxctrl = mixctrl+numControlIDs;		mixlinectrl.cbmxctrl = sizeof(MIXERCONTROL);		res = mixerGetLineControls((HMIXEROBJ)hmix,&mixlinectrl,MIXER_GETLINECONTROLSF_ALL);		if (res == MMSYSERR_NOERROR)		{			end = numControlIDs + numControls[i];			for (j = numControlIDs ; j < (unsigned int)end ; j++)				GetControlDetails(j);			numControlIDs = end;		}	}	loaded = true;	return 0;}int JVOIPMixerStatus::RestoreStatus(){	int pos;	unsigned int i;	if (!opened)		return -1;	if (!loaded)		return -1;	for (pos = 0 ; pos < numControlIDs ; pos++)	{		MIXERCONTROLDETAILS mixdet;		MIXERCONTROLDETAILS_BOOLEAN mcdb[32];		MIXERCONTROLDETAILS_SIGNED mcds[32];		MIXERCONTROLDETAILS_UNSIGNED mcdu[32];		unsigned int num;		int size;		int type;				switch(mixctrl[pos].dwControlType)		{		case MIXERCONTROL_CONTROLTYPE_BOOLEANMETER:		case MIXERCONTROL_CONTROLTYPE_BOOLEAN:		case MIXERCONTROL_CONTROLTYPE_BUTTON:		case MIXERCONTROL_CONTROLTYPE_LOUDNESS:		case MIXERCONTROL_CONTROLTYPE_MONO:		case MIXERCONTROL_CONTROLTYPE_MUTE:		case MIXERCONTROL_CONTROLTYPE_ONOFF:		case MIXERCONTROL_CONTROLTYPE_STEREOENH:		case MIXERCONTROL_CONTROLTYPE_MIXER:		case MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT:		case MIXERCONTROL_CONTROLTYPE_MUX:		case MIXERCONTROL_CONTROLTYPE_SINGLESELECT:			size = sizeof(MIXERCONTROLDETAILS_BOOLEAN);			type = 1;			break;		case MIXERCONTROL_CONTROLTYPE_PEAKMETER:		case MIXERCONTROL_CONTROLTYPE_SIGNEDMETER:		case MIXERCONTROL_CONTROLTYPE_SIGNED:		case MIXERCONTROL_CONTROLTYPE_DECIBELS:		case MIXERCONTROL_CONTROLTYPE_PAN:		case MIXERCONTROL_CONTROLTYPE_QSOUNDPAN:		case MIXERCONTROL_CONTROLTYPE_SLIDER:			size = sizeof(MIXERCONTROLDETAILS_SIGNED);			type = 2;			break;		case MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER:		case MIXERCONTROL_CONTROLTYPE_UNSIGNED:		case MIXERCONTROL_CONTROLTYPE_BASS:		case MIXERCONTROL_CONTROLTYPE_EQUALIZER:		case MIXERCONTROL_CONTROLTYPE_FADER:		case MIXERCONTROL_CONTROLTYPE_TREBLE:		case MIXERCONTROL_CONTROLTYPE_VOLUME:		case MIXERCONTROL_CONTROLTYPE_MICROTIME:		case MIXERCONTROL_CONTROLTYPE_MILLITIME:		case MIXERCONTROL_CONTROLTYPE_PERCENT:			size = sizeof(MIXERCONTROLDETAILS_UNSIGNED);			type = 3;			break;		default:			return -1;		}		num =  mixctrl[pos].cMultipleItems;		if (num == 0)			num = 1;		if (ctrldetails[pos] != NULL)		{			if (type == 1)			{				for (i = 0 ; i < num ; i++)				{					memcpy(&mcdb[i],ctrldetails[pos]+i*size,size);					if (mcdb[i].fValue == 0)						mcdb[i].fValue = 1;					else						mcdb[i].fValue = 0;				}				mixdet.cbStruct = sizeof(MIXERCONTROLDETAILS);				mixdet.dwControlID = mixctrl[pos].dwControlID;				mixdet.cChannels = 1;				mixdet.cMultipleItems = mixctrl[pos].cMultipleItems;				mixdet.cbDetails = size;				mixdet.paDetails = mcdb;								res = mixerSetControlDetails((HMIXEROBJ)hmix,&mixdet,MIXER_GETCONTROLDETAILSF_VALUE);			}			else if (type == 2)			{				for (i = 0 ; i < num ; i++)				{					memcpy(&mcds[i],ctrldetails[pos]+i*size,size);					if (mcds[i].lValue > 1000)						mcds[i].lValue -= 1000;					else						mcds[i].lValue += 1000;				}				mixdet.cbStruct = sizeof(MIXERCONTROLDETAILS);				mixdet.dwControlID = mixctrl[pos].dwControlID;				mixdet.cChannels = 1;				mixdet.cMultipleItems = mixctrl[pos].cMultipleItems;				mixdet.cbDetails = size;				mixdet.paDetails = mcds;				res = mixerSetControlDetails((HMIXEROBJ)hmix,&mixdet,MIXER_GETCONTROLDETAILSF_VALUE);			}			else			{				for (i = 0 ; i < num ; i++)				{					memcpy(&mcdu[i],ctrldetails[pos]+i*size,size);					if (mcdu[i].dwValue > 1000)						mcdu[i].dwValue -= 1000;					else						mcdu[i].dwValue += 1000;				}				mixdet.cbStruct = sizeof(MIXERCONTROLDETAILS);				mixdet.dwControlID = mixctrl[pos].dwControlID;				mixdet.cChannels = 1;				mixdet.cMultipleItems = mixctrl[pos].cMultipleItems;				mixdet.cbDetails = size;				mixdet.paDetails = mcdu;				res = mixerSetControlDetails((HMIXEROBJ)hmix,&mixdet,MIXER_GETCONTROLDETAILSF_VALUE);			}			// Now set it really OK			mixdet.cbStruct = sizeof(MIXERCONTROLDETAILS);			mixdet.dwControlID = mixctrl[pos].dwControlID;			mixdet.cChannels = 1;			mixdet.cMultipleItems = mixctrl[pos].cMultipleItems;			mixdet.cbDetails = size;			mixdet.paDetails = ctrldetails[pos];			res = mixerSetControlDetails((HMIXEROBJ)hmix,&mixdet,MIXER_GETCONTROLDETAILSF_VALUE);		}	}	return 0;}int JVOIPMixerStatus::CloseMixer(){	if (!opened)		return -1;	Clear();	mixerClose(hmix);	opened = false;	return 0;}void JVOIPMixerStatus::Clear(){	int i;	for (i = 0 ; i < numControlIDs ; i++)	{		if (ctrldetails[i] != NULL)			delete [] ctrldetails[i];	}	numControlIDs = 0;}int JVOIPMixerStatus::GetControlDetails(int pos){	MIXERCONTROLDETAILS mixdet;	int num,size;	switch(mixctrl[pos].dwControlType)	{	case MIXERCONTROL_CONTROLTYPE_BOOLEANMETER:	case MIXERCONTROL_CONTROLTYPE_BOOLEAN:	case MIXERCONTROL_CONTROLTYPE_BUTTON:	case MIXERCONTROL_CONTROLTYPE_LOUDNESS:	case MIXERCONTROL_CONTROLTYPE_MONO:	case MIXERCONTROL_CONTROLTYPE_MUTE:	case MIXERCONTROL_CONTROLTYPE_ONOFF:	case MIXERCONTROL_CONTROLTYPE_STEREOENH:	case MIXERCONTROL_CONTROLTYPE_MIXER:	case MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT:	case MIXERCONTROL_CONTROLTYPE_MUX:	case MIXERCONTROL_CONTROLTYPE_SINGLESELECT:		size = sizeof(MIXERCONTROLDETAILS_BOOLEAN);		break;	case MIXERCONTROL_CONTROLTYPE_PEAKMETER:	case MIXERCONTROL_CONTROLTYPE_SIGNEDMETER:	case MIXERCONTROL_CONTROLTYPE_SIGNED:	case MIXERCONTROL_CONTROLTYPE_DECIBELS:	case MIXERCONTROL_CONTROLTYPE_PAN:	case MIXERCONTROL_CONTROLTYPE_QSOUNDPAN:	case MIXERCONTROL_CONTROLTYPE_SLIDER:		size = sizeof(MIXERCONTROLDETAILS_SIGNED);		break;	case MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER:	case MIXERCONTROL_CONTROLTYPE_UNSIGNED:	case MIXERCONTROL_CONTROLTYPE_BASS:	case MIXERCONTROL_CONTROLTYPE_EQUALIZER:	case MIXERCONTROL_CONTROLTYPE_FADER:	case MIXERCONTROL_CONTROLTYPE_TREBLE:	case MIXERCONTROL_CONTROLTYPE_VOLUME:	case MIXERCONTROL_CONTROLTYPE_MICROTIME:	case MIXERCONTROL_CONTROLTYPE_MILLITIME:	case MIXERCONTROL_CONTROLTYPE_PERCENT:		size = sizeof(MIXERCONTROLDETAILS_UNSIGNED);		break;	default:		return -1;	}	num = mixctrl[pos].cMultipleItems;	if (num == 0)		num = 1;	ctrldetails[pos] = new unsigned char [size*num];	if (ctrldetails[pos] == NULL)		return -1;	mixdet.cbStruct = sizeof(MIXERCONTROLDETAILS);	mixdet.dwControlID = mixctrl[pos].dwControlID;	mixdet.cChannels = 1;	mixdet.cMultipleItems = mixctrl[pos].cMultipleItems;	mixdet.cbDetails = size;	mixdet.paDetails = ctrldetails[pos];	res = mixerGetControlDetails((HMIXEROBJ)hmix,&mixdet,MIXER_GETCONTROLDETAILSF_VALUE);	if (res != MMSYSERR_NOERROR)	{		delete [] ctrldetails[pos];		ctrldetails[pos] = NULL;		return -1;	}	return 0;}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -