📄 mciclass.cpp
字号:
// MCIClass.cpp: implementation of the CMCIClass class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <math.h>
#include <mmsystem.h>
#include "MCIPlayer.h"
#include "MCIClass.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMCIClass::CMCIClass(HWND hWnd)
{
m_strMediumAlias = "";
m_hWndCallback = hWnd;
m_bMediumOpen = FALSE;
}
CMCIClass::~CMCIClass()
{
Stop();
Close();
}
LONG CMCIClass::Open(LPCSTR strMediumName,
LPCSTR strMediumType,
LPCSTR strStyle,
HWND hWnd)
{
if (IsMediumOpen())
{
Stop();
Close();
}
if (hWnd != NULL)
m_hWndCallback = hWnd;
CString strMedium = strMediumType;
CString strCmd = "open ";
if (!strMedium.CompareNoCase("cdaudio"))
{
m_strMediumAlias = strMediumType;
strCmd += strMediumType;
strCmd += " shareable";
}
else if (!strMedium.CompareNoCase("AVIVideo"))
{
m_strMediumAlias = strMediumType;
m_strMediumAlias += "_ALIAS";
strCmd += strMediumName;
strCmd += " type ";//digitalvideo";
strCmd += strMediumType;
strCmd += " alias ";
strCmd += m_strMediumAlias;
strCmd += " style ";
strCmd += strStyle;
CString strHWnd;
if (m_hWndCallback != NULL)
{
strHWnd.Format(" parent %u", m_hWndCallback);
strCmd += strHWnd;
}
}
else
{
m_strMediumAlias = strMediumType;
m_strMediumAlias += "_ALIAS";
strCmd += strMediumName;
strCmd += " type ";
strCmd += strMediumType;
strCmd += " alias ";
strCmd += m_strMediumAlias;
}
LONG lRet = Execute(strCmd);
if (lRet == 0)
m_bMediumOpen = TRUE;
return lRet;
}
LONG CMCIClass::Close()
{
m_bMediumOpen = FALSE;
CString strCmd = "close ";
strCmd += m_strMediumAlias;
return Execute(strCmd);
}
LONG CMCIClass::Play(LPCSTR strStyle, LPCSTR strFlag)
{
CString strCmd = "play ";
strCmd += m_strMediumAlias;
CString strStyle0 = strStyle;
if (!strStyle0.CompareNoCase("fullscreen") ||
!strStyle0.CompareNoCase("window"))
{
CString strPut = "put ";
strPut += m_strMediumAlias;
strPut += " source destination";
Execute(strPut);
strCmd += strStyle;
}
CString s = strFlag;
if (!s.IsEmpty())
{
strCmd += " ";
strCmd += strFlag;
}
return Execute(strCmd);
}
LONG CMCIClass::Seek(LONG lPos)
{
CString strPos;
if (lPos == 0L)
strPos = " to start";
else if (lPos == -1L)
strPos = " to end";
else
strPos.Format(" to %ld", lPos);
CString strCmd = "seek ";
strCmd += m_strMediumAlias;
strCmd += strPos;
return Execute(strCmd);
}
LONG CMCIClass::Stop()
{
CString strCmd = "stop ";
strCmd += m_strMediumAlias;
return Execute(strCmd);
}
BOOL CMCIClass::IsMediumOpen()
{
return m_bMediumOpen;
}
BOOL CMCIClass::IsMediumPresent()
{
CString strCmd = "status ";
strCmd += m_strMediumAlias;
strCmd += " media present";
char szReturn[MAX_RETURN_LENGTH];
Execute(strCmd, szReturn);
if (stricmp(szReturn, "true"))
return FALSE;
else
return TRUE;
}
LONG CMCIClass::Eject(BOOL bOpenDoor)
{
CString strOperation = bOpenDoor ?
" door open":
" door closed";
CString strCmd = "set ";
strCmd += m_strMediumAlias;
strCmd += strOperation;
return Execute(strCmd);
}
LONG CMCIClass::Execute(LPCSTR strCmd, LPSTR lpstrReturn, BOOL bShowError)
{
char szReturn[MAX_RETURN_LENGTH];
MCIERROR mciError = mciSendString(strCmd,
szReturn,
sizeof(szReturn),
m_hWndCallback);
lstrcpy(lpstrReturn, szReturn);
if (bShowError && mciError != 0)
{
mciGetErrorString(mciError, szReturn, sizeof(szReturn));
MessageBox(m_hWndCallback, szReturn, "MCI Error", MB_OK|MB_ICONWARNING);
}
return mciError;
}
LONG CMCIClass::SetTimeFormat(LPCSTR strTimeFormat)
{
CString strCmd = "set ";
strCmd += m_strMediumAlias;
strCmd += " time format ";
strCmd += strTimeFormat;
return Execute(strCmd);
}
// get the medium length in ms unit
LONG CMCIClass::GetLength()
{
CString strCmd = "status ";
strCmd += m_strMediumAlias;
strCmd += " length";
// kepp old time format
CString strTimeFormat = GetTimeFormat();
// set time format to ms
SetTimeFormat("ms");
char szReturn[MAX_RETURN_LENGTH];
Execute(strCmd, szReturn);
// restore old time format
SetTimeFormat(strTimeFormat);
return atol(szReturn);
}
LONG CMCIClass::GetTrackNum()
{
CString strCmd = "status ";
strCmd += m_strMediumAlias;
strCmd += " number of tracks";
char szReturn[MAX_RETURN_LENGTH];
Execute(strCmd, szReturn);
return atol(szReturn);
}
LONG CMCIClass::GetTrackLength(LONG lTrackNo)
{
CString strPos;
strPos.Format("%ld", lTrackNo);
CString strCmd = "status ";
strCmd += m_strMediumAlias;
strCmd += " length track " + strPos;
char szReturn[MAX_RETURN_LENGTH];
Execute(strCmd, szReturn);
return atol(szReturn);
}
CString CMCIClass::GetMode()
{
if (! IsMediumOpen())
return CString("not open");
CString strCmd = "status ";
strCmd += m_strMediumAlias;
strCmd += " mode";
char szReturn[MAX_RETURN_LENGTH];
Execute(strCmd, szReturn);
return CString(szReturn);
}
LONG CMCIClass::GetPosition(LPSTR strPos)
{
CString strCmd = "status ";
strCmd += m_strMediumAlias;
strCmd += " position";
char szReturn[MAX_RETURN_LENGTH];
Execute(strCmd, szReturn);
lstrcpy(strPos, szReturn);
return atol(szReturn);
}
LONG CMCIClass::GetStartPosition(LPSTR strPos)
{
CString strCmd = "status ";
strCmd += m_strMediumAlias;
strCmd += " start position";
char szReturn[MAX_RETURN_LENGTH];
Execute(strCmd, szReturn);
lstrcpy(strPos, szReturn);
return atol(szReturn);
}
CString CMCIClass::GetTimeFormat()
{
CString strCmd = "status ";
strCmd += m_strMediumAlias;
strCmd += " time format";
char szReturn[MAX_RETURN_LENGTH];
Execute(strCmd, szReturn);
return CString(szReturn);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -