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

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 閱讀(597) 評論(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>
            亚洲日本国产| 欧美成人精品激情在线观看| 日韩一区二区免费看| 尤物yw午夜国产精品视频明星| 国产精品久久久一区二区三区| 国产精品v片在线观看不卡| 国产精品麻豆va在线播放| 国产精品自拍小视频| 国内精品嫩模av私拍在线观看| 加勒比av一区二区| 亚洲韩国精品一区| 亚洲自拍偷拍视频| 久久久久久婷| 亚洲精品一区久久久久久| 亚洲午夜一区二区| 美女精品在线| 国产精品综合不卡av| 激情成人中文字幕| 日韩一本二本av| 亚洲一区二区三区在线| 小黄鸭精品aⅴ导航网站入口| 亚洲一级二级| 欧美福利电影网| 亚洲精品中文字幕有码专区| 亚洲精品日产精品乱码不卡| 中文亚洲视频在线| 久久久噜噜噜久噜久久| 欧美成人一区二免费视频软件| 欧美日韩一区二区在线观看| 国产日韩欧美在线| 影音先锋欧美精品| 一区二区不卡在线视频 午夜欧美不卡'| 中日韩美女免费视频网站在线观看| 黄色成人在线网站| 日韩午夜av| 欧美在线综合| 亚洲精品色婷婷福利天堂| 亚洲一区视频| 欧美成年人视频| 国产日韩一区欧美| 一本久道久久综合婷婷鲸鱼| 久久久www| 日韩天堂在线观看| 久久精品国产亚洲a| 欧美日韩在线另类| 国产精品成人在线观看| 国产精品丝袜xxxxxxx| 亚洲成色www8888| 欧美资源在线观看| 一区二区高清视频| 免费精品视频| 国产一区二区三区最好精华液| 亚洲精品1区2区| 久久久国产精品一区| 一本久久综合| 欧美国产日本| 亚洲国产日日夜夜| 玖玖精品视频| 99天天综合性| 亚洲欧美另类中文字幕| 欧美激情四色 | 久久免费一区| 国产麻豆视频精品| 亚洲一线二线三线久久久| 欧美激情1区2区| 亚洲成色777777女色窝| 亚洲精品一区二区三区樱花| 久久久综合精品| 国产一区二区电影在线观看 | 欧美系列精品| 激情婷婷亚洲| 亚洲欧美在线网| 亚洲视频你懂的| 欧美视频在线播放| 一区二区三区四区五区在线| 欧美国产日韩xxxxx| 久久久久久网站| 激情视频一区| 麻豆精品精品国产自在97香蕉| 亚洲蜜桃精久久久久久久| 老色批av在线精品| 亚洲人成亚洲人成在线观看 | 亚洲精品影院在线观看| 欧美精品一区二| 一本色道久久综合亚洲精品小说| 亚洲大胆在线| 欧美激情麻豆| 夜夜嗨av一区二区三区四区| 亚洲高清视频的网址| 久久av资源网站| 亚洲福利免费| 亚洲免费福利视频| 国产啪精品视频| 亚洲一卡久久| 亚洲欧美综合v| 精品成人国产在线观看男人呻吟| 欧美成人免费全部观看天天性色| 欧美国产精品v| 亚洲综合精品一区二区| 亚洲日本中文| 日韩一级视频免费观看在线| 久久免费少妇高潮久久精品99| 91久久在线观看| 正在播放欧美一区| 一区二区三区在线高清| 亚洲国产一区二区视频| 欧美日韩精品福利| 欧美一区二区视频在线观看| 亚洲色无码播放| 亚洲综合电影| 国产精品美女999| 久久国产精品亚洲77777| 久久gogo国模裸体人体| 亚洲黑丝在线| 欧美一区二区福利在线| 亚洲高清中文字幕| 性视频1819p久久| 一本久道综合久久精品| 久久青青草原一区二区| 一区二区三区四区国产| 玖玖综合伊人| 久久国产精品久久国产精品 | 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲国产成人高清精品| 国产精品啊啊啊| 欧美成人精品一区二区三区| 欧美日韩一区在线| 免费视频最近日韩| 国产欧美日韩视频| 亚洲肉体裸体xxxx137| 韩国av一区二区三区在线观看 | 欧美亚洲视频在线观看| 一区二区三区国产在线| 久久大香伊蕉在人线观看热2| 亚洲麻豆av| 久久天天躁夜夜躁狠狠躁2022 | 亚洲另类在线一区| 欧美一区二区日韩| 亚洲伊人伊色伊影伊综合网| 美女脱光内衣内裤视频久久网站| 久久国产主播| 国产精品一区二区久久国产| 亚洲六月丁香色婷婷综合久久| 亚洲成人资源网| 久久精品视频va| 久久裸体视频| 国产欧美视频一区二区| 免费久久99精品国产自在现线| 欧美成人中文字幕在线| 毛片av中文字幕一区二区| 国产视频欧美视频| 香港久久久电影| 久久精品网址| 国产有码一区二区| 性色av一区二区怡红| 久久疯狂做爰流白浆xx| 国产精品黄视频| 亚洲视频在线看| 亚洲九九爱视频| 久久一区二区三区av| 蜜臀av性久久久久蜜臀aⅴ四虎| 黑人操亚洲美女惩罚| 久久久精品国产99久久精品芒果| 久久精品91久久久久久再现| 国产午夜精品在线观看| 久久久久久久尹人综合网亚洲| 美女91精品| 亚洲乱码国产乱码精品精可以看| 亚洲国产激情| 一区二区三区国产在线| 欧美午夜无遮挡| 亚洲视频大全| 欧美影片第一页| 国产精品成人一区二区| 欧美专区亚洲专区| 亚洲成色www久久网站| 99精品视频免费全部在线| 欧美日韩在线一区| 亚洲欧美日韩综合国产aⅴ| 亚洲午夜视频在线观看| 欧美日韩国产成人精品| 亚洲摸下面视频| 欧美国产日韩在线| 亚洲欧美国产va在线影院| 国产综合在线看| 欧美日韩免费一区二区三区| 亚洲欧美日韩国产综合| 欧美国产在线观看| 亚洲欧美电影在线观看| 国产视频一区二区三区在线观看| 久久久蜜桃精品| 亚洲一区二区少妇| 亚洲福利视频二区| 久久精品午夜| 亚洲桃花岛网站| 国内精品久久久久国产盗摄免费观看完整版| 另类天堂av| 午夜欧美精品| 免费观看欧美在线视频的网站| 香蕉久久夜色|