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

📄 yogaplaydlg.cpp

📁 Cracker终结者——提供最优秀的软件保护技术
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -