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

Codejie's C++ Space

Using C++

使用DirectSound播放MP3文件

    將對MP3的支持代碼加入到DSound程序中,以供wxDeMPQ使用,隨便調整了一下代碼,使基類作更多的事情。下面修改后的代碼,源碼在這里。

    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[3];
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();
24     virtual int Pause();
25     virtual int Stop();
26     virtual bool IsPlaying() const;
27     virtual double Duration() = 0;
28 protected:
29     virtual int CreateDSound();
30     virtual void ReleaseDSound();
31     virtual int CreateDSoundBuffer();
32     virtual void ReleaseDSoundBuffer();
33 
34     virtual int InitDSData() = 0;
35     virtual int LoadDSData(DWORD start, DWORD count) = 0;
36     virtual int PlayOver();
37 protected:
38     HWND _hWnd;
39     SoundType _eType;
40     IDirectSound * _pDS;
41     IDirectSoundBuffer * _pDSBuffer;
42     IDirectSoundNotify8* _pDSNotify;
43 protected:
44     int CreateNotifyThread();
45     void ReleaseNotifyThread();
46     static DWORD NotifyHandleProc(LPVOID param);
47 protected:
48     DWORD _dwNotifyThreadID;
49     HANDLE _hNotifyThread;
50 
51     DSBPOSITIONNOTIFY _notifyPos[2];
52 protected:
53     DWORD _dwPlayPos; 
54 };
55 
56 #endif
    DSoundObject.cpp
  1 #include "DSoundObject.h"
  2 
  3 HANDLE _eventNotify[3];
  4 
  5 CDSoundObject::CDSoundObject(CDSoundObject::SoundType type)
  6 : _eType(type)
  7 , _pDS(NULL), _pDSBuffer(NULL), _pDSNotify(NULL)
  8 , _dwNotifyThreadID(0), _hNotifyThread(NULL)
  9 , _dwPlayPos(0)
 10 {
 11 }
 12 
 13 CDSoundObject::~CDSoundObject()
 14 {
 15     ReleaseNotifyThread();
 16     ReleaseDSoundBuffer();
 17     ReleaseDSound();
 18 }
 19 
 20 
 21 int CDSoundObject::Init(HWND hwnd)
 22 {
 23     _hWnd = hwnd;
 24 
 25     return CreateDSound();
 26 }
 27 
 28 int CDSoundObject::CreateDSound()
 29 {
 30     HRESULT hr = DirectSoundCreate(NULL, &_pDS, NULL);
 31     if(hr != DS_OK)
 32         return -1;
 33     _pDS->SetCooperativeLevel(_hWnd, DSSCL_NORMAL);
 34     return 0;
 35 }
 36 
 37 
 38 void CDSoundObject::ReleaseDSound()
 39 {
 40     if(_pDS != NULL)
 41         _pDS->Release(), _pDS = NULL;
 42 }
 43 
 44 int CDSoundObject::CreateDSoundBuffer()
 45 {
 46     ReleaseDSoundBuffer();
 47 
 48     return 0;
 49 }
 50 
 51 void CDSoundObject::ReleaseDSoundBuffer()
 52 {
 53     if(_pDSBuffer != NULL)
 54     {
 55         _pDSBuffer->Stop();
 56         _pDSBuffer->Release();
 57         _pDSBuffer = NULL;
 58     }
 59 }
 60 
 61 int CDSoundObject::CreateNotifyThread()
 62 {
 63     ReleaseNotifyThread();
 64 
 65     //event
 66     _eventNotify[0= CreateEvent(NULL, FALSE, FALSE, NULL);
 67     _eventNotify[1= CreateEvent(NULL, FALSE, FALSE, NULL);
 68     _eventNotify[2= CreateEvent(NULL, FALSE, FALSE, NULL);
 69 
 70 
 71     _hNotifyThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)NotifyHandleProc, (LPVOID)this0&_dwNotifyThreadID);
 72     if(_hNotifyThread == NULL)
 73         return -1;
 74 
 75     HRESULT hr = _pDSBuffer->QueryInterface(IID_IDirectSoundNotify8, (void**)&_pDSNotify);
 76     if(hr != DS_OK)
 77         return -1;
 78 
 79     _notifyPos[0].dwOffset = (SIZE_DS_BUFFER / 2- 1;
 80     _notifyPos[0].hEventNotify = _eventNotify[0];
 81     _notifyPos[1].dwOffset = SIZE_DS_BUFFER - 1;
 82     _notifyPos[1].hEventNotify = _eventNotify[1];
 83 
 84     hr = _pDSNotify->SetNotificationPositions(2, _notifyPos);
 85     if(hr != DS_OK)
 86         return -1;
 87 
 88     return 0;
 89 }
 90 
 91 void CDSoundObject::ReleaseNotifyThread()
 92 {
 93     if(_hNotifyThread != NULL)
 94     {
 95         //TerminateThread(_hNotifyThread, 0);
 96         SetEvent(_eventNotify[2]);
 97         CloseHandle(_hNotifyThread);
 98         _hNotifyThread = NULL;
 99     }
100     for(int i = 0; i < 2++ i)
101     {
102         if(_eventNotify[i] != NULL)
103         {
104             CloseHandle(_eventNotify[i]);
105             _eventNotify[i] = NULL;
106         }
107     }
108 
109     if(_pDSNotify != NULL)
110     {
111         _pDSNotify->Release();
112         _pDSNotify = NULL;
113     }
114 }
115 
116 DWORD CDSoundObject::NotifyHandleProc(LPVOID param)
117 {
118     CDSoundObject* obj = (CDSoundObject*)(param);
119     if(obj == NULL)
120         return -1;
121 
122     while(true)
123     {
124         DWORD ret = MsgWaitForMultipleObjects(3, _eventNotify, FALSE, INFINITE, QS_ALLEVENTS);
125         if(ret == WAIT_FAILED)
126             return -1;
127         
128         DWORD notify = ret - WAIT_OBJECT_0;
129         if(notify == 0)
130         {
131             if(obj->LoadDSData(0, SIZE_DS_BUFFER / 2!= 0)
132                 break;
133         }
134         else if(notify == 1)
135         {
136             if(obj->LoadDSData(SIZE_DS_BUFFER / 2 , SIZE_DS_BUFFER / 2!= 0)
137                 break;
138         }
139         else if(notify == 2)
140         {
141             break;
142         }
143         else
144         {
145             continue;
146         }
147     }
148 
149     obj->PlayOver();
150 
151     return 0;
152 }
153 
154 int CDSoundObject::Play()
155 {
156     if(_dwPlayPos == 0)
157     {
158         InitDSData();
159     }
160 
161     _pDSBuffer->SetCurrentPosition(_dwPlayPos);
162     _pDSBuffer->SetVolume(-2000);//DSBVOLUME_MAX);
163     _pDSBuffer->Play(00, DSBPLAY_LOOPING);
164 
165     return 0;
166 }
167 
168 int CDSoundObject::Pause()
169 {
170     if(_pDSBuffer == NULL)
171         return -1;
172     HRESULT hr = _pDSBuffer->GetCurrentPosition(&_dwPlayPos, NULL);
173     if(hr != DS_OK)
174         return -1;
175     _pDSBuffer->Stop();
176 
177     return 0;
178 }
179 
180 int CDSoundObject::Stop()
181 {
182     if(_pDSBuffer == NULL)
183         return -1;
184     _pDSBuffer->Stop();
185     _dwPlayPos = 0;
186 
187     return 0;
188 }
189 
190 bool CDSoundObject::IsPlaying() const
191 {
192     if(_pDSBuffer == NULL)
193         return false;
194 
195     DWORD status = 0;
196     HRESULT hr = _pDSBuffer->GetStatus(&status);
197     if(hr != DS_OK)
198         return false;
199     return ((status & DSBSTATUS_PLAYING) == DSBSTATUS_PLAYING ? true : false);
200 }
201 
202 int CDSoundObject::PlayOver()
203 {
204     return Stop();
205 }
206 
207 
    DSMP3Object.h
 1 #ifndef __DSMP3OBJECT_H__
 2 #define __DSMP3OBJECT_H__
 3 
 4 #include <fstream>
 5 #include <string>
 6 
 7 #include "mpg123.h"
 8 
 9 #include "DSoundObject.h"
10 
11 class CDSMP3Object : public CDSoundObject
12 {
13 public:
14     CDSMP3Object();
15     virtual ~CDSMP3Object();
16     
17     virtual int LoadFile(const std::string& file);
18     virtual double Duration();
19 protected:
20     virtual void Release();
21     virtual int CreateDSoundBuffer();
22 
23     virtual int InitDSData();
24     virtual int LoadDSData(DWORD start, DWORD count);
25 private:
26     mpg123_handle* _handle;
27     unsigned char _buffer[SIZE_DS_BUFFER / 2];
28     WAVEFORMATEX _fmtWave;
29 };
30 
31 #endif
32 
    DSMP3Object.cpp
  1 #include "DSMP3Object.h"
  2 
  3 CDSMP3Object::CDSMP3Object()
  4 : CDSoundObject(CDSoundObject::ST_MP3)
  5 , _handle(NULL)
  6 {
  7 }
  8 
  9 CDSMP3Object::~CDSMP3Object()
 10 {
 11     Release();
 12 }
 13 
 14 void CDSMP3Object::Release()
 15 {
 16     if(_handle != NULL)
 17     {
 18         mpg123_close(_handle);
 19         mpg123_delete(_handle);
 20         _handle = NULL;
 21         mpg123_exit();
 22     }
 23 }
 24 
 25 int CDSMP3Object::LoadFile(const std::string &file)
 26 {
 27     Release();
 28 
 29     if(mpg123_init() != MPG123_OK)
 30         return -1;
 31     int ret = -1;
 32     _handle = mpg123_new(NULL, &ret);
 33     if(_handle == NULL || ret != MPG123_OK)
 34         return -1;
 35 
 36     if(mpg123_open(_handle, file.c_str()) != MPG123_OK)
 37         return -1;
 38 
 39     if(CreateDSoundBuffer() != 0)
 40         return -1;
 41 
 42     return 0;
 43 }
 44 
 45 int CDSMP3Object::CreateDSoundBuffer()
 46 {
 47     CDSoundObject::CreateDSoundBuffer();
 48 
 49     long rate = 0;
 50     int channel = 0;
 51     int encoding = 0;
 52 
 53     if(mpg123_getformat(_handle, &rate, &channel, &encoding) != MPG123_OK)
 54         return -1;
 55     if((encoding & MPG123_ENC_16) == MPG123_ENC_16)
 56         encoding = 16;
 57     else if((encoding & MPG123_ENC_32) == MPG123_ENC_32)
 58         encoding = 32;
 59     else
 60         encoding = 8;
 61 
 62     memset(&_fmtWave, 0sizeof(WAVEFORMATEX));
 63     _fmtWave.wFormatTag = WAVE_FORMAT_PCM;
 64     _fmtWave.nChannels = channel;
 65     _fmtWave.nSamplesPerSec = rate;
 66     _fmtWave.wBitsPerSample = encoding;
 67     _fmtWave.nBlockAlign = encoding / 8 * channel;
 68     _fmtWave.nAvgBytesPerSec = rate * (encoding / 8* channel;
 69     
 70     DSBUFFERDESC desc;
 71     memset(&desc, 0sizeof(DSBUFFERDESC));
 72     desc.dwSize = sizeof(DSBUFFERDESC);
 73     desc.dwFlags = DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_LOCSOFTWARE;
 74     desc.dwBufferBytes = CDSoundObject::SIZE_DS_BUFFER;
 75     desc.lpwfxFormat = &_fmtWave;
 76 
 77     if(_pDSBuffer != NULL)
 78         _pDSBuffer->Release();
 79 
 80     HRESULT hr = _pDS->CreateSoundBuffer(&desc, &_pDSBuffer, NULL);
 81     if(hr != DS_OK)
 82         return -1;
 83     
 84     return 0;
 85 }
 86 
 87 int CDSMP3Object::InitDSData()
 88 {
 89     //if(mpg123_seek(_handle, 0, SEEK_SET) < 0)
 90     //    return -1;
 91     off_t s = mpg123_seek(_handle, 0, SEEK_SET);
 92     if(s < 0)
 93         return -1;
 94 
 95     if(LoadDSData(0, CDSoundObject::SIZE_DS_BUFFER) != 0)
 96         return -1;
 97 
 98     if(CreateNotifyThread() != 0)
 99         return -1;
100 
101 //    _dwPlayPos = 0;
102 
103     return 0;
104 }
105 
106 int CDSMP3Object::LoadDSData(DWORD start, DWORD count)
107 {
108     LPVOID aptr1 = NULL, aptr2 = NULL;
109     DWORD abyte1 = NULL, abyte2 = NULL;
110 
111     HRESULT hr = _pDSBuffer->Lock(start, count, &aptr1, &abyte1, &aptr2, &abyte2, 0);
112     if(hr != DS_OK)
113         return -1;
114 
115     size_t outsize = 0;
116     if(mpg123_read(_handle, _buffer, SIZE_DS_BUFFER / 2&outsize) != MPG123_OK)
117         return -1;
118 
119     memcpy(aptr1, _buffer, outsize);
120     if(aptr2 != 0)
121     {
122         if(mpg123_read(_handle, _buffer, SIZE_DS_BUFFER / 2&outsize) != MPG123_OK)
123             return -1;
124         memcpy(aptr2, _buffer, outsize);
125     }
126 
127     _pDSBuffer->Unlock(aptr1, abyte1, aptr2, abyte2);
128 
129     return 0;
130 }
131 
132 double CDSMP3Object::Duration()
133 {
134     off_t len = mpg123_length(_handle);
135     return (len / _fmtWave.nSamplesPerSec);
136 }



posted on 2009-03-26 10:57 codejie 閱讀(6052) 評論(8)  編輯 收藏 引用 所屬分類: C++

評論

# re: 使用DirectSound播放MP3文件 2009-12-07 19:51 chl

你好,看了你的DS播放MP3的代碼,我也是在寫這個相關代碼,第一次接觸聲音部分,看了你的代碼很有收獲,想問你,mpg123_read就可以把MP3轉化為WAV的了嗎?還有就是你有mpg123的源碼嗎?可以發給我嗎?我的QQ:84818557,郵箱84818557@qq.com,看到消息給我回復好嗎,謝謝。  回復  更多評論   

# re: 使用DirectSound播放MP3文件[未登錄] 2009-12-07 21:40 codejie

@chl
我想你需要的都在http://www.mpg123.de/api/  回復  更多評論   

# re: 使用DirectSound播放MP3文件 2009-12-08 21:13 chl

我已經解決了,還是很 感謝你,以后多交流,我的聲音系統也完成了。  回復  更多評論   

# re: 使用DirectSound播放MP3文件 2009-12-09 09:30 codejie

@chl
GX  回復  更多評論   

# re: 使用DirectSound播放MP3文件 2010-01-24 13:58 kun

能把 vs下 編譯libmpg的sln給我?(kunooo@qq.com)  回復  更多評論   

# re: 使用DirectSound播放MP3文件[未登錄] 2010-01-24 14:48 codejie

@kun
mpg庫到http://www.mpg123.de/下載就可以了。  回復  更多評論   

# re: 使用DirectSound播放MP3文件 2011-07-02 20:28 huangdi

好像不能播放。只能播放開頭一點點  回復  更多評論   

# re: 使用DirectSound播放MP3文件 2011-07-04 10:39 codejie

@huangdi
啊,我都忘記這個了。??戳税胩欤绻沁@樣,那應該是‘循環’加載數據時沒有算準‘位置’。辛苦你多試試了。  回復  更多評論   

公告

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>
            一区二区三区福利| 国产欧美一区二区三区视频 | 一二三区精品| 午夜精品一区二区三区在线视| 久久乐国产精品| 亚洲黄一区二区三区| 亚洲欧洲精品一区二区| 亚洲网站在线看| 欧美一级视频精品观看| 亚洲成人直播| 亚洲夜间福利| 欧美电影免费观看高清完整版| 国产麻豆一精品一av一免费| 亚洲精品乱码久久久久久日本蜜臀| 久久激情婷婷| 日韩一级黄色片| 男男成人高潮片免费网站| 国产综合视频| 亚洲欧美激情精品一区二区| 亚洲欧洲偷拍精品| 国产精品每日更新| 99精品国产热久久91蜜凸| 免费视频最近日韩| 亚洲欧美日韩精品久久亚洲区 | 国产视频一区三区| 午夜精品美女自拍福到在线| 久久精品视频一| 国产精品日韩专区| 午夜精品福利一区二区三区av | 欧美激情综合网| 国产亚洲欧美在线| 欧美在线看片a免费观看| 亚洲午夜av在线| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲日本激情| 欧美高清一区| 亚洲精品一区中文| 亚洲国产精品免费| 欧美激情第10页| 欧美在线一二三四区| 欧美成人一品| 久久综合福利| 蜜臀久久99精品久久久久久9| 国内揄拍国内精品久久| 久久久亚洲欧洲日产国码αv| 欧美激情中文字幕一区二区| 久久在线播放| 国产日韩欧美a| 亚洲天天影视| 中国成人黄色视屏| 亚洲欧美日韩国产精品| 99国产精品久久久久久久| 久久男人资源视频| 亚洲免费av片| 免费日韩一区二区| 美日韩丰满少妇在线观看| 国产麻豆91精品| 亚洲特级毛片| 亚洲欧美一区二区原创| 欧美日韩精品三区| 性欧美大战久久久久久久久| 欧美日韩国产黄| 亚洲精品在线三区| 国产美女精品视频| 亚洲永久免费| 亚洲成色www8888| 亚洲国产精品嫩草影院| 亚洲黄色在线视频| 亚洲尤物在线视频观看| 亚洲你懂的在线视频| 国产精品你懂得| 亚洲嫩草精品久久| 亚洲精品一区二区三区99| 久久偷窥视频| 亚洲国产精品成人精品| 亚洲精品日韩综合观看成人91| 女同性一区二区三区人了人一| 欧美激情第3页| 欧美视频中文在线看| 香蕉乱码成人久久天堂爱免费| 国产精品久久国产精麻豆99网站| 久久综合色影院| 欧美三级在线播放| 亚洲香蕉成视频在线观看| 欧美一级精品大片| 狠狠色噜噜狠狠色综合久| 久久在精品线影院精品国产| 性做久久久久久免费观看欧美| 国产精品亚洲美女av网站| 久久精品成人| 亚洲视频综合在线| 亚洲国产欧美不卡在线观看| 欧美高清视频免费观看| 亚洲少妇自拍| 亚洲欧洲日本国产| 欧美日韩一区二区三区免费| 亚洲福利国产| 激情文学一区| 久久精品中文字幕免费mv| 亚洲国产成人精品久久| 亚洲欧美日韩国产| 亚洲丁香婷深爱综合| 欧美午夜视频一区二区| 日韩午夜电影| 久久久久青草大香线综合精品| 亚洲精品九九| 国产一区二区三区久久久久久久久 | 亚洲欧美日韩网| 亚洲高清在线观看| 国产精品视频男人的天堂| 久久阴道视频| 午夜精品久久| 99成人免费视频| 一本久道综合久久精品| 国产一区成人| 国产精品爱久久久久久久| 卡一卡二国产精品| 午夜精品av| 99精品视频免费| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲一区在线观看免费观看电影高清| 欧美精品亚洲精品| 久久久久高清| 91久久国产综合久久蜜月精品| 久久精品国产99国产精品| 在线天堂一区av电影| 欧美午夜在线一二页| 欧美国产免费| 美国成人直播| 久久亚洲影院| 久久婷婷国产综合精品青草| 午夜精品成人在线视频| 亚洲一区二区精品| 99亚洲视频| 亚洲美女毛片| 亚洲欧洲日本专区| 亚洲国内精品| 亚洲国产精品久久久久| 亚洲高清不卡一区| 欧美大片91| 亚洲一级片在线看| 一个人看的www久久| 99热在线精品观看| 一区二区三区你懂的| 一本综合久久| 亚洲永久视频| 亚洲欧美一区二区激情| 欧美一站二站| 亚洲精品女人| 亚洲精品资源| 亚洲视频一二区| 亚洲欧美精品中文字幕在线| 亚洲制服欧美中文字幕中文字幕| 亚洲私人影院| 欧美影片第一页| 久久综合久久久| 亚洲电影欧美电影有声小说| 亚洲丁香婷深爱综合| 亚洲日本欧美天堂| 亚洲午夜一区| 欧美一区二区三区在线观看视频| 亚洲人成亚洲人成在线观看图片| 亚洲国产三级| 亚洲视频香蕉人妖| 久久成人精品视频| 女女同性精品视频| 久久天天躁夜夜躁狠狠躁2022| 久久人人九九| 亚洲激情欧美| 亚洲一区三区在线观看| 欧美一区二区三区在线观看视频 | 日韩一级在线观看| 亚洲免费人成在线视频观看| 欧美一区二区在线免费观看| 开元免费观看欧美电视剧网站| 欧美大片免费观看在线观看网站推荐| 欧美日韩伦理在线免费| 国产精品丝袜白浆摸在线| 在线国产日韩| 午夜激情综合网| 欧美电影在线观看完整版| 亚洲视频一二三| 六月丁香综合| 国产精品一区二区三区久久久| 亚洲国产老妈| 午夜精品理论片| 亚洲黑丝一区二区| 欧美在线一二三区| 亚洲欧美日韩综合国产aⅴ| 狼狼综合久久久久综合网| 国产精品普通话对白| 亚洲精选在线观看| 久久久久久夜| 中文国产亚洲喷潮| 欧美1区2区3区| 国内精品免费午夜毛片| 亚洲欧美日韩一区二区| 亚洲国产精品视频一区| 久久久久久噜噜噜久久久精品| 国产精品v日韩精品|