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

📄 richimp3dlg.cpp

📁 完整的MP3播放器源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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 + -