📄 tccmmbdlg.cpp
字号:
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 + -