//*******************************************************************
// 文 件 名: MtsMedia.cpp
// 功能描述: 听力题声音文件操作类头文件
// 目前支持mp3播放和录音保存成mp3文件
//
// 作 者: David
// 创建日期: 2008-9-28
//
// 修改版本 修改日期 修改人 修改内容
//*******************************************************************
//
//*******************************************************************
#include <Mmsystem.h>
#include "Record.h"
//---------------------------------------------------------------------------
#define RECORD_MODE_PLAYING _T("playing")
#define RECORD_MODE_PAUSED _T("paused")
#define RECORD_MODE_STOPPED _T("stopped")
#define RECORD_MODE_NOTREADY _T("not ready")
#define RECORD_MODE_PARKED _T("parked")
#define RECORD_MODE_OPEN _T("open")
#define RECORD_MODE_RECORDING _T("recording")
#define RECORD_MODE_SEEKING _T("seeking")
#define RECORD_PLAY _T("record_play")
#define RECORD_PLAYSYN _T("record_playsyn")
#define RECORD_RECORD _T("record_record")
//*******************************************************************
// 函数名: CRecord()
// 构造函数
//
// 参数列表:
// 无
//
// 返回值:
// 无
//*******************************************************************
TRecord::TRecord()
{
_tcscpy(m_cDeviceID, _T(""));
_tcscpy(m_cErrorMsg, _T(""));
for (int i = 0; i < (int)(sizeof(m_hPlaySyncEvents) / sizeof(HANDLE)); ++i)
{
m_hPlaySyncEvents[i] = ::CreateEvent(NULL, FALSE, FALSE, NULL);
}
}
//*******************************************************************
// 函数名: ~TRecord()
// 析构函数
//
// 参数列表:
// 无
//
// 返回值:
// 无
//*******************************************************************
TRecord::~TRecord(void)
{
}
//*******************************************************************
// 函数名: PlayStart()
// 播放声音文件
//
// 参数列表:
// [I] LPCTSTR lpPlayFile: 要播放的声音文件名称
//
// 返回值:
// BOOL: 成功返回TRUE,失败返回FALSE
//*******************************************************************
BOOL TRecord::PlayStart(LPCTSTR lpPlayFile)
{
if ((NULL == lpPlayFile) || (0 == _tcslen(lpPlayFile)))
{
// 写入错误消息
_tcscpy(m_cErrorMsg, _T("PlayStart函数参数无效"));
return FALSE;
}
// 播放文件
TCHAR cRetBuf[MAX_PATH];
TCHAR cCommand[MAX_PATH * 2];
MCIERROR mciError = 0;
if (0 == GetShortPathName(lpPlayFile, m_cDeviceID, sizeof(m_cDeviceID)))
{
// 写入错误消息
_tcscpy(m_cErrorMsg, _T("PlayStart函数中调用GetShortPathName函数错误"));
return FALSE;
}
// 停止当前的播放
_stprintf(cCommand, _T("stop %s"), RECORD_PLAY);
mciSendString(cCommand, cRetBuf, sizeof(cRetBuf), NULL);
// 关闭播放别名
_stprintf(cCommand, _T("close %s"), RECORD_PLAY);
mciSendString(cCommand, cRetBuf, sizeof(cRetBuf), NULL);
_stprintf(cCommand, _T("open %s alias %s"), m_cDeviceID, RECORD_PLAY);
mciError = mciSendString(cCommand, cRetBuf, sizeof(cRetBuf), NULL);
if (0 != mciError)
{
// 写入错误消息
mciGetErrorString(mciError, m_cErrorMsg, sizeof(m_cErrorMsg));
return FALSE;
}
_stprintf(cCommand, _T("play %s"), RECORD_PLAY);
mciError = mciSendString(cCommand, cRetBuf, sizeof(cRetBuf), NULL);
if (0 == mciError)
{
return TRUE;
}
else
{
// 写入错误消息
mciGetErrorString(mciError, m_cErrorMsg, sizeof(m_cErrorMsg));
return FALSE;
}
}
//*******************************************************************
// 函数名: PlayContinue()
// (暂停)继续播放
//
// 参数列表:
// 无
//
// 返回值:
// BOOL: 成功返回TRUE,失败返回FALSE
//*******************************************************************
BOOL TRecord::PlayContinue()
{
// 继续播放文件
TCHAR cRetBuf[MAX_PATH];
TCHAR cCommand[MAX_PATH * 2];
MCIERROR mciError = 0;
_stprintf(cCommand, _T("resume %s"), RECORD_PLAY);
mciError = mciSendString(cCommand, cRetBuf, sizeof(cRetBuf), NULL);
if (0 == mciError)
{
return TRUE;
}
else
{
// 写入错误消息
mciGetErrorString(mciError, m_cErrorMsg, sizeof(m_cErrorMsg));
return FALSE;
}
}
//*******************************************************************
// 函数名: PlayPause()
// 暂停播放
//
// 参数列表:
// 无
//
// 返回值:
// BOOL: 成功返回TRUE,失败返回FALSE
//*******************************************************************
BOOL TRecord::PlayPause()
{
// 暂停播放文件
TCHAR cRetBuf[MAX_PATH];
TCHAR cCommand[MAX_PATH * 2];
MCIERROR mciError = 0;
_stprintf(cCommand, _T("pause %s"), RECORD_PLAY);
mciError = mciSendString(cCommand, cRetBuf, sizeof(cRetBuf), NULL);
if (0 == mciError)
{
return TRUE;
}
else
{
// 写入错误消息
mciGetErrorString(mciError, m_cErrorMsg, sizeof(m_cErrorMsg));
return FALSE;
}
}
//*******************************************************************
// 函数名: PlayStop()
// 停止操作:停止播放\暂停播放mp3文件
//
// 参数列表:
// 无
//
// 返回值:
// BOOL: 成功返回TRUE,失败返回FALSE
//*******************************************************************
BOOL TRecord::PlayStop()
{
// 停止播放文件
TCHAR cRetBuf[MAX_PATH];
TCHAR cCommand[MAX_PATH * 2];
MCIERROR mciError = 0;
_stprintf(cCommand, _T("stop %s"), RECORD_PLAY);
mciError = mciSendString(cCommand, cRetBuf, sizeof(cRetBuf), NULL);
if (0 != mciError)
{
// 写入错误消息
mciGetErrorString(mciError, m_cErrorMsg, sizeof(m_cErrorMsg));
return FALSE;
}
_stprintf(cCommand, _T("close %s"), RECORD_PLAY);
mciError = mciSendString(cCommand, cRetBuf, sizeof(cRetBuf), NULL);
if (0 != mciError)
{
// 写入错误消息
mciGetErrorString(mciError, m_cErrorMsg, sizeof(m_cErrorMsg));
return FALSE;
}
return TRUE;
}
//*******************************************************************
// 函数名: GetCurFileLength()
// 获取当前播放文件的长度,可以根据这个函数返回值通过计时器对用户的
// 一些操作控制
//
// 参数列表:
// 无
//
// 返回值:
// LONG: 播放文件的长度,以播放时间计算,单位为毫秒
//*******************************************************************
LONG TRecord::GetCurFileLength()
{
return GetFileLength(m_cDeviceID);
}
//*******************************************************************
// 函数名: GetFileLength()
// 获取指定文件的长度,
//
// 参数列表:
// [I] LPCTSTR lpPlayFile:文件名
//
// 返回值:
// LONG: 播放文件的长度,以播放时间计算,单位为毫秒
// 如果函数错误,返回-1
//*******************************************************************
LONG TRecord::GetFileLength(LPCTSTR lpPlayFile)
{
if ((NULL == lpPlayFile) || (_tcslen(lpPlayFile) == 0))
{
// 写入错误消息
_tcscpy(m_cErrorMsg, _T("GetFileLength函数参数无效"));
return -1;
}
// 获取指定文件的长度
TCHAR cRetBuf[MAX_PATH];
TCHAR cCommand[MAX_PATH * 2];
TCHAR cShortPathName[MAX_PATH];
MCIERROR mciError = 0;
if (0 == GetShortPathName(lpPlayFile, cShortPathName, sizeof(cShortPathName)))
{
_tcscpy(m_cErrorMsg, _T("GetFileLength函数调用GetShortPathName函数错误!"));
return -1;
}
_stprintf(cCommand, _T("status %s length"), cShortPathName);
mciError = mciSendString(cCommand, cRetBuf, sizeof(cRetBuf), NULL);
if (0 == mciError)
{
return _ttol(cRetBuf);
}
else
{
// 写入错误消息
mciGetErrorString(mciError, m_cErrorMsg, sizeof(m_cErrorMsg));
return -1;
}
}
//*******************************************************************
// 函数名: GetCurPlayPos()
// 获取当前播放位置
//
//
// 参数列表:
// 无
//
// 返回值:
// LONG: 获取当前播放位置,以播放时间计算,单位为毫秒
//*******************************************************************
LONG TRecord::GetCurPlayPos()
{
// 获取当前播放位置
TCHAR cRetBuf[MAX_PATH];
TCHAR cCommand[MAX_PATH * 2];
MCIERROR mciError = 0;
_stprintf(cCommand, _T("status %s position"), m_cDeviceID);
mciError = mciSendString(cCommand, cRetBuf, sizeof(cRetBuf), NULL);
if (0 == mciError)
{
return _ttol(cRetBuf);
}
else
{
评论1