////////////////////////////////////////////////////////////////////// // mciPlay(DWORD dwFrom, DWORD dwTo, DWORD dwCallBack) // play the music stream. ////////////////////////////////////////////////////////////////////// DWORD MUSIC::Play(DWORD dwFrom, DWORD dwTo) { ASSERT_TRUE(m_DID); MCIERROR mciERR = ERROR_SUCCESS; MCI_PLAY_PARMS mci_p = {0}; DWORD dwFlag = MCI_NOTIFY; mci_p.dwFrom = dwFrom; mci_p.dwTo = dwTo; mci_p.dwCallback = (DWORD_PTR)m_dwCallBack; if (dwFrom != MUSIC_ERROR) dwFlag |= MCI_FROM; if (dwTo != MUSIC_ERROR) dwFlag |= MCI_TO; mciERR = mciSendCommandW( m_DID, MCI_PLAY, dwFlag, (DWORD_PTR)&mci_p); Sleep(1); return mciERR; }
////////////////////////////////////////////////////////////////////// // mciOpenFile(LPCWSTR _szStr) // open a music file. szStr: Path of the file ////////////////////////////////////////////////////////////////////// DWORD MUSIC::OpenFile(LPCWSTR _szStr) { MCIERROR mciERR = ERROR_SUCCESS; MCI_OPEN_PARMSW mci_p = {0}; mci_p.lpstrElementName = _szStr; mci_p.lpstrDeviceType = NULL; mci_p.dwCallback = (DWORD_PTR)m_dwCallBack; if (m_DID != MUSIC_ERROR) Close(); mciERR = mciSendCommandW( 0, MCI_OPEN, MCI_OPEN_SHAREABLE|MCI_NOTIFY|MCI_OPEN_ELEMENT, (DWORD_PTR)&mci_p); if (mciERR != ERROR_SUCCESS) { mciERR = mciSendCommandW( 0, MCI_OPEN, MCI_NOTIFY|MCI_OPEN_ELEMENT, (DWORD_PTR)&mci_p); } if (mciERR == ERROR_SUCCESS) { m_DID = mci_p.wDeviceID; // // Set time format with milliseconds // { MCI_SET_PARMS mci_p = {0}; mci_p.dwTimeFormat = MCI_FORMAT_MILLISECONDS; //DWORD dw = mciSendCommandW( m_DID, MCI_SET, MCI_NOTIFY|MCI_SET_TIME_FORMAT, (DWORD_PTR)&mci_p); } } return mciERR; }
DWORD MUSIC::GetPlayStatus() { ASSERT_TRUE(m_DID); MCI_STATUS_PARMS mci_p = {0}; mci_p.dwCallback = (DWORD_PTR)m_dwCallBack; mci_p.dwItem = MCI_STATUS_MODE; mciSendCommandW( m_DID, MCI_STATUS, MCI_NOTIFY|MCI_STATUS_ITEM, (DWORD_PTR)&mci_p); return (DWORD)mci_p.dwReturn; }
DWORD MUSIC::SetVolume(float value) { ASSERT_TRUE(m_DID); MCIERROR mciERR = ERROR_SUCCESS; MCI_DGV_SETAUDIO_PARMSW mci_p = {0}; mci_p.dwItem = MCI_DGV_SETAUDIO_VOLUME; mci_p.dwValue = (DWORD)(value * 1000); //此处就是音量大小 (0--1000) mciERR = mciSendCommandW( m_DID, MCI_SETAUDIO, MCI_DGV_SETAUDIO_VALUE | MCI_DGV_SETAUDIO_ITEM, (DWORD_PTR)&mci_p); return mciERR; }
////////////////////////////////////////////////////////////////////// // mciStop() // stop the music stream. ////////////////////////////////////////////////////////////////////// DWORD MUSIC::Stop() { ASSERT_TRUE(m_DID); MCIERROR mciERR = ERROR_SUCCESS; MCI_GENERIC_PARMS mci_p = {0}; mci_p.dwCallback = (DWORD_PTR)m_dwCallBack; mciERR = mciSendCommandW( m_DID, MCI_STOP, MCI_NOTIFY, (DWORD_PTR)&mci_p); return mciERR; }
////////////////////////////////////////////////////////////////////// // mciSeek(DWORD dwTo) // seek the music stream playposition to `dwTo` ////////////////////////////////////////////////////////////////////// DWORD MUSIC::Seek(DWORD dwTo) { ASSERT_TRUE(m_DID); MCIERROR mciERR = ERROR_SUCCESS; MCI_SEEK_PARMS mci_p = {0}; mci_p.dwCallback = (DWORD_PTR)m_dwCallBack; mci_p.dwTo = dwTo; mciERR = mciSendCommandW( m_DID, MCI_SEEK, MCI_NOTIFY, (DWORD_PTR)&mci_p); return mciERR; }
////////////////////////////////////////////////////////////////////// // mciClose() // close the music stream. ////////////////////////////////////////////////////////////////////// DWORD MUSIC::Close() { if(m_DID != MUSIC_ERROR) { MCIERROR mciERR = ERROR_SUCCESS; MCI_GENERIC_PARMS mci_p = {0}; mci_p.dwCallback = (DWORD_PTR)m_dwCallBack; mciERR = mciSendCommandW( m_DID, MCI_CLOSE, MCI_NOTIFY, (DWORD_PTR)&mci_p); m_DID = MUSIC_ERROR; return mciERR; } else { return ERROR_SUCCESS; } }
/************************************************************************** * mciSendCommand [MMSYSTEM.701] */ DWORD WINAPI mciSendCommand16(UINT16 wDevID, UINT16 wMsg, DWORD dwParam1, DWORD p2) { DWORD dwRet; BOOL to32; DWORD_PTR dwParam2 = p2; TRACE("(%04X, %s, %08X, %08lX)\n", wDevID, MCI_MessageToString(wMsg), dwParam1, dwParam2); switch (wMsg) { case MCI_CLOSE: case MCI_OPEN: case MCI_SYSINFO: case MCI_BREAK: case MCI_SOUND: to32 = TRUE; break; default: /* FIXME: this is suboptimal. If MCI driver is a 16bit one, we'll be * doing 16=>32W, then 32W=>16 conversions. * We could directly call the 16bit driver if we had the information. */ to32 = TRUE; } if (to32) { MMSYSTEM_MapType res; dwRet = MCIERR_INVALID_DEVICE_ID; switch (res = MCI_MapMsg16To32W(wMsg, dwParam1, &dwParam2)) { case MMSYSTEM_MAP_MSGERROR: dwRet = MCIERR_DRIVER_INTERNAL; break; case MMSYSTEM_MAP_NOMEM: TRACE("Problem mapping %s from 16 to 32\n", MCI_MessageToString(wMsg)); dwRet = MCIERR_OUT_OF_MEMORY; break; case MMSYSTEM_MAP_OK: case MMSYSTEM_MAP_OKMEM: dwRet = mciSendCommandW(wDevID, wMsg, dwParam1, dwParam2); if (res == MMSYSTEM_MAP_OKMEM) MCI_UnMapMsg16To32W(wMsg, dwParam1, dwParam2, dwRet); break; } } else { #if 0 if (wDevID == MCI_ALL_DEVICE_ID) { FIXME("unhandled MCI_ALL_DEVICE_ID\n"); dwRet = MCIERR_CANNOT_USE_ALL; } else { dwRet = SendDriverMessage(hdrv, wMsg, dwParam1, dwParam2); } #endif } if (wMsg == MCI_CLOSE && dwRet == 0 && MCI_Thunks) { /* free yield thunks, if any */ unsigned i; for (i = 0; i < MCI_MAX_THUNKS; i++) { if (MCI_Thunks[i].id == wDevID) MCI_Thunks[i].yield16 = NULL; } } return dwRet; }