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

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

公告

Using C++

導航

統計

留言簿(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>
            久久精品中文字幕一区| 国产精品久久二区二区| 99成人在线| 一本一本a久久| 久久久97精品| 亚洲电影免费观看高清| 亚洲精品欧美一区二区三区| 亚洲一区二区日本| 久久久久中文| 亚洲精品久久久久久久久久久| 亚洲欧洲在线一区| 亚洲欧美www| 欧美成人免费播放| 一本一本久久a久久精品综合妖精| 欧美日韩影院| 亚洲欧洲日夜超级视频| 亚洲免费高清视频| 久久婷婷综合激情| 国产精品人成在线观看免费| 激情综合久久| 欧美性jizz18性欧美| 狠狠色狠狠色综合日日tαg| 亚洲日本成人女熟在线观看| 亚洲国产精品www| 亚洲午夜女主播在线直播| 久色成人在线| 国产在线拍揄自揄视频不卡99| 亚洲一区二区伦理| 久久精品国内一区二区三区| 夜久久久久久| 91久久国产综合久久蜜月精品 | 亚洲大胆女人| 欧美高清视频一区二区| 欧美日韩成人精品| 日韩视频在线免费| 亚洲人在线视频| 国产揄拍国内精品对白| 日韩一级黄色大片| 亚洲高清在线观看| 亚洲二区精品| 国外精品视频| 亚洲欧美综合精品久久成人 | 亚洲精品永久免费| 欧美日韩亚洲一区二| 久久综合狠狠综合久久综合88| 久久国产视频网| 国产在线不卡精品| 亚洲午夜在线观看| 亚洲精选一区二区| 91久久国产综合久久| 亚洲国产高清在线观看视频| 小嫩嫩精品导航| 国产亚洲视频在线| 男男成人高潮片免费网站| 欧美一区二区高清在线观看| 韩国一区二区三区在线观看| 亚洲永久免费观看| 伊人精品成人久久综合软件| 亚洲国产另类久久久精品极度| 好看的日韩av电影| 久久精品国产77777蜜臀| 久久国产毛片| 麻豆成人精品| 亚洲一区二区久久| 欧美视频日韩视频在线观看| 久久久久9999亚洲精品| 欧美成人资源| 欧美一区二区观看视频| 久久久久**毛片大全| 久久久无码精品亚洲日韩按摩| 国产欧美一区视频| 亚洲福利视频一区二区| 亚洲三级色网| 欧美精品黄色| 久久久久国色av免费看影院| 国产一区二区三区最好精华液| 亚洲欧美精品suv| 亚洲经典在线看| 午夜精品在线视频| 久久天堂精品| 久久综合网色—综合色88| 久久精选视频| 欧美国产日韩一区二区三区| 国产精品女人网站| 亚洲黄色成人| 亚洲一本大道在线| 国产亚洲欧洲| 欧美高清视频在线播放| 久久久久久综合| 亚洲高清视频在线观看| 欧美久久久久久| 蜜臀av性久久久久蜜臀aⅴ| 国产精品电影在线观看| 亚洲欧美日韩直播| 欧美大片网址| 亚洲男人的天堂在线| 国产自产高清不卡| 欧美啪啪成人vr| 欧美一站二站| 欧美一二三区在线观看| 欧美日韩一区二区三区在线看| 亚洲性夜色噜噜噜7777| 欧美成人激情在线| 亚洲欧美日韩人成在线播放| 亚洲电影在线| 国产精品综合久久久| 亚洲午夜一区| 亚洲国产精品成人一区二区| 午夜免费在线观看精品视频| 国产精品久久久久久户外露出| 欧美在线亚洲| 一本色道久久| 亚洲国产精品成人va在线观看| 性做久久久久久免费观看欧美| 亚洲国产天堂久久综合| 国产日韩欧美一区二区| 亚洲欧洲av一区二区三区久久| 亚洲国产成人av好男人在线观看| 香蕉久久夜色精品国产| 日韩手机在线导航| 影音先锋在线一区| 国产欧美一区二区三区国产幕精品 | 永久免费精品影视网站| 国产精品分类| 欧美日本高清视频| 免播放器亚洲| 久久精品国产综合精品| 亚洲欧美日韩精品久久亚洲区| 日韩系列欧美系列| 亚洲第一级黄色片| 男女精品网站| 免费日韩av片| 久久亚洲影音av资源网| 久久激五月天综合精品| 性做久久久久久| 性久久久久久久| 亚洲欧美视频在线观看| 亚洲图片在线观看| 国产无一区二区| 国产精品免费在线| 欧美日韩一区二区视频在线观看| 欧美成人精品激情在线观看| 狼人社综合社区| 久久亚洲国产精品日日av夜夜| 久久久久久国产精品mv| 亚洲激情亚洲| 亚洲人精品午夜| 亚洲精品一二三| 一区二区福利| 亚洲视频一区二区| 免费观看成人| 欧美激情导航| 亚洲精品免费观看| 日韩亚洲欧美成人| 欧美日韩国产高清| 欧美视频在线视频| 国产精品私人影院| 国产香蕉久久精品综合网| 国产一区二区三区四区| 1024亚洲| 一区二区高清在线| 激情丁香综合| 亚洲黑丝一区二区| 一区二区三区av| 欧美一区二区三区久久精品| 久久久国产精彩视频美女艺术照福利| 久久免费视频一区| 亚洲国产精品嫩草影院| 一区二区高清在线| 亚洲欧洲日本在线| 国产亚洲永久域名| 亚洲国产高清在线观看视频| 一区二区三区久久久| 欧美影院在线| 亚洲第一毛片| 亚洲一区二区三区在线视频 | 久久国产福利国产秒拍| 亚洲精品中文字幕在线| 99精品国产福利在线观看免费 | 99视频一区| 久久精品二区三区| 亚洲精品久久久久久久久| 久久精品国产第一区二区三区| 久久蜜臀精品av| 国产精品国产三级国产普通话蜜臀| 韩日成人av| 亚洲欧美日韩成人| 亚洲高清免费| 性欧美xxxx大乳国产app| 欧美激情一二三区| 狠狠色综合色区| 香蕉久久国产| 99精品欧美一区二区三区| 久久婷婷丁香| 国产色产综合产在线视频| 亚洲视频1区| 在线观看亚洲a| 最近中文字幕日韩精品| 精品不卡视频| 久久精品国产精品亚洲综合 |