📄 media.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=44B6F88402C1
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=44B6F88402C2
CMedia::~CMedia()
{
}
//##ModelId=44B6F88402B4
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=44B6F88402B3
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=44B6F88402B2
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=44B6F88402B1
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=44B6F88402A4
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=44B6F88402A2
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=44B6F88402A0
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=44B6F8840296
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=44B6F8840295
int CMedia::CloseVoice()
{
TRACE0("程序:调用语音关闭函数 CMedia::CloseVoice()") ;
if(m_bPlay)
{
TRACE0("程序:调用 waveOutReset() ") ;
m_nLoop = VOICE_LOOP ;
waveOutReset(hWaveOut) ;
}
return 0 ;
}
//##ModelId=44B6F8840294
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\\列.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=44B6F8840290
int CMedia::SetVoice(CString strAddr, int nPort, HWND hWnd)
{
m_strAddr = strAddr ;
m_nPort = nPort ;
m_hWnd = hWnd ;
m_nLoop = 1 ;
return 0 ;
}
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 + -