• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Codejie's C++ Space

            Using C++

            使用DirectSound播放WAVE文件

                根據Loveddy上的的資料和源碼,寫了一個可以播放WAVE文件的程序, 上傳

                記得老爸說過:天下文人是一家,你抄我來,我抄他。現在來看,寫程序亦是如此。Loveddy的Blog很好,很值得去看,去抄,嘿嘿~
                實際使用DirectSound時,發現對象必須基于一個“窗口”才來使用,即在創建DirectSoundBuffer時,其HWND是必須的,不然雖不會出錯,但也沒有聲音,很奇怪,么找到原因。
                下面是播放的主要部分代碼:
                1.對象的基類,因為還要為以后寫其他播放對象預留。

             1 #ifndef __DSOUNDOBJECT_H__
             2 #define __DSOUNDOBJECT_H__
             3 
             4 #include <dsound.h>
             5 
             6 #include <string>
             7 
             8 
             9 class CDSoundObject
            10 {
            11 public:
            12     enum SoundType { ST_WAVE, ST_MP3 };
            13 public:
            14     CDSoundObject(SoundType type);
            15     virtual ~CDSoundObject();
            16 
            17     virtual int Init(HWND hwnd);
            18 
            19     virtual int LoadFile(const std::string& file) = 0;
            20 
            21 protected:
            22     virtual void Release();
            23 
            24     virtual int CreateDSound();
            25 protected:
            26     HWND _hWnd;
            27     SoundType _eType;
            28     IDirectSound * _pDS;
            29     IDirectSoundBuffer * _pDSBuffer;
            30 };
            31 
            32 #endif

             1 #include "DSoundObject.h"
             2 
             3 CDSoundObject::CDSoundObject(CDSoundObject::SoundType type)
             4 : _eType(type)
             5 , _pDS(NULL), _pDSBuffer(NULL)
             6 {
             7 }
             8 
             9 CDSoundObject::~CDSoundObject()
            10 {
            11     Release();
            12 }
            13 
            14 void CDSoundObject::Release()
            15 {
            16     if(_pDS != NULL)
            17         _pDS->Release();
            18 }
            19 
            20 int CDSoundObject::Init(HWND hwnd)
            21 {
            22     _hWnd = hwnd;
            23     return CreateDSound();
            24 }
            25 
            26 int CDSoundObject::CreateDSound()
            27 {
            28     HRESULT hr = DirectSoundCreate(NULL, &_pDS, NULL);
            29     if(hr != DS_OK)
            30         return -1;
            31     _pDS->SetCooperativeLevel(_hWnd, DSSCL_NORMAL);
            32     return 0;
            33 }

                2.Wave播放對象
             1 #ifndef __DSWAVEOBJECT_H__
             2 #define __DSWAVEOBJECT_H__
             3 
             4 #include "DSoundObject.h"
             5 
             6 class CDSWaveObject : public CDSoundObject
             7 {
             8 protected:
             9 // .WAV file header
            10     struct WAVE_HEADER
            11     {
            12         char    riff_sig[4];            // 'RIFF'
            13         long    waveform_chunk_size;    // 8
            14         char    wave_sig[4];            // 'WAVE'
            15         char    format_sig[4];          // 'fmt ' (notice space after)
            16         long    format_chunk_size;      // 16;
            17         short   format_tag;             // WAVE_FORMAT_PCM
            18         short   channels;               // # of channels
            19         long    sample_rate;            // sampling rate
            20         long    bytes_per_sec;          // bytes per second
            21         short   block_align;            // sample block alignment
            22         short   bits_per_sample;        // bits per second
            23         char    data_sig[4];            // 'data'
            24         long    data_size;              // size of waveform data
            25     };
            26 public:
            27     CDSWaveObject();
            28     virtual ~CDSWaveObject();
            29 
            30     virtual int LoadFile(const std::string& file);
            31     virtual int Play();
            32     virtual int Pause();
            33     virtual int Stop();
            34 protected:
            35     virtual void Release();
            36 protected:
            37     int ReadWaveHeader(std::ifstream& ifs, WAVE_HEADER& header) const;
            38     int CreateDSBuffer(const WAVE_HEADER& header);
            39     int ReadWaveData(std::ifstream& ifs, size_t start, size_t count);
            40 };
            41 
            42 
            43 #endif
              1 #include <fstream>
              2 
              3 #include "DSWaveObject.h"
              4 
              5 CDSWaveObject::CDSWaveObject()
              6 : CDSoundObject(CDSoundObject::ST_WAVE)
              7 {
              8 }
              9 
             10 CDSWaveObject::~CDSWaveObject()
             11 {
             12     Release();
             13 }
             14 
             15 void CDSWaveObject::Release()
             16 {
             17     if(_pDSBuffer != NULL)
             18         _pDSBuffer->Release();
             19 }
             20 
             21 int CDSWaveObject::LoadFile(const std::string &file)
             22 {
             23     std::ifstream ifs;
             24     ifs.open(file.c_str(), std::ios::in | std::ios::binary);
             25     if(!ifs.is_open())
             26         return -1;
             27 
             28     WAVE_HEADER header;
             29     memset(&header, 0sizeof(WAVE_HEADER));
             30 
             31     if(ReadWaveHeader(ifs, header) != 0)
             32         return -1;
             33 
             34     if(CreateDSBuffer(header) != 0)
             35         return -1;
             36 
             37     if(ReadWaveData(ifs, 0, header.data_size) != 0)
             38         return -1;
             39 
             40     ifs.close();
             41 
             42     return 0;
             43 }
             44 
             45 int CDSWaveObject::ReadWaveHeader(std::ifstream &ifs, CDSWaveObject::WAVE_HEADER &header) const
             46 {
             47     ifs.seekg(0, std::ios::beg);
             48     ifs.read((char*)&header, sizeof(WAVE_HEADER));
             49     if(!ifs.good())
             50         return -1;
             51     if(memcmp(header.riff_sig, "RIFF"4|| memcmp(header.wave_sig, "WAVE"4||
             52        memcmp(header.format_sig, "fmt "4|| memcmp(header.data_sig, "data"4))
             53     {
             54         return -1;
             55     }
             56     return 0;
             57 }
             58 
             59 int CDSWaveObject::CreateDSBuffer(const CDSWaveObject::WAVE_HEADER &header)
             60 {
             61     WAVEFORMATEX wformat;
             62     memset(&wformat, 0sizeof(WAVEFORMATEX));
             63     wformat.wFormatTag = WAVE_FORMAT_PCM;
             64     wformat.nChannels = header.channels;
             65     wformat.nSamplesPerSec = header.sample_rate;
             66     wformat.wBitsPerSample = header.bits_per_sample;
             67     wformat.nBlockAlign = header.bits_per_sample/ 8 * header.channels;// header.block_align;
             68     wformat.nAvgBytesPerSec = header.sample_rate * header.block_align;//header.
             69     //wformat.cbSize = header.data_size;
             70 
             71     DSBUFFERDESC desc;
             72     memset(&desc, 0sizeof(DSBUFFERDESC));
             73     desc.dwSize = sizeof(DSBUFFERDESC);
             74     desc.dwFlags = DSBCAPS_CTRLVOLUME;
             75     desc.dwBufferBytes = header.data_size;
             76     desc.lpwfxFormat = &wformat;
             77 
             78     if(_pDSBuffer != NULL)
             79         _pDSBuffer->Release();
             80 
             81     HRESULT hr = _pDS->CreateSoundBuffer(&desc, &_pDSBuffer, NULL);
             82     if(hr != DS_OK)
             83         return -1;
             84     return 0;
             85 }
             86 
             87 int CDSWaveObject::ReadWaveData(std::ifstream &ifs, size_t start, size_t count)
             88 {
             89     LPVOID aptr1 = NULL, aptr2 = NULL;
             90     DWORD abyte1 = NULL, abyte2 = NULL;
             91 
             92     HRESULT hr = _pDSBuffer->Lock(start, count, &aptr1, &abyte1, &aptr2, &abyte2, 0);
             93     if(hr != DS_OK)
             94         return -1;
             95     
             96     ifs.read((char*)aptr1, abyte1);
             97     if(aptr2 != NULL)
             98         ifs.read((char*)aptr2, abyte2);
             99     _pDSBuffer->Unlock(aptr1, abyte1, aptr2, abyte2);
            100 
            101     return 0;    
            102 }
            103 
            104 int CDSWaveObject::Play()
            105 {
            106     if(_pDSBuffer == NULL)
            107         return -1;
            108     _pDSBuffer->SetCurrentPosition(0);
            109     _pDSBuffer->SetVolume(DSBVOLUME_MAX);
            110     _pDSBuffer->Play(00, DSBPLAY_LOOPING);
            111 
            112     return 0;
            113 }
            114 
            115 int CDSWaveObject::Pause()
            116 {
            117     return 0;
            118 }
            119 
            120 int CDSWaveObject::Stop()
            121 {
            122     _pDSBuffer->Stop();
            123     return 0;
            124 }

                源碼工程在這里,寫的倉促,僅供參考。使用了wxWidget庫,編譯是需要的。
               

            posted on 2009-03-19 23:21 codejie 閱讀(519) 評論(0)  編輯 收藏 引用 所屬分類: C++

            公告

            Using C++

            導航

            統計

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久无码专区国产精品发布| 久久这里只有精品18| 2021久久国自产拍精品| 91精品国产色综久久| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 丁香狠狠色婷婷久久综合| 久久精品中文字幕久久| 久久精品青青草原伊人| 久久国产热这里只有精品| 久久久无码精品亚洲日韩按摩 | 久久中文字幕无码专区| 成人国内精品久久久久影院| 久久久99精品成人片中文字幕| 精品国产青草久久久久福利| 国产一区二区精品久久岳| 国产成人精品久久二区二区| 香蕉久久永久视频| 欧美一区二区精品久久| 精品熟女少妇a∨免费久久| 久久精品国产网红主播| 性做久久久久久久久老女人| 99精品久久精品一区二区| 亚洲国产精品无码久久一线| 天堂久久天堂AV色综合| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 久久青草国产手机看片福利盒子| 欧美粉嫩小泬久久久久久久 | 中文字幕久久亚洲一区| 日本福利片国产午夜久久| 99久久无码一区人妻a黑| 亚洲AV无一区二区三区久久 | 国产精品欧美亚洲韩国日本久久| 久久这里只精品国产99热| 久久久WWW免费人成精品| 亚洲中文字幕无码久久2017| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久国产精品99精品国产987| 999久久久无码国产精品| 久久91精品国产91| 久久无码中文字幕东京热| 亚洲日本久久久午夜精品|