PersonalCorpus 版 (精华区)

多媒体程序设计
用MCI播放WAVE音频 hjt整理
class CWaveAudio  //处理波形类
{
public:
    CWaveAudio();//构造函数
    virtual ~CWaveAudio();//构析函数
    int GetDevices (void);//得到播放设备
    BOOL Load (CString);//载入文件
    void Close (void);//关闭文件
    BOOL Play ();//播放
    void Stop (void);//停止播放
    BOOL Record (void);//录制
    BOOL Save (CString);//保存
    WORD GetResolution();//得到位长
    DWORD GetSampleRate();//得到采样率
    WORD GetChannel();//得到声道
    DWORD GetWaveLength();//得到音频长度
private:
    BOOL m_bRecording;//是否在录音
    BOOL m_bOpened;//是否打开文件
    WORD m_wDeviceID;//播放设备ID
};


CWaveAudio::CWaveAudio()
{
    m_bRecording = FALSE;
    m_bOpened = FALSE;
    m_wDeviceID = 0;
}

CWaveAudio::~CWaveAudio()
{
    Close();
}

int CWaveAudio::GetDevices (void)
{
    return waveOutGetNumDevs ();
}

BOOL CWaveAudio::Load(CString Filename)
{
    Close ();
    MCI_OPEN_PARMS OpenParms;
    OpenParms.lpstrDeviceType = "waveaudio";
    OpenParms.lpstrElementName = Filename;
    if (mciSendCommand (NULL, MCI_OPEN, MCI_OPEN_ELEMENT |
        MCI_OPEN_TYPE, (DWORD)(LPVOID) &OpenParms))
        return FALSE;
    m_wDeviceID = OpenParms.wDeviceID;
    m_bOpened = TRUE;
    MCI_SET_PARMS SetParms;
    SetParms.dwTimeFormat=MCI_FORMAT_MILLISECONDS;
    if(mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,  
    (DWORD)(LPVOID) &SetParms))
        return FALSE;
    return TRUE;
}

void CWaveAudio::Close (void)
{
    m_bRecording = FALSE;
    m_bOpened = FALSE;
    if (m_wDeviceID)
    {
        mciSendCommand (m_wDeviceID, MCI_STOP, MCI_WAIT,    
        NULL);
        mciSendCommand (m_wDeviceID, MCI_CLOSE, NULL, NULL);
    }
    m_wDeviceID = 0;
}

BOOL CWaveAudio::Play ()
{
    Stop ();
    MCI_PLAY_PARMS PlayParms;
    mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START,   
    NULL);
    if (mciSendCommand (m_wDeviceID, MCI_PLAY, NULL, (DWORD)    
    (LPVOID) &PlayParms))
        return FALSE;
    else
        return TRUE;
}

void CWaveAudio::Stop (void)
{
    mciSendCommand (m_wDeviceID, MCI_STOP, NULL, NULL);
}

BOOL CWaveAudio::Record (void)
{
    Close ();
    MCI_OPEN_PARMS OpenParms;
    OpenParms.lpstrDeviceType = "waveaudio";
    OpenParms.lpstrElementName = "";
    if (mciSendCommand (NULL, MCI_OPEN, MCI_OPEN_ELEMENT |      
            MCI_OPEN_TYPE | MCI_WAIT,
            (DWORD)(LPVOID) &OpenParms))
        return FALSE;
    m_wDeviceID = OpenParms.wDeviceID;
    MCI_RECORD_PARMS RecordParms;
    if (mciSendCommand (m_wDeviceID, MCI_RECORD, NULL,
            (DWORD)(LPVOID) &RecordParms))
        return FALSE;
    m_bRecording = TRUE;
    m_bOpened = TRUE;
    return TRUE;
}

BOOL CWaveAudio::Save (CString Filename)
{
    if (!m_bRecording)
        return FALSE;
    Stop ();
    MCI_SAVE_PARMS SaveParms;
    SaveParms.lpfilename = (LPCSTR) Filename;
    if (mciSendCommand (m_wDeviceID, MCI_SAVE, MCI_SAVE_FILE |
        MCI_WAIT, (DWORD)(LPVOID) &SaveParms))
        return FALSE;
    m_bRecording = FALSE;
    Load (Filename);
    return TRUE;
}

DWORD CWaveAudio::GetSampleRate()
{
    MCI_STATUS_PARMS StatusParms;
    StatusParms.dwItem=MCI_WAVE_STATUS_SAMPLESPERSEC;
    if(mciSendCommand(m_wDeviceID,MCI_STATUS,
        MCI_WAIT|MCI_STATUS_ITEM,
        (DWORD)(LPVOID)&StatusParms))
        return -1;
    else return StatusParms.dwReturn;
}

WORD CWaveAudio::GetChannel()
{
    MCI_STATUS_PARMS StatusParms;
    StatusParms.dwItem=MCI_WAVE_STATUS_CHANNELS;
    i(mciSendCommand(m_wDeviceID,MCI_STATUS,
        MCI_WAIT|MCI_STATUS_ITEM,
        (DWORD)(LPVOID)&StatusParms))
        return -1;
    else return StatusParms.dwReturn;
}

WORD CWaveAudio::GetResolution()
{
    MCI_STATUS_PARMS StatusParms;
    StatusParms.dwItem=MCI_WAVE_STATUS_BITSPERSAMPLE;
    if(mciSendCommand(m_wDeviceID,MCI_STATUS,
        MCI_WAIT|MCI_STATUS_ITEM,
        (DWORD)(LPVOID)&StatusParms))
        return -1;
    else return StatusParms.dwReturn;
}

DWORD CWaveAudio::GetWaveLength()
{
    MCI_STATUS_PARMS StatusParms;
    StatusParms.dwItem=MCI_STATUS_LENGTH;
    if(mciSendCommand(m_wDeviceID,MCI_STATUS,
        MCI_WAIT|MCI_STATUS_ITEM,
        (DWORD)(LPVOID) &StatusParms))
        return -1;
    else return StatusParms.dwReturn;
}
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:13.398毫秒