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

Codejie's C++ Space

Using C++

更新 - 使用DirectSound播放Wave文件

    修改了一下DSound程序,增加播放Notify,支持播放Buffer。這樣就可以連續播放一個比較大的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++

導航

統計

留言簿(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>
            亚洲精品美女免费| 日韩视频在线观看| 国产精品福利久久久| 亚洲高清不卡在线| 国产一区清纯| 亚洲在线日韩| 亚洲一级片在线看| 欧美了一区在线观看| 欧美freesex交免费视频| 国产欧美一区二区精品秋霞影院 | 亚洲日韩视频| 久久av最新网址| 久久福利电影| 国产精品色网| 亚洲永久视频| 欧美亚洲视频一区二区| 欧美午夜电影网| 99精品国产在热久久婷婷| 99视频超级精品| 欧美激情一区二区三区四区| 欧美v国产在线一区二区三区| 国内外成人在线| 久久精品国产99国产精品| 久久精品91久久香蕉加勒比| 国产午夜亚洲精品不卡| 西西人体一区二区| 久久深夜福利| 亚洲高清视频一区| 欧美成人精品h版在线观看| 欧美成人情趣视频| 亚洲精品乱码久久久久久日本蜜臀| 久久亚洲国产精品日日av夜夜| 另类成人小视频在线| 亚洲国产精品成人综合| 女生裸体视频一区二区三区| 亚洲国产欧美国产综合一区 | 久久久国产精品一区二区中文| 国产精品网站视频| 亚洲欧美日韩专区| 毛片基地黄久久久久久天堂| 亚洲高清不卡一区| 欧美日韩国产影片| 午夜精品久久久久久久久久久久| 久久久久久精| 日韩天堂av| 国产毛片一区二区| 久久久久久久久久久久久女国产乱| 欧美成年网站| 亚洲婷婷国产精品电影人久久| 欧美系列一区| 久久久亚洲人| 亚洲美女在线视频| 久久久久久香蕉网| 日韩亚洲在线| 国产一区二区精品丝袜| 欧美国产一区二区在线观看 | 99精品视频免费在线观看| 性欧美办公室18xxxxhd| 亚洲国产精品成人| 国产精品免费一区二区三区在线观看| 久久国产精品久久久久久| 亚洲激情在线| 久久视频精品在线| 亚洲一二三级电影| 亚洲国产精品成人va在线观看| 欧美涩涩视频| 免费观看成人| 欧美一级黄色网| 日韩一级大片| 欧美激情第1页| 欧美中在线观看| 一区二区三区免费在线观看| 国产一区二区三区在线播放免费观看| 欧美激情中文字幕一区二区| 久久精品123| 亚洲综合日韩在线| 亚洲人体大胆视频| 久热国产精品视频| 欧美一区二区日韩| 亚洲性夜色噜噜噜7777| 亚洲国产日韩综合一区| 国产亚洲美州欧州综合国| 欧美日韩在线大尺度| 欧美成人免费播放| 久久一区欧美| 久久精品99国产精品酒店日本| 亚洲午夜精品久久久久久app| 亚洲国产精品小视频| 欧美.www| 免费在线一区二区| 久久亚洲精品伦理| 久久国产精品网站| 欧美在线三区| 欧美在线视频日韩| 欧美一区二区三区在线观看| 亚洲一区二区三区四区五区午夜| 亚洲精品国产精品国产自| 亚洲风情亚aⅴ在线发布| 狠狠色综合播放一区二区| 国产一区二区三区的电影| 国产伦精品一区二区三区视频孕妇| 欧美日韩在线观看一区二区| 欧美日韩国产精品一区| 欧美片网站免费| 欧美日韩亚洲高清| 欧美日韩一区二| 国产精品都在这里| 国产精品国产三级欧美二区| 欧美三日本三级三级在线播放| 欧美日韩亚洲国产一区| 欧美午夜电影完整版| 国产精品免费一区二区三区在线观看| 国产精品毛片va一区二区三区| 国产精品久久网站| 国产日产高清欧美一区二区三区| 国产午夜精品在线| 在线电影国产精品| 亚洲人成网站影音先锋播放| 亚洲免费av网站| 亚洲亚洲精品三区日韩精品在线视频 | 国产一区二区三区视频在线观看| 国产一区清纯| 亚洲国产日韩一级| 亚洲视频在线免费观看| 午夜精品亚洲| 久久亚洲风情| 亚洲国产毛片完整版 | 亚洲日韩欧美视频一区| 99亚洲一区二区| 亚洲欧美乱综合| 久久中文在线| 亚洲人成人99网站| 亚洲女爱视频在线| 狂野欧美激情性xxxx| 欧美高清免费| 亚洲国内高清视频| 欧美成人免费全部观看天天性色| 亚洲高清二区| 亚洲免费伊人电影在线观看av| 久久精品99国产精品日本| 欧美电影免费观看高清| 国产九九精品| 亚洲日本成人在线观看| 午夜久久久久久| 欧美激情一区二区三区在线视频观看 | 亚洲一区三区电影在线观看| 欧美在线一二三四区| 欧美激情 亚洲a∨综合| 一区二区三区四区国产| 久久精品成人一区二区三区蜜臀| 欧美精品日韩| 国产在线一区二区三区四区| 亚洲美女视频| 久久五月婷婷丁香社区| 99国产精品久久久久久久成人热| 久久成人国产| 国产精品嫩草99a| 99热免费精品在线观看| 久久亚洲国产精品日日av夜夜| 99国产精品99久久久久久| 久热精品视频在线观看一区| 国产精品毛片在线看| 99riav1国产精品视频| 久久综合色一综合色88| 亚洲免费一在线| 欧美三级电影精品| 亚洲精品久久在线| 免费看亚洲片| 久久久www免费人成黑人精品 | 国产在线视频不卡二| 亚洲午夜一区| 亚洲精品视频免费在线观看| 久久婷婷丁香| 国外成人免费视频| 欧美在线影院| 亚洲在线一区二区三区| 欧美日韩综合不卡| 99国产精品久久久| 91久久久久久| 欧美激情久久久久久| 亚洲人久久久| 亚洲国产高清自拍| 欧美 日韩 国产 一区| 亚洲第一区在线观看| 麻豆精品在线视频| 久久亚裔精品欧美| 亚洲丰满少妇videoshd| 久久亚洲图片| 久久婷婷激情| 亚洲欧洲日产国码二区| 欧美激情片在线观看| 久久久综合视频| 亚洲激情精品| 亚洲国产一二三| 欧美日韩一区二区三区在线看| 在线视频欧美一区| 一区二区三区波多野结衣在线观看| 欧美日韩无遮挡| 午夜精品婷婷| 久久国产精品久久久久久久久久|