📄 audioplaydlg.cpp
字号:
#ifdef TESTPLAYER
m_Player.SetVolume(VOL_SILENCE);
#endif
m_btnMute.ShowWindow(SW_SHOW);
m_btnVol.ShowWindow(SW_HIDE);
}
void CAudioPlayDlg::GetAudioDuration()
{
#ifdef TESTPLAYER
m_Player.GetMediaDuration(m_dDuration);
#endif
}
void CAudioPlayDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
#ifdef TESTPLAYER
LONG lRemainingSecs;
double rate = 0.0, llCurDur= 0.0;
TCHAR chDuration[MAX_STRING];
TCHAR chCurTime[MAX_STRING];
if((nIDEvent == TIME_AUDIO_SECID)&&(m_Player.play_state == STATE_PLAY))
{
//change this to get_curtime
m_Player.GetMediaCurrPos(llCurDur);
//calculate time
lRemainingSecs = (LONG)llCurDur;
m_nTimeHour = (int)lRemainingSecs / 3600; // 3600 seconds in the hour
lRemainingSecs = lRemainingSecs % 3600;
m_nTimeMin = (int)lRemainingSecs / 60; // 60 seconds in the minute
lRemainingSecs = lRemainingSecs % 60;
m_nTimeSec = (int)lRemainingSecs;
//convert time to string and display
wsprintf(chCurTime, L"%02d:%02d:%02d", m_nTimeHour, m_nTimeMin, m_nTimeSec );
wsprintf(chDuration, L"%02d:%02d:%02d", (int)m_dDuration/3600,(int)m_dDuration/60,(int)m_dDuration%60);
DisplayTime(chDuration,chCurTime);
//calculate progress slider position
rate = llCurDur/m_dDuration;
//set position
m_sliderPro.SetPos((int)(rate*m_nProWidth));
//check audio auto stop
m_Player.checkautostop();
}
else if((nIDEvent == TIME_AUDIO_SECID)&&(m_Player.play_state == STATE_INIT))
{
//when play over, so play next music
OnNextFile();
}
#endif
if(nIDEvent == TIME_AUDIO_INFO)
{
//switch to display audio information
switch(m_nDisplayIdx)
{
case 0:
m_MusicInfo.SetWindowText(GetFileName(m_chFileName));
break;
case 1:
m_MusicInfo.SetWindowText(m_chMp3Title);
break;
case 2:
m_MusicInfo.SetWindowText(m_chMp3Artist);
break;
case 3:
m_MusicInfo.SetWindowText(m_chMp3Album);
break;
case 4:
m_MusicInfo.SetWindowText(m_chMp3Remark);
break;
}
m_nDisplayIdx++;
if(m_nDisplayIdx > 4)
m_nDisplayIdx = 0;
}
CDialog::OnTimer(nIDEvent);
}
void CAudioPlayDlg::ResetTimeAndSlider()
{
//reset time and slider
TCHAR chDuration[MAX_STRING];
TCHAR chCurTime[MAX_STRING];
CRect btnRect;
m_nTimeHour = 0;
m_nTimeMin = 0;
m_nTimeSec = 0;
//time
wsprintf(chDuration, L"%02d:%02d:%02d",
(int)m_dDuration/3600,(int)m_dDuration/60,(int)m_dDuration%60);
wcscpy(chCurTime, L"00:00:00");
DisplayTime(chDuration,chCurTime);
//slider
m_sliderPro.SetPos(0);
}
void CAudioPlayDlg::DisplayTime(TCHAR* TotalTime,TCHAR* CurTime)
{
TCHAR TmpChar[MAX_STRING];
//display time
wcscpy(TmpChar,CurTime);
wcscat(TmpChar,L"/");
wcscat(TmpChar,TotalTime);
m_Time.SetWindowText(TmpChar);
}
// void CAudioPlayDlg::OnPlaymodeAll()
// {
// // TODO: Add your control notification handler code here
// m_PlayMode = PLAYMODE_ALL;
// m_btnOne.ShowWindow(SW_HIDE);
// m_btnAll.ShowWindow(SW_SHOW);
// m_btnRand.ShowWindow(SW_HIDE);
// }
//
// void CAudioPlayDlg::OnPlaymodeOne()
// {
// // TODO: Add your control notification handler code here
// m_PlayMode = PLAYMODE_ONE;
// m_btnOne.ShowWindow(SW_SHOW);
// m_btnAll.ShowWindow(SW_HIDE);
// m_btnRand.ShowWindow(SW_HIDE);
// }
//
// void CAudioPlayDlg::OnPlaymodeRand()
// {
// // TODO: Add your control notification handler code here
// m_PlayMode = PLAYMODE_RAND;
// m_btnOne.ShowWindow(SW_HIDE);
// m_btnAll.ShowWindow(SW_HIDE);
// m_btnRand.ShowWindow(SW_SHOW);
// }
void CAudioPlayDlg::GetMp3Attr()
{
FILE *fp;
const int seekPos = 128;
int i = 0,j = 0;
char* m_buff = (char *)malloc(seekPos+1);
MP3_ATTR mp3Attr;
TCHAR WideCharStr[MAX_STRING];
memset(m_buff,0,sizeof(char)*128);
//open file,get last 128 byte
if((fp = _wfopen(m_chFileName,L"rb"))==NULL)
{
free(m_buff);
return;
}
//seek to end
fseek(fp, 0, SEEK_END);
//seek to -128
fseek(fp, ftell(fp)-128, SEEK_SET);
//read last content
i = fread(m_buff, sizeof(mp3Attr), seekPos, fp);
fclose(fp);
//evaluate to m_mp3attr
int position = 0;//loop begin
int currentIndex = 0;//attr current index
//get tag
for(i = currentIndex;i<currentIndex+3;i++)
{
mp3Attr.tag[j] = m_buff[i];
position++;
j++;
}
currentIndex = position;
//get title
for(i = currentIndex,j = 0;i<currentIndex+30;i++)
{
mp3Attr.title[j] = m_buff[i];
position++;
j++;
}
//conversion
MultiByteToWideChar(CP_ACP,0,mp3Attr.title,-1,(LPWSTR)WideCharStr,30);
wcscpy(m_chMp3Title,L"Title: ");
wcscat(m_chMp3Title,WideCharStr);
currentIndex = position;
//get artist
for(i = currentIndex,j = 0;i<currentIndex+30;i++)
{
mp3Attr.artist[j] = m_buff[i];
position++;
j++;
}
//conversion
MultiByteToWideChar(CP_ACP,0,mp3Attr.artist,-1,(LPWSTR)WideCharStr,30);
wcscpy(m_chMp3Artist,L"Artist: ");
wcscat(m_chMp3Artist,WideCharStr);
currentIndex = position;
//get album
for(i = currentIndex,j = 0;i<currentIndex+30;i++)
{
mp3Attr.album[j] = m_buff[i];
position++;
j++;
}
//conversion
MultiByteToWideChar(CP_ACP,0,mp3Attr.album,-1,(LPWSTR)WideCharStr,30);
wcscpy(m_chMp3Album,L"Album: ");
wcscat(m_chMp3Album,WideCharStr);
currentIndex = position;
//get year
for(i = currentIndex,j = 0;i<currentIndex+4;i++)
{
mp3Attr.year[j] = m_buff[i];
position++;
j++;
}
currentIndex = position;
//get remark
for(i = currentIndex,j = 0;i<currentIndex+30;i++)
{
mp3Attr.remark[j] = m_buff[i];
position++;
j++;
}
//conversion
MultiByteToWideChar(CP_ACP,0,mp3Attr.remark,-1,(LPWSTR)WideCharStr,30);
wcscpy(m_chMp3Remark,L"Remark: ");
wcscat(m_chMp3Remark,WideCharStr);
free(m_buff);
}
void CAudioPlayDlg::OnOpenFile()
{
// TODO: Add your control notification handler code here
CFileListDlg dlg(this);
//get file list dlg
m_AudioList = &dlg;
dlg.DoModal();
//get current full file name
if(m_AudioList->m_chCurFilename[0]!=0)
{
//m_chFileName is full file name
wcscpy(m_chFileName, m_AudioList->m_chCurFilename);
AudioPlay();
}
}
TCHAR* CAudioPlayDlg::GetFileName(TCHAR* chFullFileName)
{
if (chFullFileName == NULL || chFullFileName[0] == 0)
return NULL;
int siLen = wcslen(chFullFileName);
for(int i = siLen - 1; i >= 0; --i)
{
if(chFullFileName[i] == '\\')
break;
}
return chFullFileName + i + 1;
}
void CAudioPlayDlg::OnNextFile()
{
// TODO: Add your control notification handler code here
CString Str;
if(m_chFileName[0])
{
switch(m_PlayMode)
{
case PLAYMODE_ALL:
if(g_nCurSelItem+1<g_StrList.GetCount())
g_nCurSelItem++;
else
g_nCurSelItem = 0;
break;
case PLAYMODE_ONE:
break;
case PLAYMODE_RAND:
g_nCurSelItem = rand() % g_StrList.GetCount();
break;
}
//081030,jelly add it for access violation
m_Player.stop();
if(g_nCurSelItem != -1) //g_nCurSelItem == -1, there is not file in playlist
{
Str = g_StrList.GetAt(g_StrList.FindIndex(g_nCurSelItem));
//get current full file name
wcscpy(m_chFileName,Str);
//then open it
AudioPlay();
}
}
}
void CAudioPlayDlg::OnLastFile()
{
// TODO: Add your control notification handler code here
CString Str;
if(m_chFileName[0])
{
switch(m_PlayMode)
{
case PLAYMODE_ALL:
if(g_nCurSelItem>0)
g_nCurSelItem--;
else
g_nCurSelItem = g_StrList.GetCount()-1;
break;
case PLAYMODE_ONE:
break;
case PLAYMODE_RAND:
g_nCurSelItem = rand() % g_StrList.GetCount();
break;
}
//081030,jelly add it for access violation
m_Player.stop();
if(g_nCurSelItem != -1) //g_nCurSelItem == -1, there is not file in playlist
{
Str = g_StrList.GetAt(g_StrList.FindIndex(g_nCurSelItem));
//get current full file name
wcscpy(m_chFileName,Str);
//then open it
AudioPlay();
}
}
}
HBRUSH CAudioPlayDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr;
// TODO: Change any attributes of the DC here
if(nCtlColor==CTLCOLOR_STATIC)
{
int ID = pWnd->GetDlgCtrlID();
pDC->SetBkMode(TRANSPARENT);
switch(ID)
{
case IDC_STATIC_INFO:
hbr = CreateSolidBrush(COLOR_BLUE);
pDC->SetTextColor(COLOR_YELLOW);
break;
case IDC_STATIC_TIME:
hbr = CreateSolidBrush(COLOR_BLACK);
pDC->SetTextColor(COLOR_YELLOW);
break;
}
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
LRESULT CAudioPlayDlg::OnBitmapSliderMoved(WPARAM wParam, LPARAM lParam)
{
double dRate = 0.0;
int nPos = 0, nLeftVol = 0, nRightVol = 0;
if(m_chFileName[0] == 0)
return 0;
if( wParam == IDC_SLIDER_VOL)
{
m_nPos = m_sliderVol.GetPos();
m_sliderVol.SetPos(m_nPos);
//only m_bMute is false
if(m_bMute == FALSE)
{
//calculate rate
dRate = (double)m_nPos/m_nVolWidth;
//delete this for OS volume
// nLeftVol = nRightVol = (int)(0xffff*dRate);
// m_nVolume = nLeftVol<<16|nRightVol;
//for change audio volume
m_nVolume = (LONG)(dRate*(VOL_FULL-VOL_SILENCE)+VOL_SILENCE);
#ifdef TESTPLAYER
m_Player.SetVolume(m_nVolume);
#endif
}
}
else if(wParam == IDC_SLIDER_PRO)
{
m_nPos = m_sliderPro.GetPos();
//set new position
m_sliderPro.SetPos(m_nPos);
//calculate rate
dRate = (double)m_nPos/m_nProWidth;
#ifdef TESTPLAYER
m_Player.SetMediaPos(m_dDuration*dRate);
#endif
}
return 0;
}
LRESULT CAudioPlayDlg::OnBitmapSliderMoving(WPARAM wParam, LPARAM lParam)
{
if( wParam == IDC_SLIDER_PRO )
{
//set new position
m_sliderPro.SetPos(m_sliderPro.GetPos());
}
return 0;
}
void CAudioPlayDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//point in play mode all
if(PtInRect(&RectModeAll, point))
{
m_PlayMode = PLAYMODE_ALL;
}//point in play mode one
else if(PtInRect(&RectModeOne, point))
{
m_PlayMode = PLAYMODE_ONE;
}//point in play mode rand
else if(PtInRect(&RectModeRand, point))
{
m_PlayMode = PLAYMODE_RAND;
}
//refresh
LoadPlayMode();
CDialog::OnLButtonDown(nFlags, point);
}
//this only for OS volume
void IncreaseVolume()
{
DWORD m_curVolume=0;
waveOutGetVolume(0,(unsigned long*)&m_curVolume);
m_curVolume += VOL_SET_STEP;
if (m_curVolume > VOL_FULL) m_curVolume = VOL_FULL;
waveOutSetVolume(0, m_curVolume);
}
void DecreaseVolume()
{
DWORD m_curVolume=0;
waveOutGetVolume(0,(unsigned long*)&m_curVolume);
m_curVolume -= VOL_SET_STEP;
if (m_curVolume < VOL_SILENCE) m_curVolume = VOL_SILENCE;
waveOutSetVolume(0, m_curVolume);
}
void CAudioPlayDlg::OnSliderVol()
{
// TODO: Add your control notification handler code here
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -