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

Codejie's C++ Space

Using C++

更新 - 使用DirectSound播放Wave文件

    修改了一下DSound程序,增加播放Notify,支持播放Buffer。這樣就可以連續(xù)播放一個比較大的Wave文件了。源碼在這里。下面是主要的代碼:

    DSoundObject.h
 1 #ifndef __DSOUNDOBJECT_H__
 2 #define __DSOUNDOBJECT_H__
 3 
 4 #include <windows.h>
 5 #include <dsound.h>
 6 
 7 #include <string>
 8 
 9 extern HANDLE _eventNotify[2];//這句很奇怪,如果改成CDSoundObject的static成員,VCExpress鏈接會出錯,不明原因。
10 
11 class CDSoundObject
12 {
13 public:
14     enum SoundType { ST_WAVE, ST_MP3 };
15     static const DWORD SIZE_DS_BUFFER    =    32 * 1024;
16 public:
17     CDSoundObject(SoundType type);
18     virtual ~CDSoundObject();
19 
20     virtual int Init(HWND hwnd);
21     virtual int LoadFile(const std::string& file) = 0;
22 
23     virtual int Play() = 0;
24     virtual int Pause() = 0;
25     virtual int Stop() = 0;
26     virtual bool IsPlaying() const = 0;
27     virtual size_t Duration() const = 0;
28 protected:
29     virtual void Release();
30     virtual int CreateDSound();
31     virtual int CreateDSoundBuffer();
32 
33     virtual int LoadData(DWORD start, DWORD count) = 0;
34     virtual int PlayOver() = 0;
35 protected:
36     HWND _hWnd;
37     SoundType _eType;
38     IDirectSound * _pDS;
39     IDirectSoundBuffer * _pDSBuffer;
40     IDirectSoundNotify8* _pDSNotify;
41 protected:
42     int CreateNotifyThread();
43     void ReleaseNotifyThread();
44     static DWORD NotifyHandleProc(LPVOID param);
45 public:
46     DWORD _dwNotifyThreadID;
47     HANDLE _hNotifyThread;
48 
49     DSBPOSITIONNOTIFY _notifyPos[2];
50 };
51 
52 #endif

    DSoundObject.cpp
  1 #include "DSoundObject.h"
  2 
  3 HANDLE _eventNotify[2];
  4 
  5 CDSoundObject::CDSoundObject(CDSoundObject::SoundType type)
  6 : _eType(type)
  7 , _pDS(NULL), _pDSBuffer(NULL), _pDSNotify(NULL)
  8 , _dwNotifyThreadID(0), _hNotifyThread(NULL)
  9 {
 10 }
 11 
 12 CDSoundObject::~CDSoundObject()
 13 {
 14     Release();
 15 }
 16 
 17 void CDSoundObject::Release()
 18 {
 19     ReleaseNotifyThread();
 20 
 21     if(_pDS != NULL)
 22         _pDS->Release();
 23 }
 24 
 25 int CDSoundObject::Init(HWND hwnd)
 26 {
 27     _hWnd = hwnd;
 28 
 29     return CreateDSound();
 30 }
 31 
 32 int CDSoundObject::CreateDSound()
 33 {
 34     HRESULT hr = DirectSoundCreate(NULL, &_pDS, NULL);
 35     if(hr != DS_OK)
 36         return -1;
 37     _pDS->SetCooperativeLevel(_hWnd, DSSCL_NORMAL);
 38     return 0;
 39 }
 40 
 41 int CDSoundObject::CreateDSoundBuffer()
 42 {
 43     //if(CreateNotifyThread() != 0)
 44     //    return -1;
 45     return 0;
 46 }
 47 
 48 int CDSoundObject::CreateNotifyThread()
 49 {
 50     //event
 51     _eventNotify[0= CreateEvent(NULL, FALSE, FALSE, NULL);
 52     _eventNotify[1= CreateEvent(NULL, FALSE, FALSE, NULL);
 53 
 54     _hNotifyThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)NotifyHandleProc, (LPVOID)this0&_dwNotifyThreadID);
 55     if(_hNotifyThread == NULL)
 56         return -1;
 57 
 58     HRESULT hr = _pDSBuffer->QueryInterface(IID_IDirectSoundNotify8, (void**)&_pDSNotify);
 59     if(hr != DS_OK)
 60         return -1;
 61 
 62     _notifyPos[0].dwOffset = (SIZE_DS_BUFFER / 2- 1;
 63     _notifyPos[0].hEventNotify = _eventNotify[0];
 64     _notifyPos[1].dwOffset = SIZE_DS_BUFFER - 1;
 65     _notifyPos[1].hEventNotify = _eventNotify[1];
 66 
 67     hr = _pDSNotify->SetNotificationPositions(2, _notifyPos);
 68     if(hr != DS_OK)
 69         return -1;
 70 
 71     return 0;
 72 }
 73 
 74 void CDSoundObject::ReleaseNotifyThread()
 75 {
 76     if(_hNotifyThread != NULL)
 77     {
 78         TerminateThread(_hNotifyThread, 0);
 79         CloseHandle(_hNotifyThread);
 80         _hNotifyThread = NULL;
 81     }
 82     for(int i = 0; i < 2++ i)
 83     {
 84         if(_eventNotify[i] != NULL)
 85         {
 86             CloseHandle(_eventNotify[i]);
 87             _eventNotify[i] = NULL;
 88         }
 89     }
 90 
 91     if(_pDSNotify != NULL)
 92     {
 93         _pDSNotify->Release();
 94         _pDSNotify = NULL;
 95     }
 96 }
 97 
 98 DWORD CDSoundObject::NotifyHandleProc(LPVOID param)
 99 {
100     CDSoundObject* obj = (CDSoundObject*)(param);
101     if(obj == NULL)
102         return -1;
103 
104     while(true)
105     {
106         DWORD ret = MsgWaitForMultipleObjects(2, _eventNotify, FALSE, INFINITE, QS_ALLEVENTS);
107         if(ret == WAIT_FAILED)
108             return -1;
109         
110         DWORD notify = ret - WAIT_OBJECT_0;
111         if(notify == 0)
112         {
113             if(obj->LoadData(0, SIZE_DS_BUFFER / 2!= 0)
114                 break;
115         }
116         else if(notify == 1)
117         {
118             if(obj->LoadData(SIZE_DS_BUFFER / 2 , SIZE_DS_BUFFER / 2!= 0)
119                 break;
120         }
121         else
122         {
123             continue;
124 //            return -1;
125         }
126     }
127 
128     obj->PlayOver();
129 
130     return 0;
131 }

    DSWaveObject.h
 1 #ifndef __DSWAVEOBJECT_H__
 2 #define __DSWAVEOBJECT_H__
 3 
 4 #include <fstream>
 5 #include <string>
 6 
 7 #include "DSoundObject.h"
 8 
 9 class CDSWaveObject : public CDSoundObject
10 {
11 protected:
12 // .WAV file header
13     struct WAVE_HEADER
14     {
15         char    riff_sig[4];            // 'RIFF'
16         long    waveform_chunk_size;    // 8
17         char    wave_sig[4];            // 'WAVE'
18         char    format_sig[4];          // 'fmt ' (notice space after)
19         long    format_chunk_size;      // 16;
20         short   format_tag;             // WAVE_FORMAT_PCM
21         short   channels;               // # of channels
22         long    sample_rate;            // sampling rate
23         long    bytes_per_sec;          // bytes per second
24         short   block_align;            // sample block alignment
25         short   bits_per_sample;        // bits per second
26         char    data_sig[4];            // 'data'
27         long    data_size;              // size of waveform data
28     };
29 
30 public:
31     CDSWaveObject();
32     virtual ~CDSWaveObject();
33 
34     virtual int LoadFile(const std::string& file);
35     virtual int Play();
36     virtual int Pause();
37     virtual int Stop();
38     virtual bool IsPlaying() const;
39     virtual size_t Duration() const;
40 protected:
41     virtual void Release();
42 protected:
43     int LoadWaveData();
44     int ReadWaveHeader(WAVE_HEADER& header);
45     int CreateDSBuffer(const WAVE_HEADER& header);
46 
47     virtual int LoadData(DWORD start, DWORD count);
48     virtual int PlayOver();
49 private:
50     std::string _strFileName;
51 
52     WAVE_HEADER _headerWave;
53     WAVEFORMATEX _fmtWave;
54     std::ifstream _ifStream;
55     DWORD _dwReadSize;
56     DWORD _dwPlayPos; 
57 };
58 
59 
60 #endif

    DSWaveObject.cpp
  1 #include "DSWaveObject.h"
  2 
  3 CDSWaveObject::CDSWaveObject()
  4 : CDSoundObject(CDSoundObject::ST_WAVE)
  5 , _dwReadSize(0)
  6 , _dwPlayPos(0)
  7 {
  8 }
  9 
 10 CDSWaveObject::~CDSWaveObject()
 11 {
 12     Release();
 13 }
 14 
 15 void CDSWaveObject::Release()
 16 {
 17     ReleaseNotifyThread();
 18 
 19     if(_pDSBuffer != NULL)
 20     {
 21         _pDSBuffer->Stop();
 22         _pDSBuffer->Release();
 23         _pDSBuffer = NULL;
 24     }
 25     if(_ifStream.is_open())
 26         _ifStream.close();
 27 }
 28 
 29 int CDSWaveObject::LoadFile(const std::string &file)
 30 {
 31     Release();
 32 
 33     _ifStream.open(file.c_str(), std::ios::in | std::ios::binary);
 34     if(!_ifStream.is_open())
 35         return -1;
 36 
 37     memset(&_headerWave, 0sizeof(WAVE_HEADER));
 38 
 39     if(ReadWaveHeader(_headerWave) != 0)
 40         return -1;
 41 
 42     if(CreateDSBuffer(_headerWave) != 0)
 43         return -1;
 44 
 45     return 0;
 46 }
 47 
 48 int CDSWaveObject::LoadWaveData()
 49 {
 50     _dwPlayPos = 0;
 51     _dwReadSize = 0;
 52 
 53     _ifStream.clear();
 54 
 55     _ifStream.seekg(sizeof(WAVE_HEADER), std::ios::beg);
 56     if(LoadData(0, CDSoundObject::SIZE_DS_BUFFER) != 0)
 57     {
 58         return -1;
 59     }
 60 
 61     ReleaseNotifyThread();
 62 
 63     if(CreateNotifyThread() != 0)
 64         return -1;
 65     return 0;
 66 }
 67 
 68 int CDSWaveObject::ReadWaveHeader(CDSWaveObject::WAVE_HEADER &header)
 69 {
 70     _ifStream.seekg(0, std::ios::beg);
 71     _ifStream.read((char*)&header, sizeof(WAVE_HEADER));
 72     if(!_ifStream.good())
 73         return -1;
 74     if(memcmp(header.riff_sig, "RIFF"4|| memcmp(header.wave_sig, "WAVE"4||
 75        memcmp(header.format_sig, "fmt "4|| memcmp(header.data_sig, "data"4))
 76     {
 77         return -1;
 78     }
 79     return 0;
 80 }
 81 
 82 int CDSWaveObject::CreateDSBuffer(const CDSWaveObject::WAVE_HEADER &header)
 83 {
 84 //    WAVEFORMATEX wformat;
 85     memset(&_fmtWave, 0sizeof(WAVEFORMATEX));
 86     _fmtWave.wFormatTag = WAVE_FORMAT_PCM;
 87     _fmtWave.nChannels = header.channels;
 88     _fmtWave.nSamplesPerSec = header.sample_rate;
 89     _fmtWave.wBitsPerSample = header.bits_per_sample;
 90     _fmtWave.nBlockAlign = header.bits_per_sample / 8 * header.channels;// header.block_align;
 91     _fmtWave.nAvgBytesPerSec = header.sample_rate * header.block_align;//header.
 92     //wformat.cbSize = header.data_size;
 93 
 94     DSBUFFERDESC desc;
 95     memset(&desc, 0sizeof(DSBUFFERDESC));
 96     desc.dwSize = sizeof(DSBUFFERDESC);
 97     desc.dwFlags = DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_LOCSOFTWARE;
 98     desc.dwBufferBytes = CDSoundObject::SIZE_DS_BUFFER;//header.data_size;
 99     desc.lpwfxFormat = &_fmtWave;
100 
101     if(_pDSBuffer != NULL)
102         _pDSBuffer->Release();
103 
104     HRESULT hr = _pDS->CreateSoundBuffer(&desc, &_pDSBuffer, NULL);
105     if(hr != DS_OK)
106         return -1;
107     
108     return 0;
109 }
110 
111 int CDSWaveObject::LoadData(DWORD start, DWORD count)
112 {
113     if(!_ifStream.good())
114         return -1;
115     if(_dwReadSize >= _headerWave.data_size)
116         return -1;
117 
118     LPVOID aptr1 = NULL, aptr2 = NULL;
119     DWORD abyte1 = NULL, abyte2 = NULL;
120 
121     HRESULT hr = _pDSBuffer->Lock(start, count, &aptr1, &abyte1, &aptr2, &abyte2, 0);
122     if(hr != DS_OK)
123         return -1;
124     
125     _ifStream.read((char*)aptr1, abyte1);
126     if(aptr2 != NULL)
127         _ifStream.read((char*)aptr2, abyte2);
128 
129     _pDSBuffer->Unlock(aptr1, abyte1, aptr2, abyte2);
130 
131     _dwReadSize += count;
132 
133     return 0;
134 }
135 
136 int CDSWaveObject::Play()
137 {
138     if(_dwPlayPos == 0)
139     {
140         LoadWaveData();
141     }
142 
143     _pDSBuffer->SetCurrentPosition(_dwPlayPos);
144     _pDSBuffer->SetVolume(-2000);//DSBVOLUME_MAX);
145     _pDSBuffer->Play(00, DSBPLAY_LOOPING);
146 
147     return 0;
148 }
149 
150 int CDSWaveObject::Pause()
151 {
152     if(_pDSBuffer == NULL)
153         return -1;
154     HRESULT hr = _pDSBuffer->GetCurrentPosition(&_dwPlayPos, NULL);
155     if(hr != DS_OK)
156         return -1;
157     _pDSBuffer->Stop();
158 
159     return 0;
160 }
161 
162 int CDSWaveObject::Stop()
163 {
164     if(_pDSBuffer == NULL)
165         return -1;
166     _pDSBuffer->Stop();
167     _dwPlayPos = 0;
168 
169     return 0;
170 }
171 
172 bool CDSWaveObject::IsPlaying() const
173 {
174     if(_pDSBuffer == NULL)
175         return false;
176 
177     DWORD status = 0;
178     HRESULT hr = _pDSBuffer->GetStatus(&status);
179     if(hr != DS_OK)
180         return false;
181     return ((status & DSBSTATUS_PLAYING) == DSBSTATUS_PLAYING ? true : false);
182 }
183 
184 size_t CDSWaveObject::Duration() const
185 {
186     return (_headerWave.data_size * 1000 / _fmtWave.nAvgBytesPerSec);
187     //if(_pDSBuffer == NULL)
188     //    return 0;
189     //WAVEFORMATEX wformat;
190     //HRESULT hr = _pDSBuffer->GetFormat(&wformat, sizeof(WAVEFORMATEX), NULL);
191     //if(hr != DS_OK)
192     //    return 0;
193 
194     //DSBCAPS caps;
195     //memset(&caps, 0, sizeof(DSBCAPS));
196     //caps.dwSize = sizeof(DSBCAPS);
197     //hr = _pDSBuffer->GetCaps(&caps);
198     //if(hr != DS_OK)
199     //    return -1;
200 
201     //return (caps.dwBufferBytes * 1000 / wformat.nAvgBytesPerSec);
202 }
203 
204 int CDSWaveObject::PlayOver()
205 {
206     return Stop();
207 }
208 


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

公告

Using C++

導(dǎo)航

統(tǒng)計

留言簿(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欧美| 欧美精品播放| 久久av资源网| 欧美人妖在线观看| 蜜月aⅴ免费一区二区三区| 国产精品v亚洲精品v日韩精品 | 亚洲精品视频在线观看免费| 国产老女人精品毛片久久| 亚洲激精日韩激精欧美精品| 亚洲欧美视频在线| 亚洲理伦在线| 久久人人爽爽爽人久久久| 亚洲欧美日韩电影| 欧美久久久久中文字幕| 亚洲永久免费观看| 在线亚洲观看| 欧美成人在线免费观看| 美女主播视频一区| 宅男在线国产精品| 国内精品久久久久久| 亚洲欧美另类久久久精品2019| 亚洲视屏一区| 欧美特黄一级大片| 亚洲免费成人| 亚洲精品视频二区| 欧美激情网站在线观看| 午夜欧美精品| 久久久久久日产精品| 国产视频久久久久| 久久国产精品久久久久久电车| 性欧美大战久久久久久久免费观看| 欧美日韩一区二区三区在线看| 亚洲精品一区二区三区樱花 | 欧美ed2k| 亚洲欧洲一区二区三区| 久久久久久久久久码影片| 国产主播喷水一区二区| 欧美日韩亚洲一区二区三区四区 | 久久亚洲视频| 亚洲欧美在线免费| 洋洋av久久久久久久一区| 亚洲午夜久久久| 欧美日韩免费网站| 免费久久99精品国产自| 久久狠狠久久综合桃花| 亚洲影视综合| 一本久久综合亚洲鲁鲁五月天| 亚洲私拍自拍| 夜夜精品视频| 亚洲乱码视频| 亚洲精品日产精品乱码不卡| 黄色日韩精品| 欧美www视频在线观看| 久久不射2019中文字幕| 亚洲欧美日韩国产中文 | 亚洲男女毛片无遮挡| 夜夜嗨av一区二区三区| 亚洲精品视频在线看| 亚洲国产欧美一区| 一区二区三区欧美在线| 日韩视频第一页| 日韩一级黄色av| 国产精品一区二区你懂的| 欧美日韩在线电影| 欧美揉bbbbb揉bbbbb| 欧美日产在线观看| 欧美在线免费观看视频| 亚洲精品护士| 久久久国产精彩视频美女艺术照福利| 午夜精品久久久久久久久久久久久| 一区二区三区在线视频播放| 欧美日韩国产在线播放网站| 欧美精品二区| 欧美视频三区在线播放| 国产精品草草| 国产日韩欧美不卡在线| 国产一区二区三区的电影| 欧美精品手机在线| 欧美日韩精品在线视频| 欧美色欧美亚洲高清在线视频| 欧美日韩日日骚| 国产精品男女猛烈高潮激情 | 久久综合九色综合欧美狠狠| 在线视频你懂得一区二区三区| 欧美a级大片| 亚洲第一福利在线观看| 久久久久国内| 欧美v日韩v国产v| 91久久线看在观草草青青| av成人天堂| 欧美一区二区视频在线观看| 亚洲婷婷综合色高清在线 | 欧美日韩一区二区三区在线观看免 | 一区二区三区四区五区在线| 亚洲一区二区3| 久久高清一区| 欧美久久久久久久| 国产欧美大片| 国产精品日韩久久久久| 欧美日韩精品一二三区| 国产精品网站在线观看| 极品少妇一区二区| 一区二区三区精品视频在线观看| 欧美一级片久久久久久久| 奶水喷射视频一区| 野花国产精品入口| 久久乐国产精品| 欧美在线免费观看| 欧美精品在线观看一区二区| 国产精品青草久久| 亚洲国产精品v| 亚洲电影中文字幕| 亚洲在线观看| 午夜精品999| 亚洲承认在线| 亚洲国产午夜| 香蕉成人啪国产精品视频综合网| 女生裸体视频一区二区三区| 国产精品捆绑调教| 亚洲裸体视频| 美脚丝袜一区二区三区在线观看 | 亚洲视频欧美视频| 另类国产ts人妖高潮视频| 国产精品欧美日韩一区二区| 最新亚洲视频| 99香蕉国产精品偷在线观看| 久久久久久网址| 一本久道久久久| 欧美成人精品在线观看| 精品成人在线| 欧美一区二区三区四区在线观看地址| 久久精品国产一区二区三区免费看 | 欧美在线黄色| 国产精品乱子乱xxxx| 99xxxx成人网| 欧美激情网友自拍| 亚洲精品乱码久久久久久按摩观| 欧美自拍丝袜亚洲| 国产精品一区视频网站| 亚洲天堂久久| 亚洲毛片网站| 欧美精品一区二区三区久久久竹菊| 一区二区三区在线观看国产| 欧美在线高清| 午夜精品亚洲一区二区三区嫩草| 欧美三级不卡| 在线视频日韩| 日韩视频一区二区三区在线播放免费观看| 久热精品视频在线| 一色屋精品亚洲香蕉网站| 99riav久久精品riav| 亚洲电影激情视频网站| 鲁大师影院一区二区三区| 欧美日韩精品久久久| 亚洲人妖在线| 91久久精品美女高潮| 嫩模写真一区二区三区三州| 最新69国产成人精品视频免费| 欧美成年人在线观看| 久久一区亚洲| 亚洲精品视频免费在线观看| 亚洲电影天堂av| 欧美福利电影网| 国产日产高清欧美一区二区三区| 亚洲欧美日韩国产综合| 亚洲一区二区av电影| 国产精品久久久久久久久久久久久 | 久久久99精品免费观看不卡| 欧美三区在线| 亚洲欧美资源在线| 午夜精品视频网站| 韩国av一区二区三区在线观看| 久久午夜视频| 亚洲一区二区视频在线| 国产美女精品视频免费观看| 久久成人av少妇免费| 久久久国产精品一区二区三区| 亚洲大片在线观看| 91久久国产精品91久久性色| 欧美视频在线播放| 欧美中文字幕视频| 巨乳诱惑日韩免费av| 亚洲日本欧美天堂| 亚洲视频自拍偷拍| 国语自产精品视频在线看抢先版结局 | 国产日韩一区在线| 免费成人高清| 欧美日韩国内| 久久福利精品| 裸体歌舞表演一区二区| 亚洲婷婷免费| 欧美专区福利在线| 亚洲狼人综合| 欧美在线免费| 中日韩美女免费视频网站在线观看| 亚洲女爱视频在线| 91久久久久久| 亚洲欧美在线免费|