📄 richimp3dlg.cpp
字号:
return 0L;
}
BOOL CRichiMP3Dlg::StartPlay(LPCSTR pFileName)
{
AfxGetApp()->DoWaitCursor(TRUE);
//TRACE("Start\r\n");
DWORD dw;
m_break = FALSE;
m_hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)PlayThread,
(void*)this,
0,
&dw);
// m_buf.EnableWindow(FALSE);
return (m_hThread != 0);
}
void CRichiMP3Dlg::StartPlay()
{
AfxGetApp()->DoWaitCursor(TRUE);
// m_list.GetText(m_playIdx, m_nextFile);
CPictureObject *pObj = (CPictureObject *)m_list.GetItemData(m_playIdx);
if(pObj != NULL)
m_nextFile = pObj->GetFileName();
if(m_pFile.Open(m_nextFile) == FALSE)
{
AfxGetApp()->DoWaitCursor(FALSE);
AfxMessageBox("Cannot open the file",MB_OK|MB_ICONHAND);
return;
}
m_freq = m_pFile.GetFrequency();
m_mode = m_pFile.GetMode();
m_modeEx = m_pFile.GetModeExtension();
m_frqIdx = m_pFile.GetFreqIndex();
m_version = m_pFile.GetVersion();
m_frmLength = m_pFile.GetFrameLength();
int duration = m_pFile.GetDuration();
TCHAR unused[_MAX_PATH];
TCHAR fName[_MAX_FNAME];
_splitpath(m_nextFile,unused,unused,fName,unused);
_stprintf(unused," %s %d:%02d ",fName,duration /(60*1000),
duration /(60*1000)%60);
SetDlgItemText(IDC_TEXT,unused);
m_pspf = m_pFile.GetMilisecPerFrame();
if(m_Mci.Open(m_freq,m_mode,0,0,16,m_buffsize,3) ==FALSE)
{
AfxGetApp()->DoWaitCursor(FALSE);
m_pFile.Close();
AfxMessageBox("Cannot open out Wav device",MB_OK|MB_ICONHAND);
return;
}
m_scope->SetSampleAttr(16,m_mode==3 ? 1 : 2,m_freq);
// m_scopeR.SetSampleAttr(16,m_mode==3 ? 1 : 2,m_freq);
// m_icon.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1+m_mode));
DWORD frames = m_pFile.GetMinFrames();//GetRealNrOfFrames();
m_fp.SetRange(0,frames);
m_fp.SetPos(0);
// ef_b2.Display(0);
int sec;
sec = m_fppos*m_pspf/1000;
if(sec != 0)
{
ef_b2.Display(sec/60);
ef_b3.Display(sec%60);
}
else
{
ef_b2.Display(0);
ef_b3.Display(00);
}
m_fppos = 0;
// ::SendDlgItemMessage(m_hWnd,ST_POS,WM_SETTEXT,0,(LPARAM)"0");
StartThread(m_nextFile);
m_play = TRUE;
AfxGetApp()->DoWaitCursor(FALSE);
}
BOOL CRichiMP3Dlg::StopPlay()
{
if(m_hThread)
{
::EnterCriticalSection(&m_css);
m_break = TRUE;
::LeaveCriticalSection(&m_css);
if(m_hThread)
{
WaitForSingleObject(m_hThread,INFINITE);
}
m_pFile.Close();
m_Mci.Close();
CloseHandle(m_hThread);
m_hThread = 0;
}
return TRUE;
}
BOOL CRichiMP3Dlg::ResetUI(BOOL fromNoty/*== TRUE*/)
{
m_play = FALSE;
m_fppos = 0;
m_fp.SetPos(0);
m_scope->Invalidate();
// m_scopeR.Invalidate();
return TRUE;
}
BOOL CRichiMP3Dlg::StopThread()
{
if(m_hThread)
{
::EnterCriticalSection(&m_css);
m_break = TRUE; // break the loop
::LeaveCriticalSection(&m_css);
if(0 != m_hThread)
{
WaitForSingleObject(m_hThread,INFINITE);
}
m_pFile.Close();
m_Mci.Close();
CloseHandle(m_hThread);
m_hThread = 0;
return TRUE;
}
return FALSE;
}
void CRichiMP3Dlg::OnFileChange()
{
int idx = m_list.GetCurSel();
if(m_playIdx == idx)
return;
m_playIdx = idx;
m_ignoreMsg = TRUE;
if(!StopThread())
m_ignoreMsg = FALSE;
ResetUI();
StartPlay();
}
void CRichiMP3Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
if((CWnd*)pScrollBar == (CWnd*)&m_fp)
{ // fpos
if(m_hThread == 0)
return;
if(nSBCode == SB_PAGELEFT ||
nSBCode == SB_PAGERIGHT || SB_THUMBTRACK == nSBCode)
{
::EnterCriticalSection(&m_css);
m_fppos = m_fp.GetPos();
// ef_b2.Display(m_fppos);
int sec;
sec = m_fppos*m_pspf/1000;
if(sec != 0)
{
ef_b2.Display(sec/60);
ef_b3.Display(sec%60);
}
else
{
ef_b2.Display(0);
ef_b3.Display(00);
}
m_pFile.Goto((m_fppos * m_frmLength / 4) * 4);
::LeaveCriticalSection(&m_css);
}
}
else if((CWnd*)pScrollBar == (CWnd*)&m_pre)
{ // preamplif volume
m_preVol = m_pre.GetPos();
//ef_b1.SetNumber(m_preVol);// = m_preVol;//m_pre.GetPos();
}
else
{// buffer size
// m_buffsize = m_buf.GetPos()*16384;
// ef_b3.SetNumber(m_buffsize);
//SetDlgItemInt(EF_BUFF,m_buffsize);
// ef_buff.SetNumber(m_buffsize);
}
CBitmapDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
int Xacumul = 0;
void CRichiMP3Dlg::TheadFn()
{
TRACE("TheadFn(\r\n");
BOOL lbreak;
CLayerIII decoder;
int modulo = 0;
DWORD lengthOut = 0;
DWORD oneSlotLen;
BYTE* pInBuff;
BYTE* pOutBuff;
lengthOut = 0;
int frames = 0;
DWORD mciCapacity;
//TRACE("{(\r\n");
wchar_t pText[128];
m_pFile.Goto(0);
if(!decoder.Init(m_version,
m_mode,
m_modeEx,
m_frqIdx,
(long)DecCallback))
goto EXIT;
// char out[32];
lengthOut = 0;
pOutBuff = m_Mci.GetBufferPtr(&mciCapacity);
//BYTE p[8912];
//pOutBuff = p;
char szout[32];
DWORD version,mode, modeEx,frqIdx;
pInBuff = m_pFile.GetFrame(&oneSlotLen,&version,&mode,&modeEx,&frqIdx);
::EnterCriticalSection(&m_css);
m_pDecoder = &decoder;
::LeaveCriticalSection(&m_css);
while(pInBuff)
{
//TRACE("{\r\n") ;
decoder.DecodeBlock(pInBuff,oneSlotLen,pOutBuff,&lengthOut,
version,mode,modeEx,frqIdx);
//TRACE("ui\r\n");
int sec;
if(lengthOut > mciCapacity)
{
m_fppos += frames;
sec = m_fppos*m_pspf/1000;
_stprintf(szout,"%d:%02d",sec/60,sec%60);
::PostMessage(m_fp.m_hWnd,TBM_SETPOS, TRUE, m_fppos);
m_fp.Invalidate(FALSE);
ef_b2.Display(sec/60);
ef_b3.Display(sec%60);
pOutBuff = m_Mci.SingAndRetNextBuff(&lengthOut);
//m_scope->WMPaintProc(szout);
::mbstowcs(pText,szout,128);
m_scope->ReleasePaint();
// m_pScope->ReleasePaint(pText);
frames = 0;
}
frames++;
::EnterCriticalSection(&m_css);
//TRACE("gf\r\n");
pInBuff = m_pFile.GetFrame(&oneSlotLen,&version,&mode,&modeEx,&frqIdx);
lbreak = m_break;
::LeaveCriticalSection(&m_css);
if(m_highProcSpeed)
Sleep(3);
if(lbreak)
break;
//TRACE("}\r\n");
}
::EnterCriticalSection(&m_css);
m_pDecoder = 0 ;
::LeaveCriticalSection(&m_css);
if(lengthOut > 0)
pOutBuff = m_Mci.SingAndRetNextBuff(&lengthOut);
Sleep(600);
_tcscpy(szout,"0:00");
::mbstowcs(pText,szout,128);
EXIT:
::PostMessage(m_hWnd,WM_FILE_PLAYED,0,0);
TRACE("Thread }\r\n");
}
DWORD CRichiMP3Dlg::DecCallback(double *pData,double *pSpectrum,
int nChannel)
{
static int c=0;
WORD w = 0;
if(pData) // volum control preamp
{
*pData*=m_preVol/20.0;
w = (* pData > 32767.0f) ? 32767 : ((* pData< -32768.0f) ? -32768 :
(WORD) * pData) ;
}
// spectrum forward to graph wnd
if(nChannel==0)
{
CRichiMP3Dlg::m_scope->AddSample(w-32767);
// CMcPlayerDlg *pDlg = (CMcPlayerDlg*)GetParent()->m_scope->AddSample(w-32767);
int v;
CRichiMP3Dlg::m_ctrl1->SetPick(v = rand()%99 );
CRichiMP3Dlg::m_ctrl2->SetPick(v = rand()%99 );
}
return w;
}
void CRichiMP3Dlg::OnSelchangeList2()
{
// TODO: Add your control notification handler code here
AfxMessageBox("wen");
}
void CRichiMP3Dlg::UpdateListBox1()
{
CListBox *pListBox = (CListBox *)GetDlgItem(IDC_LIST2);
pListBox->ResetContent();
CPictureList *pList = (CPictureList *)GetApp()->GetPictureList();
POSITION pos = pList->GetHeadPosition();
while(pos != NULL)
{
CPictureObject *pObject = (CPictureObject *)pList->GetNext(pos);
CString strFileName;
CString strName;
strFileName = pObject->GetFileName();
int n = strFileName.ReverseFind('\\');
int n1 = strFileName.GetLength();
if(n>0)
{
strName = strFileName.Right(n1-n-1);
}
int nCurSel = pListBox->AddString(strName);
pListBox->SetItemData(nCurSel,(DWORD)pObject);
}
}
void CRichiMP3Dlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
if((CWnd*)pScrollBar == (CWnd*)&m_pre)
{ // preamplif volume
//m_preVol = m_pre.GetPos();
m_preVol = 15-m_pre.GetPos();
//ef_b1.SetNumber(m_preVol);// = m_preVol;//m_pre.GetPos();
}
CBitmapDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
LRESULT CRichiMP3Dlg::OnVScroll1(WPARAM wp, LPARAM gains)
{
if(m_pDecoder ==0)
return 0L;
int* gi = (int*)gains;
double gn ;
for(int i=0;i < (int)wp;i++)
{
if(gi[i] >= 0)
gn = 1.0 + gi[i]/20.0;
else
{
gn = (double)(gi[i]+20)/20;
}
::EnterCriticalSection(&m_css);
m_pDecoder->SetGain(gn,i);
::LeaveCriticalSection(&m_css);
}
m_preVol = (double)gi[i]+20.0;
return 0L;
}
void CRichiMP3Dlg::OnButtonList2()
{
// TODO: Add your control notification handler code here
if(pEqDlg->GetSafeHwnd()==0)
{
pEqDlg->Create(IDD_DIALOG1);
pEqDlg->ShowWindow(SW_SHOW);
CRect rcPosition;
CRect rcClient;
GetWindowRect(&rcClient);
pEqDlg->GetWindowRect(&rcPosition);
pEqDlg->MoveWindow(rcClient.left,rcClient.bottom,rcPosition.Width(),rcPosition.Height(),TRUE);
}
else if(pEqDlg->IsWindowVisible())
{
pEqDlg->ShowWindow(SW_HIDE);
}
else
{
pEqDlg->ShowWindow(SW_SHOW);
CRect rcPosition;
CRect rcClient;
GetWindowRect(&rcClient);
pEqDlg->GetWindowRect(&rcPosition);
pEqDlg->MoveWindow(rcClient.left,rcClient.bottom,rcPosition.Width(),rcPosition.Height(),TRUE);
}
}
void CRichiMP3Dlg::OnButtonTitle()
{
// TODO: Add your control notification handler code here
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -