📄 yogaplaydlg.cpp
字号:
ofn.lpstrFile = Files;
ofn.nMaxFile = sizeof(Files);
ofn.lpstrFileTitle = NULL;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = NULL;
ofn.Flags = OFN_EXPLORER | OFN_ALLOWMULTISELECT | OFN_FILEMUSTEXIST;
ofn.lpstrDefExt = NULL;
BOOL Ret = GetOpenFileName(&ofn);
if (Ret) {
// form device play-list
if (pList)
delete pList;
int NamesSize = 0, cFiles = 0;
if (Files[ofn.nFileOffset - 1] == 0) {
// it's multi-select
UINT len;
char* pName = Files + ofn.nFileOffset;
while (*pName != 0) {
len = lstrlen(pName) + 1;
NamesSize += ofn.nFileOffset + len;
pName += len;
cFiles++;
}
} else {
// single selection
cFiles = 1;
NamesSize = lstrlen(Files) + 1;
Files[ofn.nFileOffset - 1] = 0;
}
ListSize = MpegReqListSize(cFiles, NamesSize);
pList = (MPEGPLAYLIST*) new char[ListSize];
pList->Count = cFiles;
char* pName = Files + ofn.nFileOffset;
char* pNameBuf = MpegListStringBuf(pList);
for (int i = 0; i < cFiles; i++) {
pList->NameOfs[i] = MpegListNameOfs(pList, pNameBuf);
lstrcpy(pNameBuf, Files);
lstrcat(pNameBuf, "\\");
lstrcat(pNameBuf, pName);
pName += lstrlen(pName) + 1;
pNameBuf += lstrlen(pNameBuf) + 1;
}
nCurFile = 0;
}
return Ret;
}
void CYogaPlayDlg::OnEject()
{
OnStop();
if (AskFiles()) {
MpegSetPlayList(pList, ListSize);
OnPlay();
}
}
void CYogaPlayDlg::OnStop()
{
bPaused = FALSE;
MpegStopPlay();
bPlaying = FALSE;
}
void CYogaPlayDlg::OnPause()
{
if (bPlaying && btnPause.IsWindowEnabled()) {
bPaused = !bPaused;
if (!(bPaused ? MpegPausePlay() : MpegResumePlay())) {
bPaused = FALSE;
btnPause.EnableWindow(FALSE);
}
}
}
void CYogaPlayDlg::OnPlay()
{
if (bPlaying) {
if (bPaused) {
bPaused = FALSE;
MpegResumePlay();
}
} else if (nCurFile != -1) {
if (MpegPlayFile(nCurFile))
bPlaying = TRUE;
else
AfxMessageBox("Cannot play selected file (not enough mem?)", MB_OK | MB_ICONSTOP);
}
}
void CYogaPlayDlg::OnCancel()
{ // just swallow it
}
void CYogaPlayDlg::OnOK()
{
mixerClose((HMIXER)hMixer);
if (bPlaying)
MpegStopPlay();
MpegCloseDevice();
EndDialog(IDOK);
}
void CYogaPlayDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// swallow Esc
if (nChar != VK_ESCAPE)
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CYogaPlayDlg::OnHelp()
{
AfxMessageBox("If you cannot figure out this brain-dead GUI,\nwe doubt that you need the Yoga Player", MB_OK | MB_ICONINFORMATION);
}
BOOL CYogaPlayDlg::OnHelpInfo(HELPINFO* pHelpInfo)
{
OnHelp();
return TRUE;
}
void CYogaPlayDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if (nID == SC_CLOSE) // translate Close->OK
SendMessage(WM_COMMAND, IDOK, 0);
else
CDialog::OnSysCommand(nID, lParam);
}
BOOL CYogaPlayDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST && pMsg->wParam != VK_TAB && m_hAccel != NULL)
return TranslateAccelerator(m_hWnd, m_hAccel, pMsg);
else
return CDialog::PreTranslateMessage(pMsg);
}
void CYogaPlayDlg::UpdateStatus()
{
MPEGSTATUSINFO Info;
if (!MpegGetStatusInfo(&Info)) {
bPlaying = FALSE;
bPaused = FALSE;
bPlayerBusy = TRUE;
return;
}
nCurFile = Info.Track;
bPlaying = Info.IsPlaying;
bPlayerBusy = Info.IsBusy;
}
void CYogaPlayDlg::RefreshDisplay()
{
UpdateStatus();
int Secs = 0;
if (bPlaying) {
MpegGetStreamInfo(&Info);
int Pos = MpegGetStreamPtr();
int Bps = Info.BitRate * 128;
Secs = bTimeFwd ? Pos / Bps : (Info.StreamSize - Pos) / Bps;
if (bUpdatePos)
SongPos.SetPos((int)(((double)Pos) / Info.StreamSize * 1000000));
}
char buf[20];
wsprintf(buf, "[%0.2d]%c%0.2d:%0.2d", nCurFile + 1, bTimeFwd ? ' ' : '-', Secs / 60, Secs % 60);
Display.SetText(buf);
}
void CYogaPlayDlg::OnTimer(UINT nIDEvent)
{
RefreshDisplay();
if (bPlaying && !bPlayerBusy) {
UINT Pos = MpegGetStreamPtr();
if (Pos >= Info.StreamSize) {
nCurFile++;
if (nCurFile >= pList->Count) {
nCurFile = 0;
if (!bContPlay) {
MpegStopPlay();
bPlaying = FALSE;
}
}
if (bPlaying) {
MpegPlayFile(nCurFile);
RefreshDisplay();
}
}
}
}
void CYogaPlayDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// called when Slider is moved
OnSongPosChange(nSBCode);
}
void CYogaPlayDlg::OnContPlay()
{
bContPlay = !bContPlay;
Menu.CheckMenuItem(ID_OPTIONS_CONTPLAY, bContPlay ? MF_CHECKED : MF_CHECKED);
}
void CYogaPlayDlg::OnSkipForward()
{
if (pList == 0)
return;
MpegStopPlay();
if (bPaused) {
bPlaying = FALSE;
bPaused = FALSE;
}
nCurFile++;
if (nCurFile >= pList->Count) {
nCurFile = 0;
if (!bContPlay)
bPlaying = FALSE;
}
if (bPlaying)
MpegPlayFile(nCurFile);
RefreshDisplay();
}
void CYogaPlayDlg::OnSkipBackward()
{
if (pList == 0)
return;
UINT Pos = SongPos.GetPos();
MpegStopPlay();
if (bPaused) {
bPlaying = FALSE;
bPaused = FALSE;
}
// restart this song if too far into it
// otherwise skip to previous
if (Pos < 6666) { // some arbitrary value
// start prev. song
nCurFile--;
if (nCurFile == -1) {
nCurFile = pList->Count - 1;
if (!bContPlay)
bPlaying = FALSE;
}
}
if (bPlaying)
MpegPlayFile(nCurFile);
RefreshDisplay();
}
void CYogaPlayDlg::RefreshVolume()
{
if (hMixer == NULL)
return;
MIXERCONTROLDETAILS mcds;
MIXERCONTROLDETAILS_UNSIGNED mcd;
mcds.cbStruct = sizeof(mcds);
mcds.dwControlID = VolCtrl.dwControlID;
mcds.cChannels = 1;
mcds.cMultipleItems = 0;
mcds.cbDetails = sizeof(mcd);
mcds.paDetails = &mcd;
if (MMSYSERR_NOERROR == mixerGetControlDetails(hMixer, &mcds, MIXER_GETCONTROLDETAILSF_VALUE))
Volume.SetPos(VolCtrl.Bounds.dwMaximum - (mcd.dwValue - VolCtrl.Bounds.dwMinimum));
}
void CYogaPlayDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CDialog::OnActivate(nState, pWndOther, bMinimized);
if (nState == WA_ACTIVE || nState == WA_CLICKACTIVE) {
RefreshVolume();
}
}
void CYogaPlayDlg::OnSongPosChange(UINT nSBCode)
{
if (!bPlaying)
return; // screw this
if (nSBCode == TB_ENDTRACK) {
// play from new position
double pos = Info.StreamSize;
pos = pos / 1000000 * SongPos.GetPos();
MpegSetStreamPtr((UINT)pos);
bUpdatePos = TRUE;
} else {
// slider is being moved, freeze its update
bUpdatePos = FALSE;
}
}
void CYogaPlayDlg::OnVolumeChange()
{
MIXERCONTROLDETAILS_UNSIGNED mcd;
mcd.dwValue = VolCtrl.Bounds.dwMaximum - Volume.GetPos() + VolCtrl.Bounds.dwMinimum;
MIXERCONTROLDETAILS mcds;
mcds.cbStruct = sizeof(mcds);
mcds.dwControlID = VolCtrl.dwControlID;
mcds.cChannels = 1;
mcds.cMultipleItems = 0;
mcds.cbDetails = sizeof(mcd);
mcds.paDetails = &mcd;
mixerSetControlDetails(hMixer, &mcds, MIXER_GETCONTROLDETAILSF_VALUE);
}
void CYogaPlayDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// called when Slider is moved
OnVolumeChange();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -