PersonalCorpus 版 (精华区)

多媒体编程
使用MCI播放CD音频   hjt整理
类定义:

class CCDAudio  //处理播放CD
{
public:
    CCDAudio();//构造函数
    virtual ~CCDAudio();//构析函数
    BOOL Open (void);//打开CD文件
    void Close (void);//关闭CD文件
    BOOL Play (void);//播放CD
    void Stop (void);//停止播放
    void Pause (void);//暂停播放
    int GetTracks (void);//得到总音轨数
    int GetTrack (void);//得到当前播放的音轨
    //函数功能-得到CD长度,*pnMinutes,*pnSeconds将返回CD长度的分钟   
    //数和秒钟数
    void GetAudioLength (int *pnMinutes, int *pnSeconds);
    //函数功能-得到音轨长度,*pnMinutes,*pnSeconds将返回CD长度的分   
    //钟数和秒钟数
        
    void GetTrackLength (int nTrack, int *pnMinutes, int *pnSeconds);
    //得到音轨长度
    int GetMinutes (void);//得到当前播放的分钟数
    int GetSeconds (void);//得到当前播放的秒钟数
    int GetFrames (void);//得到当前位置
    BOOL IsDriveReady (void);//CD是否准备好
    BOOL IsPlaying (BOOL *);//是否正在播放
    BOOL IsAudioTrack (int);//是否是CD音轨
    //函数功能-跳到某位置,nMinute,nSecond-将跳到的位置,Frame-帧数
    BOOL SeekTo (int nTrack, int nMinute, int nSecond, int Frame);
    void OpenCD_Rom (void);//打开CD-ROM
    void CloseCD_Rom (void);//关闭CD-ROM
    void Forward (int);//前进
    void Backward (int);//后退
    
private:
    BOOL m_bOpened;//是否打开CD音轨
    BOOL m_bPaused;//是否暂停
    BOOL m_bPlaying;//是否正在播放
    WORD m_wDeviceID;//播放设备ID
};

函数实现:

CCDAudio::CCDAudio()
{
    // 初始化成员变量
    m_bOpened=FALSE;
    m_bPaused=FALSE;
    m_bPlaying=FALSE;
    m_wDeviceID=0;
}

CCDAudio::~CCDAudio()
{
    Close ();
}
//////////////////////////////////////////////////////////////////////
// Member Functions
//////////////////////////////////////////////////////////////////////

BOOL CCDAudio::Open (void)
{
    if(!m_bOpened)
    {
        // 初始化成员变量
        m_bOpened = m_bPaused = m_bPlaying = FALSE;
        m_wDeviceID = 0;
        // 打开设备
        MCI_OPEN_PARMS OpenParms;
        OpenParms.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_CD_AUDIO;
        OpenParms.wDeviceID = 0;
        if (mciSendCommand (NULL, MCI_OPEN, MCI_WAIT |
             MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID |
             MCI_OPEN_SHAREABLE,
             (DWORD)(LPVOID) &OpenParms))
            return FALSE;
        m_wDeviceID = OpenParms.wDeviceID;
        m_bOpened = TRUE;
        // 设置时间格式
        MCI_SET_PARMS SetParms;
        SetParms.dwTimeFormat = MCI_FORMAT_TMSF;
        if (mciSendCommand (m_wDeviceID,MCI_SET,MCI_WAIT|
            MCI_SET_TIME_FORMAT,
            (DWORD)(LPVOID) &SetParms))
        {
            Close ();
            return FALSE;
        }
        //向MCI发送命令
        mciSendCommand (m_wDeviceID, MCI_SEEK,
            MCI_SEEK_TO_START, NULL);
    }
    return TRUE;
}

void CCDAudio::Close (void)
{
    if (m_bOpened){
        // 停止播放且关闭设备
        if (m_bPlaying || m_bPaused)
            mciSendCommand (m_wDeviceID, MCI_STOP, NULL,
                NULL);
        mciSendCommand (m_wDeviceID, MCI_CLOSE, MCI_WAIT,
                NULL);
        // 情空成员变量
        m_bOpened=FALSE;
        m_bPaused=FALSE;
        m_bPlaying=FALSE;
        m_wDeviceID = 0;
        }
}

BOOL CCDAudio::Play (void)
{
    if (!m_bOpened)
        Open ();
    if (m_bOpened)//播放
    {
        if (!IsAudioTrack (GetTrack ()))
            return FALSE;
        MCI_PLAY_PARMS PlayParms;
        PlayParms.dwCallback = NULL;
        PlayParms.dwFrom = MCI_MAKE_TMSF (GetTrack (),
            GetMinutes (), GetSeconds (), GetFrames ());
        if (mciSendCommand (m_wDeviceID, MCI_PLAY, MCI_FROM,
            (DWORD)(LPVOID) &PlayParms))
            return FALSE;
        m_bPaused = FALSE;
        m_bPlaying = TRUE;
        return TRUE;
    }
    return FALSE;
}

//停止播放
void CCDAudio::Stop (void)
{
    if (m_bOpened && m_bPlaying){
        mciSendCommand (m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);
        mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
        m_bPlaying = FALSE;
        m_bPaused = FALSE;
        }
}

//暂停播放
void CCDAudio::Pause( void )
{
    if (m_bOpened && m_bPlaying)
    {
        // 暂停CD
        MCI_PLAY_PARMS PlayParms;
        if (mciSendCommand (m_wDeviceID, MCI_PAUSE, 0,
            (DWORD)(LPVOID) &PlayParms))
            return;
        m_bPaused = TRUE;
    }
}

//得到CD上的总音轨数
int CCDAudio::GetTracks (void)
{
    if (m_bOpened){
        MCI_STATUS_PARMS StatusParms;
        StatusParms.dwItem = MCI_STATUS_NUMBER_OF_TRACKS;
        if (mciSendCommand (m_wDeviceID, MCI_STATUS,
            MCI_STATUS_ITEM,
            (DWORD)(LPVOID) &StatusParms))
            return -1;
        return (int) StatusParms.dwReturn;
        }
    return -1;
}

//得到CD总时间
void CCDAudio::GetAudioLength (int *pnMinutes, int *pnSeconds)
{
    if (m_bOpened)
    {
        MCI_STATUS_PARMS StatusParms;
        StatusParms.dwItem = MCI_STATUS_LENGTH;
        if (mciSendCommand (m_wDeviceID, MCI_STATUS,
            MCI_WAIT | MCI_STATUS_ITEM,
            (DWORD)(LPVOID) &StatusParms))
        {
            *pnMinutes = -1;
            *pnSeconds = -1;
            return;
        }
        *pnMinutes = MCI_MSF_MINUTE (StatusParms.dwReturn);
        *pnSeconds = MCI_MSF_SECOND (StatusParms.dwReturn);
        return;
    }
    *pnMinutes = -1;
    *pnSeconds = -1;
}

//得到音轨长度
void CCDAudio::GetTrackLength (int nTrack, int *pnMinutes, int *pnSeconds)
{
    if (m_bOpened)
    {
        MCI_STATUS_PARMS StatusParms;
        StatusParms.dwItem = MCI_STATUS_LENGTH;
        StatusParms.dwTrack = (DWORD) nTrack;
        if (mciSendCommand (m_wDeviceID, MCI_STATUS,
            MCI_WAIT | MCI_STATUS_ITEM | MCI_TRACK,
            (DWORD)(LPVOID) &StatusParms))
        {
            *pnMinutes = -1;
            *pnSeconds = -1;
            return;
        }
        *pnMinutes = MCI_MSF_MINUTE (StatusParms.dwReturn);
        *pnSeconds = MCI_MSF_SECOND (StatusParms.dwReturn);
        return;
    }
    *pnMinutes = -1;
    *pnSeconds = -1;
}

//得到当前音轨
int CCDAudio::GetTrack (void)
{
    if (m_bOpened)
    {
        // 保存当前位置
        MCI_STATUS_PARMS StatusParms;
        StatusParms.dwItem = MCI_STATUS_POSITION;
        if (mciSendCommand (m_wDeviceID, MCI_STATUS, MCI_WAIT
            | MCI_STATUS_ITEM,
            (DWORD)(LPVOID) &StatusParms))
            return -1;
        else
            return MCI_TMSF_TRACK (StatusParms.dwReturn);
    }
    return -1;
}

int CCDAudio::GetMinutes (void)
{
    if (m_bOpened)
    {
        MCI_STATUS_PARMS StatusParms;
        StatusParms.dwItem = MCI_STATUS_POSITION;
        if (mciSendCommand (m_wDeviceID, MCI_STATUS,
            MCI_WAIT | MCI_STATUS_ITEM,
            (DWORD)(LPVOID) &StatusParms))
            return -1;
        else
        return MCI_TMSF_MINUTE (StatusParms.dwReturn);
    }
    return -1;
}

int CCDAudio::GetSeconds (void)
{
    if (m_bOpened)
    {
        MCI_STATUS_PARMS StatusParms;
        StatusParms.dwItem = MCI_STATUS_POSITION;
        if (mciSendCommand (m_wDeviceID, MCI_STATUS, MCI_WAIT
        | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms))
            return -1;
        return MCI_TMSF_SECOND (StatusParms.dwReturn);
    }
    return -1;
}

int CCDAudio::GetFrames (void)
{
    if (m_bOpened)
    {
        MCI_STATUS_PARMS StatusParms;
        StatusParms.dwItem = MCI_STATUS_POSITION;
        if (mciSendCommand (m_wDeviceID, MCI_STATUS, MCI_WAIT           | MCI_STATUS_ITEM
,
            (DWORD)(LPVOID) &StatusParms))
            return -1;
        return MCI_TMSF_FRAME (StatusParms.dwReturn);
    }
    return -1;
}

BOOL CCDAudio::IsDriveReady (void)
{
    if (m_bOpened)
    {
        // CD-ROM是否准备好了
        MCI_STATUS_PARMS StatusParms;
        StatusParms.dwItem = MCI_STATUS_MODE;
        if (mciSendCommand (m_wDeviceID, MCI_STATUS,            
            MCI_STATUS_ITEM,(DWORD)(LPVOID) &StatusParms))
            return FALSE;
        if (StatusParms.dwReturn == MCI_MODE_NOT_READY ||
           StatusParms.dwReturn == MCI_MODE_OPEN)
            return FALSE;
        // 是否是CD音轨
        StatusParms.dwItem = MCI_STATUS_MEDIA_PRESENT;
        if (mciSendCommand (m_wDeviceID, MCI_STATUS,
            MCI_STATUS_ITEM,
            (DWORD)(LPVOID) &StatusParms))
            return FALSE;
        return (BOOL) StatusParms.dwReturn;
    }
    return FALSE;
}
BOOL CCDAudio::IsAudioTrack (int nTrack)
{
    if (m_bOpened)
    {
        // 是否是CD音轨
        MCI_STATUS_PARMS StatusParms;
        StatusParms.dwItem = MCI_CDA_STATUS_TYPE_TRACK;
        StatusParms.dwTrack = nTrack;
        if (mciSendCommand (m_wDeviceID, MCI_STATUS,
            MCI_STATUS_ITEM | MCI_TRACK,
            (DWORD)(LPVOID) &StatusParms))
            return FALSE;
        if (StatusParms.dwReturn == MCI_CDA_TRACK_AUDIO)
            return TRUE;
    }
    return FALSE;
}
BOOL CCDAudio::IsPlaying (BOOL *pbPaused)
{
    *pbPaused = m_bPaused;
    return m_bPlaying;
}
BOOL CCDAudio::SeekTo (int nTrack, int nMinute, int nSecond, int nFrame)
{
    if (m_bOpened)
    {
        MCI_SEEK_PARMS SeekParms;
        SeekParms.dwTo = MCI_MAKE_TMSF (nTrack, nMinute,
            nSecond, nFrame);
        if (m_bPlaying && !m_bPaused)
            mciSendCommand (m_wDeviceID, MCI_PAUSE, 0, NULL);
        if (mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_TO |
            MCI_WAIT, (DWORD)(LPVOID) &SeekParms))
            return FALSE;
        if (m_bPlaying && !m_bPaused)
            Play ();
        return TRUE;
        }
    return FALSE;
}
void CCDAudio::Forward (int nSeconds)
{
    if (m_bOpened)
    {
        // 将格式变为毫秒
        MCI_SET_PARMS SetParms;
        SetParms.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
        mciSendCommand (m_wDeviceID, MCI_SET, MCI_WAIT |
            MCI_SET_TIME_FORMAT, (DWORD)(LPVOID) &SetParms);
        // 得到当前位置
        MCI_STATUS_PARMS StatusParms;
        DWORD dwPos;
        StatusParms.dwItem = MCI_STATUS_POSITION;
        mciSendCommand (m_wDeviceID, MCI_STATUS, MCI_WAIT |
             MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms);
        dwPos = StatusParms.dwReturn;
        // 将位置增加
        dwPos += (DWORD) nSeconds * 1000;
        // 暂停并寻找位置
        MCI_SEEK_PARMS SeekParms;
        SeekParms.dwTo = dwPos;
        if (m_bPlaying && !m_bPaused)
            mciSendCommand (m_wDeviceID, MCI_PAUSE, 0, NULL);
        mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_TO |
            MCI_WAIT, (DWORD)(LPVOID) &SeekParms);
        // 将时间格式变为分秒
        SetParms.dwTimeFormat = MCI_FORMAT_TMSF;
        mciSendCommand (m_wDeviceID, MCI_SET, MCI_WAIT |
            MCI_SET_TIME_FORMAT,
            (DWORD)(LPVOID) &SetParms);
        // 播放CD
        if (m_bPlaying && !m_bPaused)
            Play ();
        }
}
void CCDAudio::Backward (int nSeconds)
{
    if (m_bOpened)
    {
        // 改变时间格式为毫秒
        MCI_SET_PARMS SetParms;
        SetParms.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
        mciSendCommand (m_wDeviceID, MCI_SET, MCI_WAIT |
            MCI_SET_TIME_FORMAT,
            (DWORD)(LPVOID) &SetParms);
        // 得到当前位置
        MCI_STATUS_PARMS StatusParms;
        DWORD dwPos;
        StatusParms.dwItem = MCI_STATUS_POSITION;
        mciSendCommand (m_wDeviceID, MCI_STATUS, MCI_WAIT |
             MCI_STATUS_ITEM,
            (DWORD)(LPVOID) &StatusParms);
        dwPos = StatusParms.dwReturn;
        // 将当前位置减少
        dwPos -= (DWORD) nSeconds * 1000;
        // 暂停并寻找位置
        MCI_SEEK_PARMS SeekParms;
        SeekParms.dwTo = dwPos;
        if (m_bPlaying && !m_bPaused)
            mciSendCommand (m_wDeviceID, MCI_PAUSE, 0, NULL);
        mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_TO |
             MCI_WAIT, (DWORD)(LPVOID) &SeekParms);
        // 改变时间格式为分秒
        SetParms.dwTimeFormat = MCI_FORMAT_TMSF;
        mciSendCommand (m_wDeviceID, MCI_SET, MCI_WAIT |
            MCI_SET_TIME_FORMAT,
            (DWORD)(LPVOID) &SetParms);
        // 恢复播放
        if (m_bPlaying && !m_bPaused)
            Play ();
        }
}
void CCDAudio::OpenCD_Rom(void)
{
    if (m_bOpened)
    {
        Stop ();
        mciSendCommand (m_wDeviceID, MCI_SET,
           MCI_SET_DOOR_OPEN, NULL);
    }
}
void CCDAudio::CloseCD_Rom (void)
{
    if (m_bOpened)
    {
        mciSendCommand (m_wDeviceID, MCI_SET,
           MCI_SET_DOOR_CLOSED, NULL);
        Stop ();
    }   
}
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:202.454毫秒