1 #include "mof/sound/SoundDevice.hpp"
2 #include "mof/ConsoleIO.hpp"
4 #include <boost/regex.hpp>
5 #include "mof/sound/WaveFile.hpp"
6 #include "mof/sound/OggVorbisFile.hpp"
8 #include <mof/tstring.hpp>
9 #include "mof/sound/StaticSoundBuffer.hpp"
10 #include "mof/sound/StreamSoundBuffer.hpp"
11 #include "mof/sound/DirectSoundDevice.hpp"
12 #include "mof/sound/sound_recoder.hpp"
15 #define CTRL_FLAGS DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLVOLUME
19 const int WORDSIZE = 2;//
\97Ê
\8eq
\89»
\83o
\83C
\83g
\90\94
20 std::shared_ptr<mof::sound::DirectSoundDevice> pDevice_;
21 mof::sound::sound_recoder rec_;
24 mof::SoundBuffer* loadStaticSound(const mof::tstring& filename , mof::SoundFile* soundFile){
26 if(!soundFile->open(filename.c_str())){
27 *ConsoleOut::getInstance() << _T("Can't Open File --- ") << filename << std::endl;
31 //---
\83Z
\83J
\83\93\83_
\83\8a\83o
\83b
\83t
\83@
\82Ì
\90¶
\90¬
33 ZeroMemory( &dsbdesc , sizeof(DSBUFFERDESC));
34 dsbdesc.dwSize = sizeof(DSBUFFERDESC);
35 dsbdesc.dwFlags = CTRL_FLAGS | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS | DSBCAPS_LOCDEFER | DSBCAPS_STATIC;
36 dsbdesc.dwBufferBytes = soundFile->getSize();
37 dsbdesc.lpwfxFormat = soundFile->getFormat();
39 LPDIRECTSOUNDBUFFER pTempBuffer;
40 LPDIRECTSOUNDBUFFER8 pSecondaryBuffer;
42 HRESULT hr = pDevice_->raw()->CreateSoundBuffer(&dsbdesc , &pTempBuffer , NULL);
44 *ConsoleOut::getInstance() << _T("Failed --- CreateSecondarySoundBuffer") << std::endl;
48 hr = pTempBuffer->QueryInterface(IID_IDirectSoundBuffer8 , (LPVOID*)&pSecondaryBuffer);
49 pTempBuffer->Release();
51 *ConsoleOut::getInstance() << _T("Failed --- QueryInterface") << std::endl;
56 mof::SoundBuffer* soundBuffer = new mof::StaticSoundBuffer(pDevice_, pSecondaryBuffer , soundFile);
57 pSecondaryBuffer->Release();
58 if(soundBuffer->initialize())return soundBuffer;
65 mof::SoundBuffer* loadStreamSound(const mof::tstring& filename , mof::SoundFile* soundFile){
67 if(!soundFile->open(filename.c_str())){
68 *ConsoleOut::getInstance() << _T("Can't Open File --- ") << filename << std::endl;
72 //---
\83Z
\83J
\83\93\83_
\83\8a\83o
\83b
\83t
\83@
\82Ì
\90¶
\90¬
73 WAVEFORMATEX* format = soundFile->getFormat();
75 ZeroMemory( &dsbdesc , sizeof(DSBUFFERDESC));
76 dsbdesc.dwSize = sizeof(DSBUFFERDESC);
77 dsbdesc.dwFlags = CTRL_FLAGS | DSBCAPS_LOCSOFTWARE | DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_GETCURRENTPOSITION2;
78 dsbdesc.dwBufferBytes = format->nChannels * format->nAvgBytesPerSec * 2;//2
\95b
\95ª
79 dsbdesc.dwBufferBytes -= dsbdesc.dwBufferBytes % 2;//2
\82Å
\8a\84\82è
\90Ø
\82ê
\82é
\82æ
\82¤
\82É
80 dsbdesc.lpwfxFormat = format;
82 LPDIRECTSOUNDBUFFER pTempBuffer;
83 LPDIRECTSOUNDBUFFER8 pSecondaryBuffer;
84 LPDIRECTSOUNDNOTIFY8 pSoundNotify;
86 HRESULT hr = pDevice_->raw()->CreateSoundBuffer(&dsbdesc , &pTempBuffer , NULL);
88 *ConsoleOut::getInstance() << _T("Failed --- CreateSecondarySoundBuffer") << std::endl;
92 hr = pTempBuffer->QueryInterface(IID_IDirectSoundBuffer8 , (LPVOID*)&pSecondaryBuffer);
94 pTempBuffer->Release();
95 *ConsoleOut::getInstance() << _T("Failed --- QueryInterface") << std::endl;
99 hr = pTempBuffer->QueryInterface(IID_IDirectSoundNotify8 , (LPVOID*)&pSoundNotify);
100 pTempBuffer->Release();
102 pSecondaryBuffer->Release();
103 *ConsoleOut::getInstance() << _T("Failed --- QueryInterface") << std::endl;
108 mof::SoundBuffer* soundBuffer = new mof::StreamSoundBuffer(pDevice_, pSecondaryBuffer , pSoundNotify , soundFile);
109 pSecondaryBuffer->Release();
110 pSoundNotify->Release();
111 if(soundBuffer->initialize())return soundBuffer;
125 bool SoundDevice::initialize(HWND hWnd, bool enable_output)
127 pDevice_ = std::make_shared<DirectSoundDevice>(hWnd);
128 if (enable_output) rec_.open("sound_output/rect.wav");//
\83T
\83E
\83\93\83h
\83\8c\83R
\81[
\83_
\82Ì
\8f\89\8aú
\89»
133 void SoundDevice::finalize()
135 pDevice_ = std::shared_ptr<DirectSoundDevice>();// NULL
\82ð
\90Ý
\92è
138 //{{{ create_static_sound
139 std::unique_ptr<mof::SoundBuffer> SoundDevice::create_static_sound(const mof::tstring& filename)
141 //---
\83t
\83H
\81[
\83}
\83b
\83g
\82ð
\92²
\82×
\82é
142 // TODO
\8aÖ
\90\94\89»
145 boost::regex regex("(.*)\\.(.*)");//name . format
147 //
\8a¿
\8e\9a\82É
\82Í
\91Î
\89\9e\82µ
\82Ä
\82¢
\82È
\82¢
148 if(!boost::regex_search(filename , match , regex)){
149 *ConsoleOut::getInstance() << _T("FormatError --- ") << filename;
150 throw std::invalid_argument("format error");
152 format = match.str(2);
154 catch (std::exception &e) {
158 SoundBuffer* buffer = NULL;
159 if(format == "ogg")buffer = loadStaticSound(filename , new OggVorbisFile());
160 else if(format == "wav")buffer = loadStaticSound( filename , new WaveFile());
163 *ConsoleOut::getInstance() << _T("UnKnownFileFormat ---") << format;
164 throw std::invalid_argument("unknown file format");
166 return std::unique_ptr<SoundBuffer>(buffer);
169 //{{{ create_streaming_sound
170 std::unique_ptr<mof::SoundBuffer> SoundDevice::create_streaming_sound(const mof::tstring& filename)
172 //---
\83t
\83H
\81[
\83}
\83b
\83g
\82ð
\92²
\82×
\82é
173 // TODO
\8aÖ
\90\94\89»
176 boost::regex regex("(.*)\\.(.*)");//name . format
178 //
\8a¿
\8e\9a\82É
\82Í
\91Î
\89\9e\82µ
\82Ä
\82¢
\82È
\82¢
179 if(!boost::regex_search(filename , match , regex)){
180 *ConsoleOut::getInstance() << _T("FormatError --- ") << filename;
181 throw std::invalid_argument("format error");
183 format = match.str(2);
185 catch (std::exception &e) {
189 SoundBuffer* buffer = NULL;
191 if(format == "ogg")buffer = loadStreamSound(filename , new OggVorbisFile());
192 else if(format == "wav")buffer = loadStreamSound( filename , new WaveFile());
195 *ConsoleOut::getInstance() << _T("UnKnownFileFormat ---") << format;
196 throw std::invalid_argument("unknown file format");
198 return std::unique_ptr<SoundBuffer>(buffer);