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

📄 emlplayerdlg.cpp

📁 DShow player based on wince 6.0 vs2005
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	// TODO: Add your control notification handler code here
	m_Complete = TRUE;
	m_Start = FALSE;
    return;
}

BOOL CEMLplayerDlg::OpenCOM(void) 
{
	// TODO: Add your control notification handler code here
	//打开串口
	if (!m_ceSeries.OpenPort(this, m_portNo, m_baud, m_parity, m_databits, m_stopbits))
	{
		AfxMessageBox(L"Open COM failed!");
		return FALSE;
	}
	else  //打开成功的话,将关闭按钮和发送按钮置为可用
	{
		//m_strConFlag = _T("   Connected");
		//this->UpdateData(FALSE);

		//IPicture *pPic = (IPicture*)GetDlgItem(IDC_SCOMSTATE);
		//CWnd *pWnd = GetDlgItem(IDC_SCOMSTATE);
		//pWnd->SetIcon(::LoadIcon(NULL,(const unsigned short *)"res\\connection.ico"),FALSE);   

		CString name = "COM Conneted!";
		this->SetWindowText(name);
		
		m_ConnFlag = TRUE;

		m_hReadCloseEvent = CreateEvent(NULL,TRUE,FALSE,NULL);

		//创建读串口线程
		//m_hReadThread = CreateThread(NULL,0,ReadThreadFunc,this,0,&m_dwReadThreadID);
	}

	return TRUE;
}

void CEMLplayerDlg::CloseCOM(void) 
{
	if (m_ConnFlag==TRUE)
	{
		//关闭串口
		m_ceSeries.ClosePort();

		m_strConFlag = _T(" No Connected");
		this->UpdateData(FALSE);

		//关闭读线程
		CloseReadThread();
	}
	m_ConnFlag = FALSE;
}

//串口读线程函数
DWORD CEMLplayerDlg::ReadThreadFunc(LPVOID lparam)
{
	CEMLplayerDlg *pDlg = (CEMLplayerDlg *)lparam;
	CCESeries *ceSeries = &(pDlg->m_ceSeries);
	
	BYTE * readBuf = NULL;//读取的字节
	DWORD actualReadLen=0;//实际读取的字节数
	
	BOOL bRState=FALSE;

	CEdit * pEdit;
	pEdit = (CEdit *)pDlg->GetDlgItem(IDC_EDTRECV);

	//while ( ceSeries->m_hComm!=INVALID_HANDLE_VALUE )
	while ( 1 )
	{   
		readBuf = new BYTE[512];
		ceSeries->ReadPort(ceSeries->m_hComm, readBuf, &actualReadLen);
		if(!bRState)
		{
			AfxMessageBox(CString("无法从串口读取数据!"));
		}
		else
		{
			//如果读取的数据大于0,
			if (actualReadLen>0)
			{
				//触发读取回调函数
				char aucBuf[255];
				memcpy( aucBuf, readBuf, actualReadLen);
				aucBuf[actualReadLen] = '\0';
				CString strRecv;
				strRecv = aucBuf;
				strRecv = pDlg->m_strRecv+aucBuf;
				pDlg->m_strRecv = strRecv;
				pDlg->SetDlgItemText( IDC_EDTRECV, strRecv );
			}
		}
		delete[] readBuf;
	}

	return 0;
}

//关闭读线程
void CEMLplayerDlg::CloseReadThread(void)
{
	CCESeries *ceSeries = &m_ceSeries;

	SetEvent(m_hReadCloseEvent);
	//设置所有事件无效无效
	SetCommMask(ceSeries->m_hComm, 0);
	//清空所有将要读的数据
    PurgeComm( ceSeries->m_hComm,  PURGE_RXCLEAR );
    //等待10秒,如果读线程没有退出,则强制退出
    if (WaitForSingleObject(m_hReadThread,10000) == WAIT_TIMEOUT)
	{
		TerminateThread(m_hReadThread,0);
	}
	m_hReadThread = NULL;
}

//播放线程函数
DWORD PlayThreadFunc(LPVOID lparam)
{
    HRESULT hr = S_OK;
	CButton *pButton;
	CEMLplayerDlg *pDlg = (CEMLplayerDlg *)lparam;

	// TODO: Add your control notification handler code here
    // Get COM interfaces
    CoInitializeEx(NULL, COINIT_MULTITHREADED);

    if (FAILED(pDlg->GetInterfaces()))
    {
        CoUninitialize();
        return  -1;
    }

    // Now play the movie
    pDlg->PlayMedia();

	pButton = (CButton*)pDlg->GetDlgItem(IDC_OPEN);
	pButton->EnableWindow(FALSE);
	pButton = (CButton*)pDlg->GetDlgItem(IDC_PLAY);
	pButton->EnableWindow(FALSE);

	pButton = (CButton*)pDlg->GetDlgItem(IDC_STOP);
	pButton->EnableWindow(TRUE);
	pButton = (CButton*)pDlg->GetDlgItem(IDC_STEP);
	pButton->EnableWindow(TRUE);

	pDlg->ProcessEventLoop();
	pDlg->OnStop1();
	if (FAILED(hr))
    {
		return hr;
	}
	pButton = (CButton*)pDlg->GetDlgItem(IDC_STOP);
	pButton->EnableWindow(FALSE);
	pButton = (CButton*)pDlg->GetDlgItem(IDC_STEP);
	pButton->EnableWindow(FALSE);

	pButton = (CButton*)pDlg->GetDlgItem(IDC_OPEN);
	pButton->EnableWindow(TRUE);
	pButton = (CButton*)pDlg->GetDlgItem(IDC_PLAY);
	pButton->EnableWindow(TRUE);

    // Release COM interfaces
    pDlg->CleanupInterfaces();
    CoUninitialize();

	return 0;
}

void CEMLplayerDlg::OnRun(void) 
{
    HRESULT hr = S_OK;
    // Start playback
    hr = pMC->Run();
	if (SUCCEEDED(hr))
	{
		long evCode;
		pME->WaitForCompletion(0,&evCode);
		
	}
}
void CEMLplayerDlg::OnStop1(void) 
{
    HRESULT hr = S_OK;
	pMC->Stop();
	if (SUCCEEDED(hr))
	{
	}
}

//关闭读线程
void CEMLplayerDlg::ClosePlayThread(void)
{
    if (WaitForSingleObject(m_hPlayThread,10000) == WAIT_TIMEOUT)
	{
		TerminateThread(m_hPlayThread,0);
	}
	m_hPlayThread = NULL;
}

void CEMLplayerDlg::ProcessEventLoop(void)
{
    HRESULT hr;
    BOOL bSleep=TRUE;
    TCHAR buf[256];

    // Continue
    while (!m_Complete)
    {
        LONGLONG pos=0;
        long lEventCode, lParam1, lParam2;

        // Reset sleep flag
        bSleep = TRUE;

        // Has there been a media event?  Look for end of stream condition.
        if(E_ABORT != pME->GetEvent(&lEventCode, &lParam1, &lParam2, 0))
        {
            // Free the media event resources.
            hr = pME->FreeEventParams(lEventCode, lParam1, lParam2);
            if (FAILED(hr))
            {
				wsprintf(buf, TEXT("Failed(%08lx) in FreeEventParams!\r\n"),
					hr);
				MessageBox(buf,_T("INFO"), MB_OK);
            }

            // Is this the end of the movie?
            if (lEventCode == EC_COMPLETE)
            {
                // If user wants continuous looping, reset and continue
                if (1)
                {
                    // Reset to first frame of movie
                    hr = pMS->SetPositions(&pos, AM_SEEKING_AbsolutePositioning ,
                        NULL, AM_SEEKING_NoPositioning);

                    if (FAILED(hr))
                    {
                        // Some filters (like MIDI) may not implement interfaces
                        // for IMediaSeeking to allow seek to the start.  In that
                        // case, just stop and restart for the same effect.
                        hr = pMC->Stop();
                        if (FAILED(hr))
                        {
							wsprintf(buf, TEXT("Failed(%08lx) in Stop!\r\n"),
								hr);
							MessageBox(buf, _T("INFO"), MB_OK);
                        }

                        hr = pMC->Run();
                        if (FAILED(hr))
                        {
							wsprintf(buf, TEXT("Failed(%08lx) in Run!\r\n"),
								hr);
							MessageBox(buf, _T("INFO"), MB_OK);
                        }
                    }

                    // Don't sleep if we're resetting clip (for faster restart)
                    bSleep = FALSE;
                }
            }

            if (1)
                DisplayECEvent(lEventCode, lParam1, lParam2);
        }

        // Give system threads time to run (and don't sample user input madly)
        //if (bSleep)
        //    Sleep(SAMPLE_FREQ);
    }
}

void CEMLplayerDlg::DisplayECEvent(long lEventCode, long lParam1, long lParam2)
{
    switch (lEventCode)
    {
        HANDLE_EC(EC_COMPLETE);
        HANDLE_EC(EC_USERABORT);
        HANDLE_EC(EC_ERRORABORT);
        HANDLE_EC(EC_TIME);
        HANDLE_EC(EC_REPAINT);
        HANDLE_EC(EC_STREAM_ERROR_STOPPED);
        HANDLE_EC(EC_STREAM_ERROR_STILLPLAYING);
        HANDLE_EC(EC_ERROR_STILLPLAYING);
        HANDLE_EC(EC_PALETTE_CHANGED);
        HANDLE_EC(EC_VIDEO_SIZE_CHANGED);
        HANDLE_EC(EC_QUALITY_CHANGE);
        HANDLE_EC(EC_SHUTTING_DOWN);
        HANDLE_EC(EC_CLOCK_CHANGED);
        HANDLE_EC(EC_PAUSED);
        HANDLE_EC(EC_OPENING_FILE);
        HANDLE_EC(EC_BUFFERING_DATA);
        HANDLE_EC(EC_FULLSCREEN_LOST);
        HANDLE_EC(EC_ACTIVATE);
        HANDLE_EC(EC_NEED_RESTART);
        HANDLE_EC(EC_WINDOW_DESTROYED);
        HANDLE_EC(EC_DISPLAY_CHANGED);
        HANDLE_EC(EC_STARVATION);
        HANDLE_EC(EC_OLE_EVENT);
        HANDLE_EC(EC_NOTIFY_WINDOW);
        HANDLE_EC(EC_STREAM_CONTROL_STOPPED);
        HANDLE_EC(EC_STREAM_CONTROL_STARTED);
        HANDLE_EC(EC_END_OF_SEGMENT);
        HANDLE_EC(EC_SEGMENT_STARTED);
        HANDLE_EC(EC_LENGTH_CHANGED);
        HANDLE_EC(EC_TIMECODE_AVAILABLE);
        HANDLE_EC(EC_EXTDEVICE_MODE_CHANGE);
        HANDLE_EC(EC_VCD_SELECT);
        HANDLE_EC(EC_VCD_PLAY);
        HANDLE_EC(EC_VCD_END);

    default:
        // RETAILMSG(1, (TEXT("  Received unknown event code (0x%x)\r\n"), lEventCode));
        break;
    }
}

LRESULT CEMLplayerDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class
	return CDialog::DefWindowProc(message, wParam, lParam);
}

⌨️ 快捷键说明

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