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

📄 tccmmbdlg.cpp

📁 自己在wince的环境下做的一移动数字电视驱动
💻 CPP
📖 第 1 页 / 共 4 页
字号:

	EnterCriticalSection(&Video_section);
	while(VideoFirst)
	{
		getItem=VideoFirst;
		VideoFirst = VideoFirst->Next;
		VideoCount--;
		delete getItem;
		getItem = NULL;
	}
	VideoFirst=VideoLast=NULL;
	LeaveCriticalSection(&Video_section);

	return 1;
}

void InitEAACDec()
{                                                                                                                                                                               
	// Open Decoder
	m_pEAACPDec = NULL;
	m_pEAACPDec = new CEAACDec;
	if( m_pEAACPDec->EAACOpenCodec() < 0 )
	{
		delete m_pEAACPDec;
		m_pEAACPDec = NULL;
	}		
	m_pEAACPDec->EAACReInitCodec();
	m_pEAACPDec->m_sampleRate=24000; 
	m_pEAACPDec->m_channel=2;
//	m_pEAACPDec->m_transformLength=1024; //default
	m_pEAACPDec->m_aacProfile=AAC_PROFILE_LC; // default
//	m_pEAACPDec->m_dualmono = TRUE;
}

DWORD EAACDecProcess(unsigned char *pBufferIn,
					unsigned int input_size,
					int playtime,
					unsigned char *pBufferOut,
					int maxsize)
{
	int output_size=0;
	
	if( (output_size = m_pEAACPDec->EAACDecode(pBufferIn, input_size, pBufferOut, maxsize)) <= 0 )
	{
		if(output_size<0)
		{
			printf("[ERROR] EAAC DECODE FAIL =%d \r\n",output_size);
//			for(int i=0;i<input_size;i++)
//				printf("%x ",pBufferIn[i]);
//			printf("\n");
		}
		return output_size;
	}

	return output_size;
}

void InitWaveDev()
{
	memset(&waveHeader1,0,sizeof(WAVEHDR));
	memset(buf1,0,sizeof(SAVEBUFFERSIZE));
	waveHeader1.lpData=buf1;
	waveHeader1.dwBufferLength=SAVEBUFFERSIZE;
	waveHeader1.dwBytesRecorded=0;
	waveHeader1.dwUser=0;
	waveHeader1.dwFlags=0;
	waveHeader1.dwLoops=0;
	waveHeader1.lpNext=0;
	waveHeader1.reserved=0;

	memset(&waveHeader2,0,sizeof(WAVEHDR));
	memset(buf2,0,sizeof(SAVEBUFFERSIZE));
	waveHeader2.lpData=buf2;
	waveHeader2.dwBufferLength=SAVEBUFFERSIZE;
	waveHeader2.dwBytesRecorded=0;
	waveHeader2.dwUser=0;
	waveHeader2.dwFlags=0;
	waveHeader2.dwLoops=0;
	waveHeader2.lpNext=0;
	waveHeader2.reserved=0;


	//MMRESULT mm_res ;
	WAVEFORMATEX WaveFormatEx;
	WaveFormatEx.wFormatTag=WAVE_FORMAT_PCM;
	WaveFormatEx.nChannels=CHANNELS;
	WaveFormatEx.nSamplesPerSec=SAMPLESPERSEC;
	WaveFormatEx.wBitsPerSample=BITSPERSAMPLE;
	WaveFormatEx.nBlockAlign=WaveFormatEx.nChannels*(WaveFormatEx.wBitsPerSample/8);
	WaveFormatEx.nAvgBytesPerSec=WaveFormatEx.nSamplesPerSec*WaveFormatEx.nChannels*WaveFormatEx.wBitsPerSample/8;
	WaveFormatEx.cbSize=sizeof(WaveFormatEx);
	

	if( MMSYSERR_NOERROR==::waveOutOpen(&hWaveOut, WAVE_MAPPER, &WaveFormatEx, (DWORD)(waveOutProc), 0, CALLBACK_FUNCTION))
	{
	}
	else
	{
		printf("fail waveoutopen!\n");
	}	
}



DWORD AudioRenderProcess(PVOID pArg)
{
	InitWaveDev();
	waveOutPrepareHeader( hWaveOut, &waveHeader1, sizeof(WAVEHDR));
    waveOutPrepareHeader( hWaveOut, &waveHeader2, sizeof(WAVEHDR));

    waveOutWrite( hWaveOut, &waveHeader1, sizeof(WAVEHDR) );
    waveOutWrite( hWaveOut, &waveHeader2, sizeof(WAVEHDR) );	
	
	return 1;
}

DWORD RawAudioProcess(PVOID pArg)
{
	int result=0;
	DWORD audiooutputsize=0;
	RawAudioPacket * getrawitem=new RawAudioPacket;
	AudioPacket * newItem=new AudioPacket;
	while(AudioRendering)
	{
		Sleep(1);

		memset(getrawitem,0,sizeof(RawAudioPacket));
		result=RawAudioQueue->Get((unsigned char *)getrawitem,sizeof(RawAudioPacket));
		if(!result)
		{
			continue;
		}

		audiooutputsize=0;
		audiooutputsize=EAACDecProcess(getrawitem->rawdata,getrawitem->size,
					getrawitem->StartPlayTime,AudioOut,SAVEBUFFERSIZE);
		if(audiooutputsize>0)
		{
//			printf("audiooutputsize=%d\n",audiooutputsize);
			memset(newItem,0,sizeof(AudioPacket));
			memcpy(newItem->DataOut,AudioOut,audiooutputsize>AUDIOITEMSIZE ? AUDIOITEMSIZE:audiooutputsize);
			newItem->datasize = audiooutputsize>AUDIOITEMSIZE ? AUDIOITEMSIZE:audiooutputsize;
			newItem->StartPlayTime = getrawitem->StartPlayTime;
			newItem->streamstime = getrawitem->streamstime;
			result=AudioQueue->Put((unsigned char *)newItem,sizeof(AudioPacket));
			if(!result)
			{
				printf("Audio Queue Full!\n");
				EnterCriticalSection(&Timer_section);
				AudioTimer=getrawitem->StartPlayTime+getrawitem->streamstime;
				LeaveCriticalSection(&Timer_section);
			}
				
		}else{
			EnterCriticalSection(&Timer_section);
			AudioTimer=getrawitem->StartPlayTime+getrawitem->streamstime;
			LeaveCriticalSection(&Timer_section);			
		}
	}
	RawAudioQueue->Clear();
	AudioQueue->Clear();
	delete getrawitem;
	delete newItem;
	return 1;
}

void CALLBACK  waveOutProc( HWAVEOUT hwo,      
                   UINT uMsg,         
                   DWORD dwInstance,  
                   DWORD dwParam1,    
                   DWORD dwParam2     )
{
	int result=0;
	AudioPacket * temp=new AudioPacket;
	if(uMsg == WOM_DONE)
    { 
		LPWAVEHDR pWaveHeader = (LPWAVEHDR)dwParam1;

		waveOutUnprepareHeader( hwo, pWaveHeader, sizeof(WAVEHDR) );

		memset(pWaveHeader->lpData,0,SAVEBUFFERSIZE);

		memset(temp,0,sizeof(AudioPacket));
waveoutagain:		
		result=AudioQueue->Get((unsigned char*)temp,sizeof(AudioPacket));
		if(!result)
		{
			if(AudioRendering==1)
			{
				goto waveoutagain;
//				waveOutPrepareHeader( hwo, pWaveHeader, sizeof(WAVEHDR));
//				waveOutWrite( hwo, pWaveHeader, sizeof(WAVEHDR) );
			}
			delete temp;
			return ;
		}

		memcpy(pWaveHeader->lpData,temp->DataOut,temp->datasize);
		pWaveHeader->dwBufferLength=temp->datasize;

		EnterCriticalSection(&Timer_section);
		AudioTimer=temp->streamstime+temp->StartPlayTime;
		LeaveCriticalSection(&Timer_section);

		waveOutPrepareHeader( hwo, pWaveHeader, sizeof(WAVEHDR));
		waveOutWrite( hwo, pWaveHeader, sizeof(WAVEHDR) );

	 }
	 delete temp;
	 return ;
}

DWORD StartRun(PVOID pArg)
{
	int result=0,count=0,i;
	for(i=0;i<3;i++)
	{
		result=tpTvSetFreq(ChannelArray[channelpointer].freqPoint);
		printf("++++tpTvSetFreq %d=%d\n",ChannelArray[channelpointer].freqPoint,result);
		if(result==0)
			break;
	}
	if(result!=0)
	{
		freqfail=1;
		mstr_status.Format(_T("FreqPoint Fail"));
		::InvalidateRect(((CTcCMMBDlg *)pArg)->GetSafeHwnd(),&INFO,TRUE);
		return -1;
	}
	freqfail=0;

	Sleep(2000);
	
	for(i=0;i<20;i++)
	{
		result=tpTvSelectService(channelpointer);	
		printf("++++tpTvSelectService %d=%d\n",ChannelArray[channelpointer].ServerID,result);
		if(result==0)
			break;
		Sleep(3000);
	}
	mstr_status.Format(_T("%d"),ChannelArray[channelpointer].ServerID);
	::InvalidateRect(((CTcCMMBDlg *)pArg)->GetSafeHwnd(),&INFO,TRUE);
	m_status=3;
	((CTcCMMBDlg *)pArg)->InitPlayer();
	return 1;
}

int CTcCMMBDlg::InitPlayer()
{
	VideoLast=VideoFirst=NULL;
	Decodeing=1;
	AudioRendering=1;
	dataend=1;

	RawVideoHandle=CreateThread(NULL, 0, RawVideoProcess,0,0,NULL);
	VideoRenderHandle=CreateThread(NULL, 0, VideoRenderProcess, 0, 0, NULL);

	RawAudioHandle=CreateThread(NULL, 0, RawAudioProcess,0,0,NULL);
	
	AudioRenderHandle=CreateThread(NULL, 0, AudioRenderProcess, 0, 0, NULL);
	
	DecodeThreadHandle=CreateThread(NULL, 0, DecodeThread,0,0,NULL);

//	SetThreadPriority(VideoRenderHandle,THREAD_PRIORITY_BELOW_NORMAL);
//	SetThreadPriority(AudioRenderHandle,THREAD_PRIORITY_BELOW_NORMAL);

	SetThreadPriority(RawAudioHandle,THREAD_PRIORITY_BELOW_NORMAL);
	SetThreadPriority(RawVideoHandle,THREAD_PRIORITY_BELOW_NORMAL);
	
	//THREAD_PRIORITY_LOWEST
	SetThreadPriority(DecodeThreadHandle,THREAD_PRIORITY_LOWEST);

	return 0;
}

void CTcCMMBDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
/*	switch(nIDEvent)
	{

		case TMR_SINGAL:
		  if ((!m_fullScreen)) {
			  int result;
			  short SignalValue;
//			  result=tpTvGetSignalPower(&SignalValue);
			  if(result==0)
			  {
//				  printf("Signal Value=%d DBm\n",SignalValue);
				  m_SignalStrength=SignalValue;
				  InvalidateRect(&INFO,TRUE);
			  }else
				  m_SignalStrength=-127;

		  }
		break;
//
	}	
	CSkinDialog::OnTimer(nIDEvent);*/
}

void CTcCMMBDlg::ViewOSD()
{
	CPaintDC dc(this); // device context for painting

	if (!m_fullScreen)
	{
      RECT rect;
      WCHAR w_str[64];

      rect.left = 180;
      rect.top = 250;
	  rect.right=317;
	  rect.bottom=265;
	  
      _stprintf(w_str, L"%s", mstr_status); 
      DisplayOsd(&dc, w_str, &rect, 16);
      _stprintf(w_str, L"%s", mstr_signal); 
      DisplayOsd(&dc, w_str, &SIGNALINFO, 16);

	}
}

void CTcCMMBDlg::DisplayOsd(CPaintDC *pDc, WCHAR *pStr, RECT *pRect, int fontSize)
{
   // -- Font
   CFont font;
   VERIFY(font.CreateFont(
      fontSize,                  // nHeight
      0,                         // nWidth
      0,                         // nEscapement
      0,                         // nOrientation
      FW_BOLD,                   // nWeight
      FALSE,                     // bItalic
      FALSE,                     // bUnderline
      0,                         // cStrikeOut
      ANSI_CHARSET,              // nCharSet
      OUT_DEFAULT_PRECIS,        // nOutPrecision
      CLIP_DEFAULT_PRECIS,       // nClipPrecision
      DEFAULT_QUALITY,           // nQuality
      DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
      _T("Arial")));                 // lpszFacename  

   // -- Title
   CFont* default_font = pDc->SelectObject(&font);
   pDc->SetBkMode(TRANSPARENT);
   pDc->SetTextColor(OSD_COLOR);
   pDc->ExtTextOut(pRect->left, pRect->top, ETO_OPAQUE, NULL, pStr, NULL);
   pDc->SelectObject(default_font);
   font.DeleteObject();

}

void CTcCMMBDlg::OnSelchangeCombFreq() 
{
	// TODO: Add your control notification handler code here
	int newfreq;
	int result=0,count=0;
	newfreq=m_combofreq.GetCurSel();
	if(newfreq==m_freq)
		return;
	else
	{
		ReleasePlayer();

		for(int i=0;i<3;i++)
		{
			result=tpTvSetFreq(newfreq+1);
			printf("++++tpTvSetFreq %d =%d\n",freqPoint[newfreq],result);
			if(result==0)
				break;
		}
		if(result==0)
		{
			freqfail=0;
			m_freq=newfreq;
			mstr_status.Format(_T("FreqPoint OK"));
			m_status=1;
			ChannelSum=0;
		}
		else
		{
			freqfail=1;
			mstr_status.Format(_T("FreqPoint Fail"));
		}
		InvalidateRect(&INFO,TRUE);

	}
}

void CTcCMMBDlg::ReleasePlayer()
{
	dataend=0;
	Decodeing = 0;	
	AudioRendering=0;
	if(m_status==3)
	Sleep(2000);

	if (DecodeThreadHandle) {
		CloseHandle(DecodeThreadHandle);
		 DecodeThreadHandle= NULL;
	}
	if (RawVideoHandle) {
		CloseHandle(RawVideoHandle);
		 RawVideoHandle= NULL;
	}
	if (RawAudioHandle) {
		CloseHandle(RawAudioHandle);
		 RawAudioHandle= NULL;
	}
	if (VideoRenderHandle) {
		CloseHandle(VideoRenderHandle);
		 VideoRenderHandle= NULL;
	}
	if (AudioRenderHandle) {
		CloseHandle(AudioRenderHandle);
		 AudioRenderHandle= NULL;
	}
	if(StartRunHandle)
	{
		CloseHandle(StartRunHandle);
		StartRunHandle= NULL;
	}
	Sleep(20);
	if(m_pVideoRender)
		m_pVideoRender->DisableLayer0();
}

BOOL CTcCMMBDlg::GetScannedInfo()
{
   mpScanData = fopen(SCAN_DATA_PATH, "rb");
   if (!mpScanData)
      return FALSE;
   
	DWORD dummy,freq=0,serverid=0,startTs=0,nts=0,demod=0;
	int i=0;

    while(fscanf(mpScanData, "%d", &freq) != EOF )
	{
        fscanf(mpScanData, "%1c", &dummy);
        fscanf(mpScanData, "%d", &serverid);       
        fscanf(mpScanData, "%1c", &dummy);
        fscanf(mpScanData, "%d", &startTs);       
        fscanf(mpScanData, "%1c", &dummy);
        fscanf(mpScanData, "%d", &nts);       
        fscanf(mpScanData, "%1c", &dummy);
        fscanf(mpScanData, "%d", &demod);       
		printf("%d %d %d %d %d\n",freq,serverid,startTs,nts,demod);
		if(freq>=69)
			freq=0;
		ChannelArray[i].freqPoint=freq;
		ChannelArray[i].ServerID=serverid;
		ChannelArray[i].startTs=(unsigned char)startTs;
		ChannelArray[i].nts=(unsigned char)nts;
		ChannelArray[i].demod=(unsigned char)demod;
		i++;
	}
	ChannelSum=i;
	printf("ChannelSum=%d\n",ChannelSum);

    return TRUE;   
}

int CTcCMMBDlg::InitINNO()
{
	mhTsif = CreateFile(L"INN1:", GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

	if(mhTsif == INVALID_HANDLE_VALUE) {
		MessageBox(L"TSIF Open Fail");
		mhTsif =NULL;
		return -1;
	}

	unsigned char fwversion[3];
	int result=0;
	result=tpTvGetFWVersion(fwversion,3);
	if(result==0)
	{
		for(int i=0;i<3;i++)
			printf("%d ",fwversion[i]);
	}
	
	return 0;
}

int CTcCMMBDlg::ReleaseINNO()
{
	if(mhTsif != NULL)
	{
		CloseHandle(mhTsif);
		mhTsif = NULL;
	}
	return 0;
}

void CTcCMMBDlg::OnCheckfullscreen() 
{
	// TODO: Add your control notification handler code here
	ChangeAllScreen();
}

BOOL CTcCMMBDlg::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	
	return CSkinDialog::OnEraseBkgnd(pDC);
}

⌨️ 快捷键说明

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