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

📄 media.cpp

📁 MDF监控源码2
💻 CPP
字号:
// Media.cpp: implementation of the CMedia class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "mdf.h"
#include "Media.h"
#include <shlwapi.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


 #define WIN32_LEAN_AND_MEAN   // Say No to MFC
 #include <windows.h>
 #include <Mmsystem.h>
#include ".\media.h"
//#include "RunTimeLog.cpp"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern CMDFApp theApp ;

//##ModelId=465286A0012A
CMedia::CMedia()
{
	m_bIsFormatSet = FALSE ;
	m_bPlay = FALSE ;
	pData = NULL ;
	m_strAddr.Empty() ;
	m_nPort = 0 ;
	m_hWnd = NULL ;
	m_nLoop = 1 ;
	char cPath[MAX_PATH];
	DWORD dwLen = GetCurrentDirectory(MAX_PATH,cPath);
	cPath[dwLen] = '\0';
	m_path.Format("%s\\",cPath);
}

//##ModelId=465286A00138
CMedia::~CMedia()
{

}

//##ModelId=465286A0011A
int CMedia::Open(CString strFileName,HWND hWnd)//打开并播放某语音
{
	CString strTip ;
	DWORD dwLen,dwCount ;
	CString strTemp ;
	char buf[10] ;

	m_hFile = CreateFile( strFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	//读文件标志
	ReadFile( m_hFile , buf, 4, &dwCount, NULL );
	buf[dwCount] = '\0' ;
	strTemp = buf ;
	SetFilePointer( m_hFile, 4, NULL, FILE_CURRENT);
	//读文件类型
	ReadFile( m_hFile , buf, 4, &dwCount, NULL );
	buf[dwCount] = '\0' ;
	strTemp += buf ;
	SetFilePointer( m_hFile, 4, NULL, FILE_CURRENT);
	//读取WAVEFORMATEX长度
	ReadFile( m_hFile , &dwLen, 4, &dwCount, NULL );
	ReadFile( m_hFile , &waveformat, dwLen, &dwCount, NULL );

	//读取data标志 
	ReadFile( m_hFile , buf, 4, &dwCount, NULL );
	buf[dwCount] = '\0' ;
	strTemp += buf ;
	if( strTemp.Find("RIFF") < 0 )
	{
		strTip.Format("异常:%s 错误文件格式,请检查是否RIFF格式",strFileName) ;
		theApp.OutPut(strTip) ;
		return -1 ;
	}
	else if( strTemp.Find("WAVE") < 0 )
	{
		strTip.Format("异常:s 错误文件类型,请检查是否WAVE文件",strFileName) ;
		theApp.OutPut(strTip) ;
		return -1 ;
	}
	else if( strTemp.Find("data") < 0 )
	{
		if( strTemp.Find("fact") > 0 )
		{
			SetFilePointer( m_hFile, 4, NULL, FILE_CURRENT);
		}
		else
		{
			strTip.Format("异常:%s 找不到data/fact字段",strFileName) ;
			theApp.OutPut(strTip) ;
			return -1 ;
		}
	}

	ReadFile( m_hFile , &dwLen, 4, &dwCount, NULL );
	dwDataLength = dwLen ;
	pData = new char[dwLen] ;
	ReadFile( m_hFile , pData, dwLen, &dwCount, NULL );


	//播放语音
	if (MMSYSERR_NOERROR  ==  waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveformat,(DWORD)hWnd,NULL,CALLBACK_WINDOW))
	{
		//AfxMessageBox("Audio output erro") ;
		
		
		return m_bPlay = TRUE;
	}else
	{
		strTip.Format("异常:%s Audio output erro",strFileName) ;
		theApp.WriteTxtLog(strTip);
		return m_bPlay = FALSE;
	}
}

//##ModelId=465286A00119
int CMedia::OnOpen()
{
	CString strTip;	

	TRACE0("程序:调用 CMedia::OnOpen() ")  ;			//%%%
	m_pWaveHdr.lpData          = (LPTSTR)pData ;
	m_pWaveHdr.dwBufferLength  = dwDataLength ;			//CMedia 成员变量
	m_pWaveHdr.dwBytesRecorded = 0 ;
	m_pWaveHdr.dwUser          = 0 ;
	m_pWaveHdr.dwFlags         = WHDR_BEGINLOOP | WHDR_ENDLOOP ;
	m_pWaveHdr.dwLoops         = (DWORD)VOICE_LOOP ;
	m_pWaveHdr.lpNext          = NULL ;
	m_pWaveHdr.reserved        = 0 ;
	
	try
	{
		if(m_bPlay == TRUE)
		{
			waveOutPrepareHeader (hWaveOut, &m_pWaveHdr, sizeof (WAVEHDR)) ;
			
			waveOutWrite (hWaveOut, &m_pWaveHdr , sizeof (WAVEHDR)) ;
			waveOutPause(hWaveOut);
			waveOutRestart(hWaveOut);
			return 0 ;
		}
		else
			return -1 ;
	}catch (_com_error e)
	{
		strTip.Format("播放声音时发生错误:%d:%s",e.Error,e.Description)	;
		theApp.WriteTxtLog(strTip);
		return -1;
	}

}

//##ModelId=465286A0010C
int CMedia::OnClose()
{
	CString strTip ;
	if (m_bPlay)
	{
		
		waveOutUnprepareHeader (hWaveOut, &m_pWaveHdr, sizeof (WAVEHDR)) ;
		waveOutClose (hWaveOut) ;
		strTip.Format("程序:电话语音播放循环 结束",m_nLoop) ;
		
	}
	m_bPlay = FALSE;
	PostMessage(m_hWnd,WM_VOICE_CLOSE,NULL,NULL);
	return 0 ;
}

//##ModelId=465286A0010B
int CMedia::Free()
{
	m_pWaveHdr.lpData          = NULL ;
	m_pWaveHdr.dwBufferLength  = 0 ;
	m_pWaveHdr.dwBytesRecorded = 0 ;
	m_pWaveHdr.dwUser          = 0 ;
	m_pWaveHdr.dwFlags         = 0 ;
	m_pWaveHdr.dwLoops         = 0 ;
	m_pWaveHdr.lpNext          = NULL ;
	m_pWaveHdr.reserved        = 0 ;
	m_bIsFormatSet = FALSE ;
	delete pData ;
	pData = NULL ;
	//TRACE0("程序:调用 CMedia::Free() ") ;
	return 0 ;
}

//##ModelId=465286A000FE
int CMedia::AddVoice(CString strFName,int nType)
{
	CString strName ;
	if( nType == VOICE_NUM ) //用于模块地址
	{
		if( strFName.GetLength() == 1 )
		{
			strName.Format("%swav\\CMFW%s.wav",m_path,strFName) ;
			AddFile(strName) ;
		}else if (strFName.GetLength() <= 2 && !strFName.IsEmpty() ) 
		{
			strName.Format("%swav\\CMFW%s.wav",m_path,strFName.Left(1)) ;
			AddFile(strName) ;
			strFName.Delete(0,1) ;
			strName.Format("%swav\\CMFW%s.wav",m_path,strFName.Left(1)) ;
			AddFile(strName) ;
		}
	}
	else
		AddFile(strFName) ;
	return 0 ;
}

//##ModelId=465286A000FC
int CMedia::StartVoice(HWND hWnd)
{
	CString strTip ;
	if( !m_bIsFormatSet )
		return -1 ;

	TRACE0("程序:CMedia::StartVoice() 启动语音播放") ;//%%%



	if (MMSYSERR_NOERROR  ==  waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveformat,(DWORD)hWnd,NULL,CALLBACK_WINDOW))
	{
		strTip= "异常:语音无法播放" ;
		//theApp.OutPut(strTip) ;
		m_bPlay = TRUE ;
		return TRUE ;
	}else
	{
		return m_bPlay = FALSE ;

	}

	//OnOpen();

	//播放语音
	return 0 ;
}

//##ModelId=465286A000FA
int CMedia::AddVoice(int nNum)//数字的语音阅读
{
	CString strName,strTemp ;
	int nTemp ;

	if( nNum < 1000 ) //暂时只播放1000以下的数据(不含1000)
	{
		if( nTemp = nNum/100 > 0 )
		{
			strName.Format( "%swav\\CMFW%d.wav", m_path,nTemp ) ;
			AddFile(strName) ;
			strTemp.Format("%swav\\CMFW100.wav",m_path) ;
			AddFile(strTemp) ;
		}
		if( (nTemp = (nNum%100)/10) > 0 )
		{
			strName.Format( "%swav\\CMFW%d.wav", m_path, nTemp ) ;
			AddFile(strName) ;
			strTemp.Format("%swav\\CMFW10.wav", m_path) ;
			AddFile(strTemp) ;
		}		
		if( (nTemp = (nNum%10)) >0 )
		{
			strName.Format( "%swav\\CMFW%d.wav", m_path, nTemp ) ;
			AddFile(strName) ;
		}
	}
	
	return 0 ;
}

//##ModelId=465286A000EB
int CMedia::AddFile(CString strPath)
{
	DWORD dwLen,dwCount ;
	CString strTemp,strTip ;

	char* pBuf ;
	char* pTemp ;
	char buf[10] ;

	try
	{
		//strTip.Format("程序:CMedia::AddFile() 添加语音文件:%s ",strPath) ; //%%%
		//TRACE0(strTip) ;
		
		if (!PathFileExists(strPath.GetBuffer()))
		{
			return -1;
		}
		
		m_hFile = CreateFile( strPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
		//读文件标志
		if(m_hFile == INVALID_HANDLE_VALUE ) 
		{
			strTip.Format("读取语音文件:%s 出错",strPath) ;	
			TRACE0(strTip) ;
			return -1 ;
		}

		ReadFile( m_hFile , buf, 4, &dwCount, NULL );
		buf[dwCount] = '\0' ;

		if ( strstr("RIFF",buf) == NULL || dwCount < 4 )
		{
			strTip.Format("%s 错误文件格式 ,请检查是否RIFF格式",strPath) ;
			TRACE0(strTip) ;
			return -1 ;
		}

		SetFilePointer( m_hFile, 4, NULL, FILE_CURRENT) ;
		//读文件类型
		ReadFile( m_hFile , buf, 4, &dwCount, NULL ) ;
		buf[dwCount] = '\0' ;
		if( strstr("WAVE",buf) == NULL || dwCount < 0 )
		{
			strTip.Format("%s 错误文件类型,请检查是否WAVE文件",strPath) ;
			TRACE0(strTip) ;
			return -1 ;
		}
		//strTemp += buf ;
		SetFilePointer( m_hFile, 4, NULL, FILE_CURRENT) ;
		//读取WAVEFORMATEX长度
		ReadFile( m_hFile , &dwLen, 4, &dwCount, NULL ) ;
		ReadFile( m_hFile , &waveformat, dwLen, &dwCount, NULL ) ;
		//读取data标志
		ReadFile( m_hFile , buf, 4, &dwCount, NULL ) ;
		buf[dwCount] = '\0' ;
		if( strstr("data",buf) == NULL ) 
		{
			if( strstr("fact",buf) == NULL )
			{
				strTip.Format("%s 找不到data/fact字段",strPath) ;
				TRACE0(strTip) ;
				return -1 ;
			}
			else
				SetFilePointer( m_hFile, 4, NULL, FILE_CURRENT) ;
		}

		if( m_bIsFormatSet != TRUE )
			m_bIsFormatSet = TRUE ;
		//读wave文件长度
		ReadFile( m_hFile , &dwLen, 4, &dwCount, NULL ) ;
		pBuf = new char[dwLen] ;
		ReadFile( m_hFile , pBuf, dwLen, &dwCount, NULL ) ;
		//设置语音缓存区
		if( pData == NULL )
		{
			dwDataLength = dwLen ;
			pData = new char[dwLen] ;
			memcpy(pData,pBuf,dwLen) ;
			delete pBuf ;
		}
		else
		{
			//dwDataLength += dwLen ;
			pTemp = pData ;
			int i = sizeof(pTemp) ;
			pData = new char[dwDataLength+dwLen] ;
			memcpy(pData,pTemp,dwDataLength) ;
			memcpy(pData+dwDataLength,pBuf,dwLen) ;
			dwDataLength += dwLen ;
			delete pTemp ;
			delete pBuf ;
		}
		CloseHandle(m_hFile) ;
		m_hFile = NULL ;
		return 0 ;
	}
	catch(_com_error e)
	{
		strTip.Format("异常:读取语音文件 %s 发生未知异常:%s",strPath, (LPCSTR)e.Description()) ;
		TRACE0(strTip) ;
		return -1 ;
	}
}

//##ModelId=465286A000EA
int CMedia::CloseVoice()
{
	TRACE0("程序:调用语音关闭函数 CMedia::CloseVoice()") ;


	if(m_bPlay)
	{
		TRACE0("程序:调用 waveOutReset() ") ;
		m_nLoop = VOICE_LOOP ;
		waveOutReset(hWaveOut) ;
	}
	return 0 ;
}

//##ModelId=465286A000DE
int CMedia::AlarmVoice()
{
	CString strTemp,strTip ;
	try
	{
		if( m_bPlay )
		{
			TRACE0("程序:语音播放中...无发AlarmVoice()!") ;
			return -1 ;
		}
		strTip = "程序:语音告警!CMedia::AlarmVoice() 调用" ; //%%%
		TRACE0(strTip) ;

		//strTemp.Format("%swav\\第.wav",m_path) ;
		//AddVoice(strTemp,VOICE_FILE) ;
		AddVoice(m_strAddr,VOICE_NUM) ;
		strTemp.Format("%swav\\号.wav",m_path) ;
		AddVoice(strTemp,VOICE_FILE) ;
		strTemp.Format("%swav\\设备.wav",m_path) ;
		AddVoice(strTemp,VOICE_FILE) ;
		strTemp.Format("%swav\\第.wav",m_path) ;
		AddVoice(strTemp,VOICE_FILE) ;
		if (m_nPort <= 16)
		{
			AddVoice(m_nPort) ;
			strTemp.Format("%swav\\列.wav",m_path) ;
			AddVoice(strTemp,VOICE_FILE) ;

		}
		else if (m_nPort > 16 && m_nPort <= 24)
		{
			AddVoice(m_nPort - 16) ;
			strTemp.Format("%swav\\外接.wav",m_path) ;
			AddVoice(strTemp,VOICE_FILE) ;

		}
		else if (m_nPort > 24 && m_nPort <= 40)
		{
			AddVoice(m_nPort - 24) ;
			strTemp.Format("%swav\\列.wav",m_path) ;
			AddVoice(strTemp,VOICE_FILE) ;
			strTemp.Format("%swav\\工频.wav",m_path) ;
			AddVoice(strTemp,VOICE_FILE) ;

		}

		strTemp.Format("%swav\\CMFWALARM.wav",m_path);
		AddVoice(strTemp,VOICE_FILE) ;
		strTemp.Format("%swav\\请速派人支援.wav",m_path);
		AddVoice(strTemp,VOICE_FILE) ;

		StartVoice(m_hWnd) ;
	}
	catch(_com_error e)
	{
		strTip.Format("异常:语音告警 发生未知异常:%s", (LPCSTR)e.Description()) ;
		theApp.WriteTxtLog(strTip) ;
		return -1 ;
	}
	return 0 ;
}

//##ModelId=465286A000DA
int CMedia::SetVoice(CString strAddr, int nPort, HWND hWnd)
{
	m_strAddr = strAddr ;
	m_nPort = nPort ;
	m_hWnd = hWnd ;
	m_nLoop = 1 ;
	return 0 ;
}

//##ModelId=465286A001C5
int CMedia::PlayWaveFile(CString strFile)
{
	if (strFile.GetLength() > 0)
		PlaySound(strFile.GetBuffer(),NULL ,SND_ASYNC | SND_FILENAME  );

	return 0;
}



⌨️ 快捷键说明

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