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

📄 px_win_wmme.c

📁 来自网络的iaxclient的协议栈源码
💻 C
📖 第 1 页 / 共 2 页
字号:
   PxInfo *info = (PxInfo *)mixer;   return 2;}const char *Px_GetOutputVolumeName( PxMixer *mixer, int i ){   PxInfo *info = (PxInfo *)mixer;      if (i==1)      return "Wave Out";   else      return "Master Volume";}PxVolume Px_GetOutputVolume( PxMixer *mixer, int i ){   PxInfo *info = (PxInfo *)mixer;   if (i==1)      return Px_GetPCMOutputVolume(mixer);   else      return Px_GetMasterVolume(mixer);}void Px_SetOutputVolume( PxMixer *mixer, int i, PxVolume volume ){   PxInfo *info = (PxInfo *)mixer;   if (i==1)      Px_SetPCMOutputVolume(mixer, volume);   else      Px_SetMasterVolume(mixer, volume);}/* Input sources*/int Px_GetNumInputSources( PxMixer *mixer ){   PxInfo *info = (PxInfo *)mixer;      return info->numInputs;}const char *Px_GetInputSourceName( PxMixer *mixer, int i){   PxInfo *info = (PxInfo *)mixer;      return info->src[i].name;}int Px_GetCurrentInputSource( PxMixer *mixer ){   PxInfo *info = (PxInfo *)mixer;   MIXERCONTROLDETAILS details;   MIXERCONTROLDETAILS_BOOLEAN flags[32];   MMRESULT result;   int i;   details.cbStruct = sizeof(MIXERCONTROLDETAILS);   details.dwControlID = info->muxID;   details.cMultipleItems = info->numInputs;   details.cChannels = 1;      details.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);   details.paDetails = (LPMIXERCONTROLDETAILS_BOOLEAN)&flags[0];   result = mixerGetControlDetails(info->hInputMixer,                                   (LPMIXERCONTROLDETAILS)&details,                                   MIXER_GETCONTROLDETAILSF_VALUE);   if (result == MMSYSERR_NOERROR) {      for(i=0; i<info->numInputs; i++)         if (flags[i].fValue)            return i;   }   return 0;}void Px_SetCurrentInputSource( PxMixer *mixer, int i ){   PxInfo *info = (PxInfo *)mixer;   MIXERCONTROLDETAILS details;   MIXERCONTROLDETAILS_BOOLEAN flags[32];   MMRESULT result;   int j;   details.cbStruct = sizeof(MIXERCONTROLDETAILS);   details.dwControlID = info->muxID;   details.cMultipleItems = info->numInputs;   details.cChannels = 1;      details.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);   details.paDetails = (LPMIXERCONTROLDETAILS_BOOLEAN)&flags[0];   for(j=0; j<info->numInputs; j++)      flags[j].fValue = (i == j);   result = mixerSetControlDetails(info->hInputMixer,                                   (LPMIXERCONTROLDETAILS)&details,                                   MIXER_SETCONTROLDETAILSF_VALUE);}/* Input volume*/PxVolume Px_GetInputVolume( PxMixer *mixer ){   PxInfo *info = (PxInfo *)mixer;   PxVolume vol;   int src = Px_GetCurrentInputSource(mixer);   vol = -1.0;   VolumeFunction(info->hInputMixer, info->src[src].controlID, &vol);   return vol;}void Px_SetInputVolume( PxMixer *mixer, PxVolume volume ){   PxInfo *info = (PxInfo *)mixer;   int src = Px_GetCurrentInputSource(mixer);   VolumeFunction(info->hInputMixer, info->src[src].controlID, &volume);}/*  Balance*/int Px_SupportsOutputBalance( PxMixer *mixer ){   return 0;}PxBalance Px_GetOutputBalance( PxMixer *mixer ){   return 0.0;}void Px_SetOutputBalance( PxMixer *mixer, PxBalance balance ){}/*  Playthrough*/int Px_SupportsPlaythrough( PxMixer *mixer ){   return 0;}PxVolume Px_GetPlaythrough( PxMixer *mixer ){   return 0.0;}void Px_SetPlaythrough( PxMixer *mixer, PxVolume volume ){}int Px_SetMicrophoneBoost( PxMixer* mixer, int enable ){	MMRESULT mmr = MMSYSERR_ERROR ;		// cast void pointer	PxInfo* info = ( PxInfo* )( mixer ) ;	if ( info == NULL ) 		return MMSYSERR_ERROR ;			//	// get line info	//		MIXERLINE mixerLine ;    mixerLine.cbStruct = sizeof( MIXERLINE ) ;    mixerLine.dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE ;		mmr = mixerGetLineInfo(		( HMIXEROBJ )( info->hInputMixer ),		&mixerLine,		MIXER_GETLINEINFOF_COMPONENTTYPE	) ;	if ( mmr != MMSYSERR_NOERROR )		return mmr ;	//	// get all controls	//	LPMIXERCONTROL mixerControl = (MIXERCONTROL *)malloc( sizeof( MIXERCONTROL ) * mixerLine.cControls ) ;		MIXERLINECONTROLS mixerLineControls ;	mixerLineControls.cbStruct = sizeof( MIXERLINECONTROLS ) ;	mixerLineControls.dwLineID = mixerLine.dwLineID ;	mixerLineControls.cControls = mixerLine.cControls ;	mixerLineControls.cbmxctrl = sizeof( MIXERCONTROL ) ;	mixerLineControls.pamxctrl = ( LPMIXERCONTROL )( mixerControl ) ;		mmr = mixerGetLineControls(		( HMIXEROBJ )( info->hInputMixer ), 		&mixerLineControls,		MIXER_GETLINECONTROLSF_ALL	) ;		if ( mmr != MMSYSERR_NOERROR )	{		free(mixerControl);		return mmr ;	}	//	// find boost control	//	DWORD boost_id = -1 ;	DWORD x = 0 ;		for ( ; x < mixerLineControls.cControls ; ++x )	{		// check control type		if ( mixerControl[x].dwControlType & MIXERCONTROL_CONTROLTYPE_BOOLEAN )		{			// normalize control name			char* name = _strupr( mixerControl[x].szName ) ;			// check for 'mic' and 'boost'			if (				( strstr( name, "MIC" ) != NULL )				&& ( strstr( name, "BOOST" ) != NULL )			)			{				boost_id = mixerControl[x].dwControlID ;				break ;			}		}	}	if ( boost_id == -1 )	{		free(mixerControl);		return MMSYSERR_ERROR ;	}	//	// get control details	//		MIXERCONTROLDETAILS_BOOLEAN value ;	MIXERCONTROLDETAILS mixerControlDetails ;	mixerControlDetails.cbStruct = sizeof( MIXERCONTROLDETAILS ) ;	mixerControlDetails.dwControlID = boost_id ;	mixerControlDetails.cChannels = 1 ;	mixerControlDetails.cMultipleItems = 0 ;	mixerControlDetails.cbDetails = sizeof( MIXERCONTROLDETAILS_BOOLEAN ) ;	mixerControlDetails.paDetails = &value ;	mmr = mixerGetControlDetails( 		( HMIXEROBJ )( info->hInputMixer ),		&mixerControlDetails,		MIXER_GETCONTROLDETAILSF_VALUE	) ;	if ( mmr != MMSYSERR_NOERROR )	{		free(mixerControl);		return mmr ;	}	//	// update value	//	value.fValue = ( enable == 0 ) ? 0L : 1L ;	//	// set control details	//		mmr = mixerSetControlDetails( 		( HMIXEROBJ )( info->hInputMixer ),		&mixerControlDetails,		MIXER_SETCONTROLDETAILSF_VALUE	) ;	free(mixerControl);	if ( mmr != MMSYSERR_NOERROR )		return mmr ;		return mmr ;}int Px_GetMicrophoneBoost( PxMixer* mixer ){	MMRESULT mmr = MMSYSERR_ERROR ;		// cast void pointer	PxInfo* info = ( PxInfo* )( mixer ) ;	if ( info == NULL ) 		return -1 ;			//	// get line info	//		MIXERLINE mixerLine ;    mixerLine.cbStruct = sizeof( MIXERLINE ) ;    mixerLine.dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE ;		mmr = mixerGetLineInfo(		( HMIXEROBJ )( info->hInputMixer ),		&mixerLine,		MIXER_GETLINEINFOF_COMPONENTTYPE	) ;	if ( mmr != MMSYSERR_NOERROR )		return -1 ;	//	// get all controls	//	LPMIXERCONTROL mixerControl = (MIXERCONTROL *)malloc( sizeof( MIXERCONTROL ) * mixerLine.cControls ) ;		MIXERLINECONTROLS mixerLineControls ;	mixerLineControls.cbStruct = sizeof( MIXERLINECONTROLS ) ;	mixerLineControls.dwLineID = mixerLine.dwLineID ;	mixerLineControls.cControls = mixerLine.cControls ;	mixerLineControls.cbmxctrl = sizeof( MIXERCONTROL ) ;	mixerLineControls.pamxctrl = ( LPMIXERCONTROL )( mixerControl ) ;		mmr = mixerGetLineControls(		( HMIXEROBJ )( info->hInputMixer ), 		&mixerLineControls,		MIXER_GETLINECONTROLSF_ALL	) ;		if ( mmr != MMSYSERR_NOERROR )	{		free(mixerControl);		return -1 ;	}	//	// find boost control	//	DWORD boost_id = -1 ;	DWORD x = 0 ;		for ( ; x < mixerLineControls.cControls ; ++x )	{		// check control type		if ( mixerControl[x].dwControlType & MIXERCONTROL_CONTROLTYPE_BOOLEAN )		{			// normalize control name			char* name = _strupr( mixerControl[x].szName ) ;			// check for 'mic' and 'boost'			if (				( strstr( name, "MIC" ) != NULL )				&& ( strstr( name, "BOOST" ) != NULL )			)			{				boost_id = mixerControl[x].dwControlID ;				break ;			}		}	}	if ( boost_id == -1 )	{		free(mixerControl);		return -1 ;	}	//	// get control details	//		MIXERCONTROLDETAILS_BOOLEAN value ;	MIXERCONTROLDETAILS mixerControlDetails ;	mixerControlDetails.cbStruct = sizeof( MIXERCONTROLDETAILS ) ;	mixerControlDetails.dwControlID = boost_id ;	mixerControlDetails.cChannels = 1 ;	mixerControlDetails.cMultipleItems = 0 ;	mixerControlDetails.cbDetails = sizeof( MIXERCONTROLDETAILS_BOOLEAN ) ;	mixerControlDetails.paDetails = &value ;	mmr = mixerGetControlDetails( 		( HMIXEROBJ )( info->hInputMixer ),		&mixerControlDetails,		MIXER_GETCONTROLDETAILSF_VALUE	) ;	free(mixerControl);	if ( mmr != MMSYSERR_NOERROR )		return -1 ;		return ( int )( value.fValue ) ;}int Px_SetCurrentInputSourceByName( PxMixer* mixer, const char* name ) {	// cast void pointer	PxInfo* info = ( PxInfo* )( mixer ) ;	// make sure we have a mixer	if ( info == NULL ) 		return MMSYSERR_ERROR ;	// make sure we have a search name	if ( name == NULL )		return MMSYSERR_ERROR ;	//	// set input source	//	int x = 0 ;	for ( ; x < info->numInputs ; ++x )	{		// compare passed name with control name		if ( strncasecmp( info->src[x].name, name, strlen( name ) ) == 0 )		{			// set input source			Px_SetCurrentInputSource( mixer, x ) ;						// make sure set'ing worked			if ( Px_GetCurrentInputSource( mixer ) == x )				return MMSYSERR_NOERROR ;			else				return MMSYSERR_ERROR ;		}	}	return MMSYSERR_ERROR ;}

⌨️ 快捷键说明

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