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

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 閱讀(6051) 評論(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>
            欧美日韩国产综合视频在线观看中文| 亚洲欧美日韩精品久久奇米色影视| 久久久天天操| 亚洲高清免费视频| 亚洲精品1234| 欧美三级电影一区| 亚洲欧美中文另类| 久久经典综合| 日韩亚洲成人av在线| 日韩亚洲国产精品| 国产乱码精品| 男人的天堂亚洲在线| 欧美精品国产一区二区| 亚洲综合色自拍一区| 久久xxxx| 亚洲乱码精品一二三四区日韩在线| 亚洲看片网站| 国产亚洲精品bt天堂精选| 欧美成年人在线观看| 欧美日韩国产精品自在自线| 亚洲欧美成人一区二区三区| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲国产精品久久久久秋霞不卡 | 免费久久99精品国产自| 免播放器亚洲一区| 欧美一区二区成人| 欧美国产日本韩| 久久精品国产第一区二区三区| 久久深夜福利免费观看| 亚洲伊人网站| 欧美激情女人20p| 久久久国产成人精品| 欧美日韩另类国产亚洲欧美一级| 久久久夜夜夜| 欧美日韩在线直播| 欧美激情一区二区三区在线视频| 国产精品免费观看视频| 亚洲经典在线| 亚洲高清视频在线| 欧美中文字幕久久| 欧美一区二区视频在线观看| 欧美国产高潮xxxx1819| 久久综合久久88| 国产日韩在线一区| 亚洲午夜一区二区| 在线亚洲欧美视频| 欧美国产精品v| 欧美黄色aaaa| 亚洲国产激情| 久久夜色精品国产| 久久这里有精品视频| 国产精品一区二区三区久久久 | 欧美成人午夜视频| 1024国产精品| 久久人人97超碰国产公开结果 | 亚洲电影自拍| 亚洲国产精品视频| 久久另类ts人妖一区二区| 久久久精品一区| 国产亚洲欧美一区| 久久成人久久爱| 久久久午夜精品| 韩国av一区二区| 久久人人看视频| 欧美黄色一区| 99精品视频免费观看| 欧美精品国产一区二区| 日韩视频在线免费| 亚洲一级影院| 国产亚洲一区二区在线观看 | 中文国产成人精品| 亚洲欧美日韩综合国产aⅴ| 欧美天堂亚洲电影院在线播放 | 亚洲欧洲日韩在线| 一本大道av伊人久久综合| 欧美日韩亚洲系列| 亚洲在线中文字幕| 久久九九99视频| 亚洲国产你懂的| 欧美三级日本三级少妇99| 亚洲一区二区3| 久久婷婷国产综合国色天香| 亚洲高清视频中文字幕| 欧美日韩国产色视频| 午夜国产精品视频免费体验区| 久久久久久久欧美精品| 亚洲国产精品成人久久综合一区| 欧美精品免费看| 亚洲欧美国产精品专区久久| 久久久久久亚洲精品中文字幕 | 欧美日韩综合在线免费观看| 亚洲在线免费视频| 美女视频黄a大片欧美| 日韩视频在线免费| 国产欧美日韩一区二区三区| 久久综合伊人77777麻豆| 亚洲精品国产精品国自产观看| 欧美一区二区三区男人的天堂| 国产综合久久久久久鬼色| 欧美成人免费播放| 一区二区三区 在线观看视| 欧美诱惑福利视频| 亚洲激精日韩激精欧美精品| 国产精品v片在线观看不卡| 久久黄金**| 亚洲美女淫视频| 久久综合亚州| 99国内精品久久| 在线看成人片| 国产精品婷婷| 欧美精品www在线观看| 久久gogo国模裸体人体| 亚洲精品在线视频| 欧美成人伊人久久综合网| 亚洲欧美国产日韩中文字幕| 亚洲黄一区二区三区| 狠狠色丁香婷婷综合| 国产精品试看| 欧美成人性网| 久久久久久久久岛国免费| 亚洲伊人网站| 一本到高清视频免费精品| 久久综合成人精品亚洲另类欧美| 午夜久久美女| 亚洲一区久久久| 日韩一区二区精品视频| 亚洲国产日韩一区二区| 精品9999| 在线精品福利| 国外视频精品毛片| 国产欧美日韩亚洲精品| 国产精品国产成人国产三级| 欧美全黄视频| 欧美猛交免费看| 欧美日本韩国一区二区三区| 欧美freesex交免费视频| 久久婷婷av| 老司机精品福利视频| 久久人人爽人人爽爽久久| 久久久亚洲国产天美传媒修理工| 午夜精品一区二区三区在线播放 | 久久一区二区精品| 久久免费高清视频| 久久久亚洲一区| 榴莲视频成人在线观看| 美女免费视频一区| 欧美成人精品1314www| 欧美高清免费| 欧美午夜在线| 国产精品一卡| 国语自产在线不卡| 亚洲人成免费| 一区二区三区你懂的| 亚洲中无吗在线| 久久精品国产99精品国产亚洲性色| 欧美中文在线观看国产| 久久琪琪电影院| 亚洲国产精品t66y| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲男同1069视频| 久久国产88| 欧美福利电影在线观看| 亚洲国产免费看| 亚洲一区日韩在线| 久久久成人网| 欧美日韩国产精品一区二区亚洲| 国产精品久久久久久久一区探花| 国产欧美日韩在线播放| 今天的高清视频免费播放成人| 亚洲精品国产精品国产自| 亚洲无线视频| 另类春色校园亚洲| 日韩一区二区免费高清| 欧美一区二区三区视频免费播放| 久久永久免费| 国产精品久久久久77777| 在线成人av网站| 亚洲淫性视频| 欧美视频中文在线看| 国产午夜精品久久久久久免费视 | 亚洲第一精品福利| 亚洲综合另类| 欧美福利小视频| 亚洲一区二区三区三| 欧美成人dvd在线视频| 国产热re99久久6国产精品| 亚洲人成人77777线观看| 性做久久久久久免费观看欧美| 美女主播视频一区| 中国亚洲黄色| 欧美大片免费看| 国产视频观看一区| 亚洲视频自拍偷拍| 欧美激情精品久久久六区热门| 亚洲午夜在线观看视频在线| 欧美激情第1页| 在线欧美一区| 久久久久久久综合色一本| 亚洲午夜在线| 欧美午夜美女看片|