Example #1
0
//////////////////////////////////////////////////////////////////////
// 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;
}
Example #2
0
//////////////////////////////////////////////////////////////////////
// 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;
}
Example #3
0
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;
}
Example #4
0
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;
}
Example #5
0
//////////////////////////////////////////////////////////////////////
// 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;
}
Example #6
0
//////////////////////////////////////////////////////////////////////
// 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;
}
Example #7
0
//////////////////////////////////////////////////////////////////////
// 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;
	}
}
Example #8
0
/**************************************************************************
 * 				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;
}