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

Codejie's C++ Space

Using C++

更新 - 使用DirectSound播放Wave文件

    修改了一下DSound程序,增加播放Notify,支持播放Buffer。這樣就可以連續(xù)播放一個(gè)比較大的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鏈接會(huì)出錯(cuò),不明原因。
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)計(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>
            99伊人成综合| 欧美一区二区三区四区在线观看地址 | 欧美激情影院| 国产嫩草一区二区三区在线观看| 亚洲精选视频在线| 99国产精品一区| 美国成人直播| 欧美国产精品久久| 亚洲国产裸拍裸体视频在线观看乱了 | 一区二区三区四区国产精品| 麻豆精品精品国产自在97香蕉| 麻豆乱码国产一区二区三区| 国产在线日韩| 久久久久久电影| 欧美成人免费小视频| 亚洲精品在线看| 欧美精品一区二区三区在线看午夜 | 久久久999成人| 国模 一区 二区 三区| 欧美一级成年大片在线观看| 久久激情视频| 激情欧美亚洲| 欧美福利精品| 亚洲精品一区二区三区蜜桃久| 亚洲一区二区三区777| 国产乱码精品一区二区三区五月婷| 欧美在线观看你懂的| 欧美成年视频| 一区二区三区日韩| 国产伦精品一区| 久久国产精品亚洲va麻豆| 欧美国产日本韩| 一区二区三区久久网| 国产精品普通话对白| 久久高清福利视频| 欧美激情一区二区| 亚洲男人av电影| 韩国av一区二区三区四区| 免费中文字幕日韩欧美| 欧美在线观看www| 国产丝袜美腿一区二区三区| 久久久久久亚洲精品不卡4k岛国| 欧美激情第3页| 中文有码久久| 韩国一区二区三区美女美女秀| 男女av一区三区二区色多| 99精品视频一区| 久久国产福利| 亚洲精品久久久久久久久| 欧美日韩综合视频| 久久精品视频免费播放| 最新国产成人av网站网址麻豆| 亚洲欧美日韩高清| 亚洲国产岛国毛片在线| 国产精品久久999| 久久久久久网址| 在线视频亚洲一区| 欧美电影打屁股sp| 亚洲欧美成人精品| 亚洲精品网站在线播放gif| 国产三级精品三级| 欧美精品免费在线| 久久综合激情| 亚洲欧美日韩另类精品一区二区三区| 欧美成人四级电影| 久久国产色av| 一本色道久久综合精品竹菊| 国产在线观看91精品一区| 欧美日韩精品三区| 噜噜噜久久亚洲精品国产品小说| 亚洲一区日本| 最新69国产成人精品视频免费| 久久中文在线| 欧美一区二区三区免费看 | 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 久久亚洲国产精品日日av夜夜| 亚洲综合三区| 99精品免费网| 91久久精品视频| 在线成人av.com| 国产一区香蕉久久| 国产日韩精品电影| 国产精品毛片高清在线完整版| 欧美日韩aaaaa| 欧美不卡在线| 欧美成人精品1314www| 久久综合久久综合久久综合| 久久精品一级爱片| 欧美在线观看一二区| 亚洲在线观看| 亚洲一区在线免费观看| 一区二区毛片| 一区二区欧美激情| 一本一本久久| 一本色道久久综合亚洲精品高清 | 久久精品国产清自在天天线| 性欧美xxxx视频在线观看| 亚洲欧美日韩在线高清直播| 亚洲天堂成人在线视频| 亚洲特级毛片| 亚洲自拍偷拍福利| 亚洲男人第一av网站| 午夜亚洲一区| 欧美一区免费视频| 久久精品午夜| 麻豆国产精品va在线观看不卡| 巨乳诱惑日韩免费av| 亚洲专区免费| 欧美成人午夜77777| 免费试看一区| 欧美激情五月| 亚洲国产精品久久人人爱蜜臀| 亚洲高清av| 亚洲精品视频免费观看| 一区二区日韩精品| 亚洲一区二区网站| 欧美一区二区三区免费看| 久久国产手机看片| 模特精品在线| 欧美日本中文字幕| 国产精品乱人伦一区二区 | 欧美在线播放高清精品| 久久久久久久一区| 欧美二区不卡| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 日韩西西人体444www| 亚洲无线一线二线三线区别av| 午夜亚洲福利| 免费亚洲视频| 国产精品久久久久久妇女6080 | 日韩一级在线观看| 亚洲免费中文| 美女精品自拍一二三四| 亚洲精品视频二区| 欧美一区免费视频| 欧美成va人片在线观看| 国产精品第2页| 极品少妇一区二区| 亚洲亚洲精品三区日韩精品在线视频| 欧美在线视频播放| 亚洲国产精品ⅴa在线观看 | 久久婷婷国产综合精品青草| 亚洲成色777777在线观看影院| 99re视频这里只有精品| 久久av一区二区| 欧美日韩精品一二三区| 国产日韩欧美一二三区| 亚洲精品你懂的| 久久精品青青大伊人av| 亚洲人成毛片在线播放| 欧美一区免费视频| 欧美日韩亚洲一区二区三区在线观看 | 亚洲另类在线一区| 久久精品国产欧美激情| 欧美视频免费在线观看| 亚洲大胆人体视频| 亚洲欧美成人网| 欧美国产日韩精品免费观看| 亚洲欧美日韩国产另类专区| 欧美精品三级日韩久久| 国外成人在线| 亚洲一区精品电影| 亚洲国产欧美在线人成| 久久国产精品72免费观看| 欧美午夜在线视频| 99国产精品久久| 久久一区二区三区四区| 亚洲一区欧美| 欧美日本亚洲| 亚洲精品1区2区| 久久裸体视频| 亚洲自拍啪啪| 欧美日韩另类在线| 亚洲精品综合久久中文字幕| 久久天天狠狠| 欧美在线综合视频| 国产伦精品一区二区三区视频孕妇| 亚洲免费久久| 欧美ed2k| 久久久噜噜噜| 韩国av一区二区三区四区| 亚洲欧美激情四射在线日| 亚洲网站啪啪| 欧美精品播放| 亚洲国产精品va在看黑人| 久久成人一区| 亚洲视频精品在线| 欧美精品一区二区三区在线播放 | 欧美午夜精品久久久久久超碰| 亚洲精品日产精品乱码不卡| 蜜桃av一区二区| 久久成人免费| 国内偷自视频区视频综合| 久久福利影视| 欧美一站二站| 狠狠狠色丁香婷婷综合激情| 久久久999成人| 久久久久九九九| 一区二区三区亚洲| 女主播福利一区|