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

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>
            久久精品国产亚洲aⅴ| 欧美电影免费观看| 欧美高清你懂得| 久久免费视频网| 久久久视频精品| 久久网站免费| 欧美黄色小视频| 亚洲精品一区二区三区樱花| 亚洲国产精品久久久久婷婷884 | 国产精品青草久久| 国产精品美女久久久久久2018| 国产精品免费一区豆花| 国产亚洲福利| 亚洲经典视频在线观看| 制服丝袜激情欧洲亚洲| 欧美亚洲综合网| 久久综合久久综合九色| 亚洲国产高清自拍| 亚洲素人在线| 老妇喷水一区二区三区| 欧美视频一区二区三区| 国产专区综合网| 一区二区三区日韩在线观看| 先锋亚洲精品| 最新成人av网站| 性高湖久久久久久久久| 欧美成人午夜激情| 国产欧美一区二区精品婷婷| 亚洲欧洲日本国产| 欧美中日韩免费视频| 看片网站欧美日韩| 一二三区精品福利视频| 久久激情五月婷婷| 国产精品白丝av嫩草影院| 在线欧美日韩国产| 性色一区二区三区| 亚洲精品视频一区二区三区| 久久九九免费视频| 国产精品久久久久久久久久ktv | 久久在线免费| 亚洲网站视频| 欧美日韩成人| 在线免费日韩片| 久久久久久久久蜜桃| 中国日韩欧美久久久久久久久| 美女成人午夜| 依依成人综合视频| 久久精品人人做人人综合| 国产精品女人久久久久久| 亚洲天堂免费在线观看视频| 久久尤物视频| 国产精品资源| 亚洲永久免费视频| 99国产精品视频免费观看| 欧美大色视频| 亚洲精品视频在线看| 国产欧美日韩不卡免费| 亚洲视频欧美在线| 日韩特黄影片| 欧美日韩蜜桃| 亚洲综合精品四区| 日韩一区二区精品| 欧美日韩免费观看一区二区三区| 亚洲肉体裸体xxxx137| 美女性感视频久久久| 久久久国产视频91| 影音先锋日韩有码| 欧美成人三级在线| 欧美福利网址| 亚洲视频在线一区| 亚洲在线免费| 国产一区二区视频在线观看| 久久精品av麻豆的观看方式| 欧美资源在线观看| 亚洲第一色中文字幕| 亚洲高清在线播放| 欧美日韩国产精品 | 国产精品magnet| 亚洲综合视频网| 午夜欧美大片免费观看| 国产最新精品精品你懂的| 欧美18av| 欧美日韩中文字幕在线| 性高湖久久久久久久久| 欧美在线你懂的| 亚洲精品系列| 亚洲一级免费视频| 激情av一区二区| 亚洲日本激情| 国产亚洲精品7777| 亚洲高清不卡av| 国产精品国产自产拍高清av| 久久久久在线| 欧美日韩一区精品| 久久久久在线观看| 欧美日韩国产成人在线观看| 久久国产精品久久久| 欧美国产一区视频在线观看| 午夜一区在线| 欧美国产日韩一区| 欧美一区1区三区3区公司| 麻豆精品91| 久久精彩免费视频| 欧美日韩亚洲三区| 欧美电影在线免费观看网站| 国产精品久久久久aaaa| 亚洲第一毛片| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲你懂的在线视频| 性高湖久久久久久久久| 日韩视频一区| 欧美在线视频不卡| 亚洲午夜精品网| 欧美 日韩 国产一区二区在线视频| 亚洲女同在线| 欧美国产日本韩| 欧美黄色成人网| 韩国av一区二区三区四区| 一本在线高清不卡dvd| 亚洲精选久久| 美日韩免费视频| 蜜桃av一区二区| 国内精品久久久久伊人av| 亚洲视频在线观看网站| 日韩视频免费观看高清在线视频| 久久国产精品久久久久久久久久 | 欧美激情性爽国产精品17p| 国产伦精品一区二区三区免费| 亚洲精品一区二区三区樱花 | 亚洲乱码国产乱码精品精| 亚洲第一狼人社区| 欧美自拍偷拍| 久久精品国产96久久久香蕉| 国产精品久久久久久久app| 日韩亚洲在线| 在线视频精品一| 欧美人与性动交cc0o| 亚洲第一偷拍| 亚洲精品网站在线播放gif| 久久综合久久久久88| 久久深夜福利免费观看| 国产亚洲精久久久久久| 午夜精品视频| 久久免费视频一区| 极品中文字幕一区| 久久尤物视频| 亚洲精品乱码久久久久久日本蜜臀| 亚洲精品1区| 欧美日韩国产成人在线91| 亚洲精品偷拍| 午夜视频在线观看一区| 国产精品乱码一区二三区小蝌蚪| 亚洲自拍偷拍一区| 久久琪琪电影院| 亚洲第一在线| 欧美日韩国产成人在线91| 中文高清一区| 久久久久久久久岛国免费| 韩国视频理论视频久久| 裸体一区二区| 一级成人国产| 久久久久免费观看| 亚洲国产精品va在线看黑人| 欧美精品二区| 在线视频你懂得一区| 久久国产日本精品| 亚洲激情午夜| 一区二区三区免费网站| 亚洲综合二区| 一区二区在线看| 欧美精品久久久久久久| 99在线精品观看| 久久久久久夜| 亚洲视频专区在线| 国内精品久久久久久| 欧美黑人一区二区三区| 亚洲欧美成人| 亚洲国产电影| 久久国产免费| 夜夜嗨一区二区三区| 国产日韩在线一区| 欧美精品一区视频| 欧美一区二区三区免费视| 亚洲国产成人av在线| 午夜精品久久久久久久99黑人| 在线不卡欧美| 国产精品免费视频观看| 免费高清在线一区| 亚洲欧美成人精品| 亚洲精品一区二区三区蜜桃久| 久久久久国产一区二区三区四区| 亚洲另类在线视频| 精品999在线观看| 国产精品区二区三区日本| 欧美.www| 久久国产欧美| 亚洲在线中文字幕| 99国产精品国产精品毛片| 免费观看在线综合| 久久精品国产一区二区三|