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

📄 847xxapi.cpp

📁 一个针对realmagic的播放器
💻 CPP
字号:
// 847XXAPI.cpp: implementation of the C847XXAPI class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "847XXAPI.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

DWORD WINAPI CallBack(PVOID pParam);

C847XXAPI::C847XXAPI(HINSTANCE hInstance, HWND hwnd, DWORD dwKeyColor)
{
	m_hInstance = hInstance;
	m_hwnd = hwnd;
	m_dwKeyColor = dwKeyColor;
	m_FileName[0] = '\0';

	m_VideoChoice = SET_VGA;	// SET_TV, SET_VGA
	m_pMemManager = 0;
	m_pSplitter = 0;
	m_pHardware = 0;
	
	m_dwPlayThreadId = 0;
	m_bPlay = FALSE;
}

C847XXAPI::~C847XXAPI()
{

}

//初始化
BOOL C847XXAPI::Initialize()
{
	GUID gAudioSubtype = GUID_NULL;

	if (strcmp(m_FileName, "") == 0)
		GetFileName();

	if (strcmp(m_FileName, "") == 0)
		return FALSE;

	CoCreateInstance(CLSID_RM_MPEG2_VIDEO_SUBPICTURE, 
					 NULL, 
					 CLSCTX_INPROC_SERVER, 
					 IID_IRmHardware, 
					 (void **) &m_pHardware);

	if (m_pHardware != NULL)
	{
		m_pMemManager = new MemManager(15, 1000, BUFFERSIZE);
		m_pSplitter = new Splitter(m_pMemManager);

		m_AudioSubtype.bIsAc3 = m_AudioSubtype.bIsDts = m_AudioSubtype.bIsMpeg1 = m_AudioSubtype.bIsPcm = FALSE;
		
		gAudioSubtype = IdentifyAudioSubtype(m_FileName, &m_AudioSubtype);
		m_mAudioType.SetType(&MEDIATYPE_Audio);
		m_mAudioType.SetSubtype(&gAudioSubtype);

		m_pHardware->SetTvOutput(m_VideoChoice);
		m_pHardware->SetDefaultSyncSource(TRUE);
		
		// Settings for VGA display
		if (m_VideoChoice == SET_VGA)
		{
			m_pHardware->SetVideoBrightness(500);	// Optional
			m_pHardware->SetVideoSaturation(550);	// Optional
			m_pHardware->SetVideoContrast(550);		// Optional
			m_pHardware->SetKeyColor(m_dwKeyColor);
			m_pHardware->ShowMpegWindow();
		}
		return TRUE;
	}
	else
	{
		MessageBox (m_hwnd, "Unable to initialize the hardware.", NULL, MB_OK);
		return FALSE;
	}
}

//反初始化
void C847XXAPI::Uninitialize()
{
	if (m_pSplitter) m_pSplitter->StopDemux();

	if (m_pHardware != NULL)
	{
		// Sending an empty MediaSample. 
		// This will signal the IRmHardware that it's the end of file.
		m_pHardware->Receive(MEDIASTREAM_VIDEO, EOS_PACKET);
		m_pHardware->Receive(MEDIASTREAM_AUDIO, EOS_PACKET);

		// Wait until decoder finishes all samples
		while(m_pHardware->GetState(1000) != RM_STATE_STOPPED);

		// Stop and uninitialize the decoder
		m_pHardware->Stop();
		m_pHardware->HideMpegWindow();
		m_pHardware->Release();
		m_pHardware = NULL;
	}

	if (m_pSplitter != NULL)	delete m_pSplitter;
	if (m_pMemManager != NULL)	delete m_pMemManager;

	m_pSplitter = NULL;
	m_pMemManager = NULL;
}

//播放文件
BOOL C847XXAPI::Play(char *file)
{
	if (file = NULL) return FALSE; 	
	
	strcpy(m_FileName, file);

	if (m_pHardware == NULL)
	{
		if (!Initialize())	return FALSE;
	}
	
	m_hPlayEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
	m_hPlayThread = CreateThread(NULL, 0, 
								(LPTHREAD_START_ROUTINE)::CallBack, 
								this,0, 
								&m_dwPlayThreadId);
	return TRUE;
}

//停止播放
void C847XXAPI::Stop()
{
	m_bPlay = FALSE;
	WaitForSingleObject(m_hPlayEvent, 2000);
	Uninitialize();
	OSCloseHandle(m_hPlayEvent);
}

//启动播放
void C847XXAPI::Start()
{
	FILE *m_PlayFile;
	LONG m_ulReadSize;
	CBuffer *m_pCBuffer = 0;
	int iRetMsg = 0;

	if ((m_PlayFile = fopen(m_FileName, "rb")) == NULL)
	{
		MessageBox(m_hwnd, "Unable to open file", NULL, MB_OK);
		Uninitialize();
		return;
	}

	// Check empty file
	int iFileHandle = _open(m_FileName, _O_RDONLY);
	long fl = _filelength(iFileHandle);
	_close(iFileHandle);
	if (fl == 0)
	{
		MessageBox (m_hwnd, "File is empty", NULL, MB_OK);
		Uninitialize();
		return;
	}

	if (m_pHardware == NULL)	Initialize();

	m_pHardware->Pause(MEDIASTREAM_AUDIO | MEDIASTREAM_VIDEO, 
		               NULL, 
					   NULL, 
					   &m_mAudioType);

	m_pHardware->Run(0);
	m_bPlay = TRUE;
	ResetEvent(m_hPlayEvent);

	while (m_bPlay) 
	{
		m_pCBuffer = m_pMemManager->GetBuffer();
		m_ulReadSize = fread(m_pCBuffer->GetBuffer(), 
							 1, 
							 m_pCBuffer->GetSize(), 
							 m_PlayFile);

		m_pCBuffer->SetActualSize(m_ulReadSize);

		if (m_ulReadSize > 0)
		{
			if (m_pSplitter->Receiver(m_pCBuffer) == STOP_DEMUX)
				break;
		}

		if (m_ulReadSize < BUFFERSIZE)	// EOF
		{
			m_pSplitter->WaitForFilledBufferEmpty();
			m_pHardware->Receive(MEDIASTREAM_VIDEO, EOS_PACKET);
			m_pHardware->Receive(MEDIASTREAM_AUDIO, EOS_PACKET);
			
			// Reset the file pointer and replay it
			rewind(m_PlayFile);	
			
			// Wait until decoder finishes all samples
			while(m_pHardware->GetState(1000) != RM_STATE_STOPPED);
		
			// Stop and restart
			m_pHardware->Stop();
			m_pHardware->Pause(MEDIASTREAM_AUDIO | MEDIASTREAM_VIDEO, 
								NULL, NULL, &m_mAudioType);
			m_pHardware->Run(0);
		}
	}

	SetEvent(m_hPlayEvent);
	fclose(m_PlayFile);
}

DWORD WINAPI CallBack(PVOID pParam)
{
	//847XXAPI *p847XXAPI = (847XXAPI *)pParam;
	//p847XXAPI->Start();
	return 0;
}


///////////////////////////////////////////////////////////////////
#define	FILE_EXTENSION_FILTER		"MPEG video (*.*)\0*.*;\0"

char* C847XXAPI::GetFileName()
{
	OPENFILENAME fileName;
	HGLOBAL	hFile, hFileTitle;			// Capture filename handles
	TCHAR 	*lpFile;
	TCHAR 	*lpFileTitle;

	hFile = GlobalAlloc(GHND, 256);		// Allocate global memory
	if (!hFile)							// if unsuccessful, print error message
	{
		MessageBox (m_hwnd, "Unable to get file name", NULL, MB_OK);
		return 0;
	}

	hFileTitle = GlobalAlloc(GHND, 256);
	if (!hFileTitle)
	{
		GlobalFree(hFile);
		MessageBox (m_hwnd, "Unable to get file name", NULL, MB_OK);
		return 0;
	}

	lpFile = (TCHAR *)GlobalLock(hFile);	// Lock allocated memory
	lpFileTitle = (TCHAR *)GlobalLock(hFileTitle);

	memset(&fileName, 0, sizeof(fileName));
	fileName.lStructSize = sizeof(fileName);
	fileName.Flags = OFN_HIDEREADONLY;
	fileName.hInstance = m_hInstance;
	fileName.hwndOwner = m_hwnd;
	fileName.lpstrFile = lpFile;
	fileName.nMaxFile = 256;
	fileName.lpstrFileTitle = lpFileTitle;
	fileName.nMaxFileTitle = 256;
	fileName.lpstrFilter = FILE_EXTENSION_FILTER;

	char cPath[_MAX_PATH] = "";
	char cDrive[_MAX_DRIVE] = "";
	char cDir[_MAX_DIR] = "";
	char cFName[_MAX_FNAME] = "";

	// Initialize the common Open File dialog.
	if (GetOpenFileName (&fileName))
	{
		m_FileName[0] = NULL;
		strcpy (m_FileName, fileName.lpstrFile);
	}

	GlobalUnlock(hFile);
	GlobalUnlock(hFileTitle);
	GlobalFree(hFile);
	GlobalFree(hFileTitle);
	return m_FileName;
}

/////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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