青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Codejie's C++ Space

Using C++

使用DirectSound播放WAVE文件

    根據(jù)Loveddy上的的資料和源碼,寫了一個(gè)可以播放WAVE文件的程序, 上傳。

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

 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 閱讀(536) 評論(0)  編輯 收藏 引用 所屬分類: C++

公告

Using C++

導(dǎo)航

統(tǒng)計(jì)

留言簿(73)

隨筆分類(513)

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美在线观看www| 欧美经典一区二区| 亚洲国语精品自产拍在线观看| 亚洲一区二区三区在线| 一本色道久久99精品综合| 一本色道久久综合亚洲精品小说| 99国产精品视频免费观看一公开 | 中文在线一区| 亚洲一二三区精品| 欧美在线播放一区二区| 久久香蕉国产线看观看av| 欧美电影在线免费观看网站| 亚洲国产综合在线| 亚洲小说春色综合另类电影| 欧美中文在线视频| 欧美精品一区二区精品网| 欧美亚韩一区| 伊人夜夜躁av伊人久久| 一区二区三区久久精品| 久久久亚洲欧洲日产国码αv| 亚洲高清电影| 午夜在线精品| 欧美激情成人在线| 国产自产v一区二区三区c| 亚洲每日在线| 久久久久久久波多野高潮日日| 亚洲国产导航| 欧美一区二区三区男人的天堂| 蜜月aⅴ免费一区二区三区| 国产精品无码专区在线观看| 亚洲人成网站777色婷婷| 欧美在线一二三四区| 亚洲欧洲三级| 久久久久免费视频| 国产麻豆视频精品| 亚洲视频1区| 亚洲承认在线| 久久精品亚洲一区二区三区浴池| 国产精品高精视频免费| 亚洲精品网址在线观看| 久久久亚洲午夜电影| 亚洲欧美国产毛片在线| 欧美激情亚洲激情| 最新日韩在线视频| 国产麻豆一精品一av一免费| 亚洲精品久久久蜜桃| 韩日在线一区| 一区二区毛片| 亚洲电影天堂av| 欧美亚洲日本国产| 国产精品人人做人人爽| av成人黄色| 欧美黄色免费网站| 久久婷婷国产综合尤物精品| 国产日韩精品一区二区浪潮av| 一区二区三区国产在线观看| 亚洲国产欧美日韩| 久久日韩粉嫩一区二区三区| 国产夜色精品一区二区av| 亚洲欧美日韩国产综合| 一区二区三区精品视频| 欧美日韩视频在线观看一区二区三区| 亚洲国产成人高清精品| 欧美91大片| 欧美3dxxxxhd| 日韩亚洲欧美成人一区| 91久久国产综合久久蜜月精品| 久久综合网色—综合色88| 在线欧美日韩国产| 欧美激情一二区| 欧美成年人网| 中文成人激情娱乐网| 这里只有精品视频在线| 国产精品麻豆欧美日韩ww| 亚洲综合精品四区| 欧美亚洲一区| 亚洲国产日韩综合一区| 亚洲黑丝一区二区| 欧美日韩精品福利| 亚洲欧美日韩精品久久| 欧美在线观看网站| 亚洲黄色高清| 99视频精品| 国产区精品在线观看| 老司机午夜免费精品视频| 鲁大师影院一区二区三区| 亚洲免费av观看| 亚洲午夜女主播在线直播| 国产视频久久久久久久| 欧美成人精品福利| 欧美视频你懂的| 久久精品国产69国产精品亚洲| 久久全球大尺度高清视频| 亚洲国产精品电影| 亚洲素人一区二区| 国产一区二区高清视频| 91久久精品美女高潮| 国产精品入口夜色视频大尺度 | 国产一区二区三区精品欧美日韩一区二区三区 | 一区在线观看| 亚洲精品视频一区| 国产一区二区在线免费观看| 亚洲国产老妈| 国产一区二区高清视频| 99国产一区二区三精品乱码| 国内精品久久久久久久影视麻豆| 亚洲国产一区二区a毛片| 国产欧美另类| 日韩视频免费| 最新亚洲激情| 久久视频国产精品免费视频在线 | 亚洲第一成人在线| 亚洲一级片在线观看| 亚洲激情一区二区| 日韩一级片网址| 在线观看亚洲a| 99国产精品久久久久老师| 亚洲一区黄色| 亚洲人www| 久久久久久亚洲精品中文字幕 | 宅男精品视频| 夜夜嗨av一区二区三区网页| 久久久精品五月天| 欧美在线亚洲在线| 国产精品入口夜色视频大尺度| 亚洲乱码国产乱码精品精可以看| 亚洲人被黑人高潮完整版| 久久久女女女女999久久| 欧美专区在线播放| 国产欧美日本一区视频| 亚洲一区二区视频| 亚洲欧美日韩国产中文在线| 欧美丝袜第一区| 日韩亚洲精品视频| 在线一区二区日韩| 欧美性片在线观看| 一区二区三区高清视频在线观看| 99亚洲视频| 欧美日韩一区二区在线播放| 亚洲免费观看高清完整版在线观看熊| 亚洲欧洲日韩综合二区| 欧美国产一区二区| 亚洲精品在线免费观看视频| 在线综合亚洲| 国产精品欧美日韩| 亚洲欧美成人精品| 欧美中文字幕在线| 樱花yy私人影院亚洲| 蜜桃av一区| 亚洲人成亚洲人成在线观看| 在线亚洲成人| 国产伦精品一区二区三区高清版| 亚洲区第一页| 亚洲国产精品一区二区第四页av | 欧美日韩国产123| 日韩网站在线看片你懂的| 国产精品99久久久久久久vr| 欧美视频在线观看一区二区| 亚洲视频在线观看三级| 欧美一区二区三区视频免费| 黄色日韩网站| 欧美激情精品久久久久久| 日韩视频在线你懂得| 午夜一级久久| 亚洲高清一区二| 欧美性开放视频| 久久精品日韩| av成人毛片| 美女精品在线| 亚洲午夜视频在线| 狠狠干综合网| 欧美日韩一区三区四区| 欧美在线视频网站| 亚洲久久一区二区| 久久先锋影音av| 亚洲一区二区三区涩| 在线播放豆国产99亚洲| 欧美三级在线视频| 浪潮色综合久久天堂| 亚洲午夜精品17c| 欧美国产91| 久久久一区二区三区| av成人免费观看| 在线免费观看视频一区| 国产精品人人做人人爽人人添| 久热爱精品视频线路一| 午夜精品亚洲| 亚洲精品一区中文| 亚洲国产精品久久久久| 久久精品伊人| 亚洲主播在线播放| 日韩特黄影片| 亚洲激情网站免费观看| 好看的日韩av电影| 国产欧美日本一区视频| 国产精品久久久对白| 欧美日韩国产三区| 欧美激情精品久久久久久大尺度| 久久精品电影| 欧美一区二区视频在线观看|