亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? chmplay.cpp

?? Windows上的MUD客戶端程序
?? CPP
?? 第 1 頁 / 共 2 頁
字號:


#if defined( CH_USE_VOXWARE )

/*----------------------------------------------------------------------------
	ChVoxwarePlayer public methods
----------------------------------------------------------------------------*/

ChSpeechPlayer::ChSpeechPlayer( DeviceType deviceType,
								bool* pboolDeviceInUseFlag ) :
					ChMediaPlayer( deviceType, pboolDeviceInUseFlag )
{
	ASSERT( devSpeech == deviceType );
}


ChSpeechPlayer::~ChSpeechPlayer()
{
}


bool ChSpeechPlayer::Play( const ChSoundInfo* pInfo )
{
	return PrepAndPlay( pInfo );
}


void ChSpeechPlayer::Stop()
{
	MSG		msg;
	bool	boolQuitMessage = false;
											/* Set the event flags to zero
												so that no notification
												occurs (since this object
												is being explicitly stopped) */
	SetEventInfo( 0 );
											// Turn off looping!
	SetLooping( false );
	SetStopped();

#if 0
											/* We need to spin a message loop
												to wait until the speech stops
												playing... */
	while (IsPlaying() && !boolQuitMessage)
	{
		if (::PeekMessage( &msg, 0, 0, 0, PM_REMOVE ))
		{
			if (WM_QUIT == msg.message)
			{
				boolQuitMessage = true;
				::PostQuitMessage( msg.wParam );
			}
			else
			{
				::DispatchMessage( &msg );
			}
		}
	}

#endif	// 0
}


/*----------------------------------------------------------------------------
	ChSpeechPlayer protected methods
----------------------------------------------------------------------------*/

bool ChSpeechPlayer::DoPlay()
{
	const char*		pstrFilename = GetSoundInfo()->GetFilename();

	SetStopped( false );

	ChTNT::PlayVoxFile( pstrFilename );
	return true;
}


#if 0

/*----------------------------------------------------------------------------
	Voxware callback function
----------------------------------------------------------------------------*/

VOXAPI_CALLBACK VoxwareCallbackFunc( unsigned short wVox,
										unsigned short wMessage,
										LPVOXWARE_DATA lpVoxwareData )
{
	ChSpeechPlayer*	pPlayer = (ChSpeechPlayer*)lpVoxwareData->dwUserData;
	bool			boolStopped = false;

	switch( wMessage )
	{
		case VOXWARE_STARTPLAY:
		{
			TRACE( "ToolVox:  Start play!\n" );
			break;
		}

		case VOXWARE_ENDPLAY:
		{
			TRACE( "ToolVox:  End play!\n" );
			pPlayer->GetNotifyWnd()->PostMessage( MSG_ON_VOX_COMPLETE );
			break;
		}

		case VOXWARE_GETINFO:
		{
			break;
		}

		case VOXWARE_PLAYBACKERROR:
		{
			TRACE( "ToolVox:  Playback error\n" );
			break;
		}

		default:
		{
			break;
		}
	}

	#if defined( CH_DEBUG )
	{
		if (pPlayer->IsStopped())
		{
			TRACE( "ToolVox:  STOPPED!\n" );
		}
	}
	#endif	// defined( CH_DEBUG )

	return pPlayer->IsStopped();
}

#endif	// 0

#endif	// defined( CH_USE_VOXWARE )


/*----------------------------------------------------------------------------
	ChMixer class
----------------------------------------------------------------------------*/

ChMixer::ChMixer( DeviceType deviceType ) :
					m_deviceType( deviceType )
{

	#if defined( CH_ARCH_32 )
	{
		m_boolUseMixerAPI = false;

		m_hWinMMLib = LoadLibrary( TEXT( "winmm.dll" ) );

		if (m_hWinMMLib)
		{									/* Get the address of all the
												procs used but not available
												under Win32s */
			pprocMixerOpen = (pprocTypeMixerOpen)
									GetProcAddress( m_hWinMMLib, "mixerOpen" );
			pprocMixerClose = (pprocTypeMixerClose)
									GetProcAddress( m_hWinMMLib, "mixerClose" );
			pprocMixerSetControlDetails = (pprocTypeMixerSetControlDetails)
									GetProcAddress( m_hWinMMLib, "mixerSetControlDetails" );
			pprocMixerGetNumDevs = (pprocTypeMixerGetNumDevs)
									GetProcAddress( m_hWinMMLib, "mixerGetNumDevs" );
			pprocMixerGetDevCaps = (pprocTypeMixerGetDevCaps)
									GetProcAddress( m_hWinMMLib, "mixerGetDevCaps" );
			pprocMixerGetLineInfo = (pprocTypeMixerGetLineInfo)
									GetProcAddress( m_hWinMMLib, "mixerGetLineInfo" );
			pprocMixerGetLineControls = (pprocTypeMixerGetLineControls)
									GetProcAddress( m_hWinMMLib, "mixerGetLineControls" );	  

			if (pprocMixerOpen && pprocMixerClose &&
				pprocMixerSetControlDetails && pprocMixerGetNumDevs &&
				pprocMixerGetLineInfo && pprocMixerGetLineControls)
			{
				m_boolUseMixerAPI = true;	
			}
		}

		if (m_boolUseMixerAPI)
		{
			MMRESULT	mmr;

			switch( deviceType )
			{
				case devMidi:
				{
					m_dwTargetComponentType = MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;
					break;
				}

				case devWave:
				case devSpeech:
				{
					m_dwTargetComponentType = MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
					break;
				}

				default:
				{
					ASSERT( false );
					break;
				}
			}

			mmr = GetMixerControl();
			if (MMSYSERR_NOERROR == mmr)
			{
				m_boolValid = true;
											// Init the details structures

			    ChMemClearStruct( &m_mixerControlDetails );
		    	memset( &m_uMixerControlDetails, 0x00,
		    			sizeof( m_uMixerControlDetails ) );

			    m_mixerControlDetails.cbStruct = sizeof( m_mixerControlDetails );
			    m_mixerControlDetails.dwControlID = m_mixerControl.dwControlID;
			    m_mixerControlDetails.cChannels = m_uiChannels;
			    m_mixerControlDetails.cbDetails = sizeof( MIXERCONTROLDETAILS_UNSIGNED );
			    m_mixerControlDetails.paDetails = &m_uMixerControlDetails[0];
			}
			else
			{
				m_boolValid = false;
			}
		}
	}
	#endif // CH_ARCH_32 
}


ChMixer::~ChMixer()
{
											/* The following 'if' statement may
												not be necessary, but we were
												getting some hangs on
												mixerClose on NT 3.51 */
	#if defined( CH_ARCH_32 )
	{
		if (m_boolUseMixerAPI)
		{
			if (ChCore::GetClientInfo()->GetPlatform() != osWinNT)
			{
				if (m_boolValid && (0 != m_hMixer) )
				{
					pprocMixerClose( m_hMixer );
				}
			}
			FreeLibrary( m_hWinMMLib );
		}
	}
	#endif // CH_ARCH_32
}  


bool ChMixer::SetVolume( chuint16 suNewVolume )
{
	#if defined( CH_ARCH_32 )

	if ( m_boolUseMixerAPI )
	{
	 	return MixerSetVolume( suNewVolume );
	}
	else

	#endif

	{
	 	return WaveSetVolume( suNewVolume );
	}
}


#if defined( CH_ARCH_32 )

bool ChMixer::MixerSetVolume( chuint16 suNewVolume )
{
	MMRESULT	mmr;
	int			iChannel;
	DWORD		dwNewVolume( suNewVolume );
											/* Make sure the mixer could be
												opened */
	if (!m_boolValid)
	{
		return false;
	}
											// Make sure the mixer is open
	ASSERT( 0 != m_hMixer );
											// Pin the volume

	if (dwNewVolume < m_mixerControl.Bounds.dwMinimum)
	{
		dwNewVolume = m_mixerControl.Bounds.dwMinimum;
	}
	else if (dwNewVolume > m_mixerControl.Bounds.dwMaximum)
	{
		dwNewVolume = m_mixerControl.Bounds.dwMaximum;
	}
											// Set the volume for all channels

	for (iChannel = 0; iChannel < (int)m_uiChannels; iChannel++)
	{
		m_uMixerControlDetails[iChannel].dwValue = dwNewVolume;
	}

	mmr = pprocMixerSetControlDetails( (HMIXEROBJ)m_hMixer, &m_mixerControlDetails,
									MIXER_SETCONTROLDETAILSF_VALUE );

	return MMSYSERR_NOERROR == mmr;
}

#endif	// defined( CH_ARCH_32 )


/*----------------------------------------------------------------------------
	ChMixer protected methods
----------------------------------------------------------------------------*/

#if defined( CH_ARCH_32 )

MMRESULT ChMixer::GetMixerControl()
{
	MMRESULT			mmr;
	UINT				uiSource;
	UINT				uiDest;
	UINT				uiMixerID;
	MIXERCAPS			mixerCaps;
	UINT				uiSrcLines;
	MIXERLINE			mixerLine;
	BOOL				boolFoundLine;
	MIXERLINECONTROLS	mixerLineControls;

    if ((MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER != m_dwTargetComponentType) &&
    	(MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT != m_dwTargetComponentType))
    {
        return MMSYSERR_INVALPARAM;
    }
											/* Check to ensure that we have
												a mixer */
    if (0 == pprocMixerGetNumDevs())
    {
        return MMSYSERR_NODRIVER;
    }
											// Take the first mixer.
    uiMixerID = 0;
	mmr = pprocMixerOpen( &m_hMixer, uiMixerID, 0, 0, 0 );
    if (MMSYSERR_NOERROR != mmr)
    {
        return mmr;
    }

	mmr = pprocMixerGetDevCaps( (UINT)m_hMixer, &mixerCaps, sizeof( mixerCaps ) );
    if (MMSYSERR_NOERROR != mmr)
    {
		pprocMixerClose( m_hMixer );
		m_hMixer = 0;
        return mmr;
    }

	mixerLine.dwComponentType = 0;
	boolFoundLine = false;
											/* Search the mixer device lines
												for the correct line */

    for (uiDest = 0; (uiDest < mixerCaps.cDestinations) && !boolFoundLine;
    		uiDest++)
    {
		ChMemClearStruct( &mixerLine );
		mixerLine.cbStruct = sizeof( mixerLine );
		mixerLine.dwDestination = uiDest;

		mmr = pprocMixerGetLineInfo( (HMIXEROBJ)m_hMixer, &mixerLine,
								MIXER_GETLINEINFOF_DESTINATION );
        if (MMSYSERR_NOERROR != mmr)
        {
            pprocMixerClose( m_hMixer );
			m_hMixer = 0;
            return mmr;
        }

        if (MIXERLINE_COMPONENTTYPE_DST_SPEAKERS == mixerLine.dwComponentType)
        {
											/* This is an audio line intended
												to drive speakers.  This is
												usually the output line of an
												audio card. */

            if (mixerLine.cChannels > maxChannels)
            {
											/* There are too many channels
												to handle.  More than 5?
												Argh! */
                pprocMixerClose( m_hMixer );
				m_hMixer = 0;

                return MMSYSERR_NOMEM;
            }
											// Save the number of channels

			m_uiChannels = mixerLine.cChannels;
			if (m_uiChannels > maxChannels)
			{								// Pin the number of channels
				m_uiChannels = maxChannels;
			}
			uiSrcLines = mixerLine.cConnections;

											/* Search for the line that matches
												the component we want to control */

            for (uiSource = 0; uiSource < uiSrcLines; uiSource++)
            {
				ChMemClearStruct( &mixerLine );
				mixerLine.cbStruct = sizeof( mixerLine );
				mixerLine.dwDestination = uiDest;
				mixerLine.dwSource = uiSource;

				mmr = pprocMixerGetLineInfo( (HMIXEROBJ)m_hMixer, &mixerLine,
										MIXER_GETLINEINFOF_SOURCE );
                if (MMSYSERR_NOERROR != mmr)
                {
                    pprocMixerClose( m_hMixer );
					m_hMixer = 0;
                    return mmr;
                }

                if (mixerLine.dwComponentType == m_dwTargetComponentType)
                {
											/* Yay!  This is the line
												connecting our device to the
												speakers. */
                    boolFoundLine = TRUE;
                    break;
                }
            }
        }
    }

    if (!boolFoundLine)
    {
        pprocMixerClose( m_hMixer );
		m_hMixer = 0;
        return MMSYSERR_NOTSUPPORTED;
    }
											// Init the MIXERCONTROL struct
    ChMemClearStruct( &mixerLineControls );
    mixerLineControls.cbStruct = sizeof( mixerLineControls );
    mixerLineControls.dwLineID = mixerLine.dwLineID;
    mixerLineControls.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
    mixerLineControls.cbmxctrl = sizeof( MIXERCONTROL );
    mixerLineControls.pamxctrl = &m_mixerControl;

	mmr = pprocMixerGetLineControls( (HMIXEROBJ)m_hMixer, &mixerLineControls,
								MIXER_GETLINECONTROLSF_ONEBYTYPE );
    if (MMSYSERR_NOERROR != mmr)
    {
        pprocMixerClose( m_hMixer );
		m_hMixer = 0;
        return mmr;
    }

    return MMSYSERR_NOERROR;
}

#endif	// defined( CH_ARCH_32 )


bool ChMixer::WaveSetVolume( chuint16 suNewVolume )
{
	int		iCount;

	switch( m_deviceType )
	{
		case devMidi:
		{
			if (iCount = midiOutGetNumDevs())
			{
				for (int iDev = 0; iDev < iCount; iDev++)
				{
					midiOutSetVolume( (HMIDIOUT)iDev, MAKELONG( suNewVolume, suNewVolume ));
				}
			}
			break;
		}

		case devWave:
		case devSpeech:
		{
			if (iCount = waveOutGetNumDevs())
			{
				for (int iDev = 0; iDev < iCount; iDev++)
				{
					waveOutSetVolume( (HWAVEOUT)iDev, MAKELONG( suNewVolume, suNewVolume ));
				}
			}
			break;
		}

		default:
		{
			break;
		}
	}

	return true;
}


// Local Variables: ***
// tab-width:4 ***
// End: ***

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品中文字幕在线不卡尤物 | 在线免费亚洲电影| 欧美高清在线一区二区| 大尺度一区二区| 夜夜精品浪潮av一区二区三区| 粉嫩欧美一区二区三区高清影视 | 国产精品视频麻豆| av成人老司机| 亚洲永久精品大片| 日韩一区二区电影| 国产成人精品影院| 日韩理论片在线| 欧美日韩精品一区二区三区| 日本成人在线网站| 欧美极品xxx| 欧美色国产精品| 国产精品一二三在| 成人欧美一区二区三区黑人麻豆 | 国产精品久久久久久亚洲伦| 欧美中文字幕久久| 精彩视频一区二区| 亚洲美女偷拍久久| 制服视频三区第一页精品| 久久99蜜桃精品| 亚洲青青青在线视频| 欧美一区二区三区免费大片| 国产·精品毛片| 亚洲国产成人va在线观看天堂| 日韩精品在线一区| 色婷婷综合激情| 精品一区二区三区视频| 一区二区三区欧美视频| 精品不卡在线视频| 欧亚一区二区三区| 高清av一区二区| 日本va欧美va欧美va精品| 日韩国产欧美视频| 国产精品天美传媒| 777欧美精品| 色伊人久久综合中文字幕| 久久超碰97人人做人人爱| 亚洲综合色自拍一区| 国产亚洲成年网址在线观看| 欧美日韩精品综合在线| 成人午夜av电影| 麻豆精品在线播放| 亚洲主播在线播放| 国产精品国产精品国产专区不片 | 欧美成人video| 91视频免费播放| 国产ts人妖一区二区| 青青草一区二区三区| 亚洲免费观看高清| 国产精品欧美一区喷水| 欧美一区二区三区在线观看视频 | 久久免费电影网| 91精选在线观看| 色婷婷av一区二区三区大白胸| 国产成人在线色| 日本成人在线一区| 日韩精品高清不卡| 亚洲国产美女搞黄色| 亚洲色图在线看| 国产蜜臀97一区二区三区| 欧美一级黄色大片| 欧美夫妻性生活| 5566中文字幕一区二区电影| 在线看不卡av| 99久久精品99国产精品| 国产成人亚洲综合a∨婷婷图片| 日本va欧美va精品| 日本中文字幕一区二区视频| 亚洲成年人影院| 亚洲成av人片一区二区梦乃| 亚洲另类中文字| 亚洲精品国产视频| 伊人色综合久久天天人手人婷| 亚洲视频一二区| 一区二区三区中文在线观看| 亚洲欧洲国产专区| 亚洲欧美偷拍卡通变态| 亚洲日本va午夜在线电影| 国产精品进线69影院| 国产精品国产精品国产专区不蜜| 国产精品欧美综合在线| 中文字幕日韩一区二区| 亚洲欧洲www| 一区二区三区色| 亚洲电影一级黄| 美脚の诱脚舐め脚责91| 黑人精品欧美一区二区蜜桃| 久草在线在线精品观看| 国产一区二区中文字幕| 国产成人免费xxxxxxxx| 99久久精品国产毛片| 一本大道久久a久久精二百| 色八戒一区二区三区| 精品视频1区2区3区| 欧美日本一道本在线视频| 91精品午夜视频| 久久日韩粉嫩一区二区三区| 中文字幕在线一区二区三区| 亚洲精品成人a在线观看| 亚洲国产日韩a在线播放性色| 日韩不卡一区二区三区| 国产精品主播直播| 91丝袜呻吟高潮美腿白嫩在线观看| 99re66热这里只有精品3直播| 91美女视频网站| 欧美一卡二卡在线| 久久精品男人的天堂| 中文字幕亚洲综合久久菠萝蜜| 亚洲电影第三页| 国产一区二区三区av电影| 波多野结衣中文字幕一区二区三区 | 精品久久久久久久久久久久包黑料| 久久先锋影音av| 亚洲美女屁股眼交3| 亚洲成人1区2区| 成人亚洲一区二区一| 欧美日韩国产免费一区二区 | 欧美精品久久久久久久久老牛影院 | 国产乱人伦偷精品视频免下载| 91一区一区三区| 日韩一区二区三区电影| 欧美国产禁国产网站cc| 天天影视网天天综合色在线播放| 国产精品12区| 欧美熟乱第一页| 中文字幕欧美日韩一区| 日韩精品欧美精品| av电影天堂一区二区在线| 欧美一区二区日韩一区二区| 亚洲欧美一区二区不卡| 韩国精品主播一区二区在线观看| 色欧美乱欧美15图片| 欧美成人aa大片| 亚洲h动漫在线| 97se亚洲国产综合自在线观| 欧美大黄免费观看| 亚洲一区在线观看视频| 国产精品一卡二卡在线观看| 91精品免费观看| 亚洲国产精品久久不卡毛片| 成人免费观看视频| 精品国产乱子伦一区| 日韩中文字幕亚洲一区二区va在线 | 在线视频中文字幕一区二区| 国产日本亚洲高清| 激情综合色播激情啊| 欧美日韩亚洲综合在线| 自拍偷拍亚洲激情| 不卡av电影在线播放| 久久精品夜夜夜夜久久| 老汉av免费一区二区三区| 欧美丰满美乳xxx高潮www| 亚洲一区影音先锋| 色综合色综合色综合色综合色综合| 久久久久国产精品麻豆| 国产一区在线看| 日韩亚洲电影在线| 乱中年女人伦av一区二区| 51久久夜色精品国产麻豆| 亚洲一区二区三区视频在线| 色域天天综合网| 亚洲啪啪综合av一区二区三区| 成人午夜看片网址| 国产精品久久夜| 高清成人免费视频| 亚洲国产精品ⅴa在线观看| 国产精品自拍av| 国产精品五月天| 成人av中文字幕| 亚洲伦理在线免费看| 在线精品国精品国产尤物884a| 一级特黄大欧美久久久| 91久久精品网| 亚洲6080在线| 日韩你懂的在线观看| 国产酒店精品激情| 中文字幕精品一区 | 欧美日韩一区二区三区高清| 亚洲国产一区在线观看| 欧美高清视频在线高清观看mv色露露十八| 亚洲国产精品久久艾草纯爱| 正在播放亚洲一区| 国内久久精品视频| 亚洲国产精品精华液2区45| 99r精品视频| 青青草国产成人av片免费| 精品少妇一区二区三区在线视频| 国产麻豆91精品| 亚洲欧美在线另类| 欧美视频在线观看一区| 日韩国产精品大片| 中文字幕成人在线观看| 一本在线高清不卡dvd| 午夜激情一区二区三区| 欧美变态凌虐bdsm| 96av麻豆蜜桃一区二区|