OSDN Git Service

10f20a283b95f58127743e09294181c099e1eafe
[moflib/moflib.git] / moflib-1.0 / moflib / moflib / mof / sound / SoundDevice.cpp
1 #include "mof/sound/SoundDevice.hpp"
2 #include "mof/ConsoleIO.hpp"
3 #include <stdio.h>
4 #include <boost/regex.hpp>
5 #include "mof/sound/WaveFile.hpp"
6 #include "mof/sound/OggVorbisFile.hpp"
7 #include <stdlib.h>
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"
13 #include <dsound.h>
14
15 #define CTRL_FLAGS DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLVOLUME
16
17 namespace
18 {
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_;
22
23 //{{{ loadStaticSound
24 mof::SoundBuffer* loadStaticSound(const mof::tstring& filename , mof::SoundFile* soundFile){
25         
26         if(!soundFile->open(filename.c_str())){
27                 *ConsoleOut::getInstance() << _T("Can't Open File --- ") << filename << std::endl; 
28                 return NULL;
29         }
30         
31         //---\83Z\83J\83\93\83_\83\8a\83o\83b\83t\83@\82Ì\90\90¬
32         DSBUFFERDESC dsbdesc;
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();
38
39         LPDIRECTSOUNDBUFFER pTempBuffer;
40         LPDIRECTSOUNDBUFFER8 pSecondaryBuffer;
41
42         HRESULT hr = pDevice_->raw()->CreateSoundBuffer(&dsbdesc , &pTempBuffer , NULL);
43         if(FAILED(hr)){
44                 *ConsoleOut::getInstance() << _T("Failed --- CreateSecondarySoundBuffer") << std::endl;
45                 return NULL;
46         }
47
48         hr = pTempBuffer->QueryInterface(IID_IDirectSoundBuffer8 , (LPVOID*)&pSecondaryBuffer);
49         pTempBuffer->Release();
50         if (FAILED(hr)){
51                 *ConsoleOut::getInstance() << _T("Failed --- QueryInterface") << std::endl;
52                 return NULL;
53         }
54
55
56         mof::SoundBuffer* soundBuffer = new mof::StaticSoundBuffer(pDevice_, pSecondaryBuffer , soundFile);
57         pSecondaryBuffer->Release();
58         if(soundBuffer->initialize())return soundBuffer;
59         delete soundBuffer;
60         return NULL;
61
62 }
63 //}}}
64 //{{{ loadStreamSound
65 mof::SoundBuffer* loadStreamSound(const mof::tstring& filename , mof::SoundFile* soundFile){
66         
67         if(!soundFile->open(filename.c_str())){
68                 *ConsoleOut::getInstance() << _T("Can't Open File --- ") << filename << std::endl; 
69                 return NULL;
70         }
71         
72         //---\83Z\83J\83\93\83_\83\8a\83o\83b\83t\83@\82Ì\90\90¬
73         WAVEFORMATEX* format = soundFile->getFormat();
74         DSBUFFERDESC dsbdesc;
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;
81
82         LPDIRECTSOUNDBUFFER pTempBuffer;
83         LPDIRECTSOUNDBUFFER8 pSecondaryBuffer;
84         LPDIRECTSOUNDNOTIFY8 pSoundNotify;
85
86         HRESULT hr = pDevice_->raw()->CreateSoundBuffer(&dsbdesc , &pTempBuffer , NULL);
87         if(FAILED(hr)){
88                 *ConsoleOut::getInstance() << _T("Failed --- CreateSecondarySoundBuffer") << std::endl;
89                 return NULL;
90         }
91
92         hr = pTempBuffer->QueryInterface(IID_IDirectSoundBuffer8 , (LPVOID*)&pSecondaryBuffer);
93         if (FAILED(hr)){
94                 pTempBuffer->Release();
95                 *ConsoleOut::getInstance() << _T("Failed --- QueryInterface") << std::endl;
96                 return NULL;
97         }
98
99         hr = pTempBuffer->QueryInterface(IID_IDirectSoundNotify8 , (LPVOID*)&pSoundNotify);
100         pTempBuffer->Release();
101         if (FAILED(hr)){
102                 pSecondaryBuffer->Release();
103                 *ConsoleOut::getInstance() << _T("Failed --- QueryInterface") << std::endl;
104                 return NULL;
105         }
106
107
108         mof::SoundBuffer* soundBuffer = new mof::StreamSoundBuffer(pDevice_, pSecondaryBuffer , pSoundNotify , soundFile);
109         pSecondaryBuffer->Release();
110         pSoundNotify->Release();
111         if(soundBuffer->initialize())return soundBuffer;
112         delete soundBuffer;
113         return NULL;
114
115 }
116 //}}}
117 }
118
119
120 namespace mof
121 {
122 namespace sound
123 {
124 //{{{ initialize
125         bool SoundDevice::initialize(HWND hWnd, bool enable_output)
126         {
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»
129                 return true;
130         }
131 //}}}
132 //{{{ finalize
133         void SoundDevice::finalize()
134         {
135                 pDevice_ = std::shared_ptr<DirectSoundDevice>();// NULL\82ð\90Ý\92è
136         }
137 //}}}
138 //{{{ create_static_sound
139 std::unique_ptr<mof::SoundBuffer> SoundDevice::create_static_sound(const mof::tstring& filename)
140 {
141         //---\83t\83H\81[\83}\83b\83g\82ð\92²\82×\82é
142         // TODO \8aÖ\90\94\89»
143         tstring format;
144         try {
145                 boost::regex regex("(.*)\\.(.*)");//name . format
146                 boost::smatch match;
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");
151                 }
152                 format = match.str(2);  
153         }
154         catch (std::exception &e) {
155                 exit(0);
156         }
157
158         SoundBuffer* buffer = NULL;
159         if(format == "ogg")buffer = loadStaticSound(filename , new OggVorbisFile());
160         else if(format == "wav")buffer = loadStaticSound( filename , new WaveFile());
161         
162         if(buffer == NULL){
163                 *ConsoleOut::getInstance() << _T("UnKnownFileFormat ---") << format;
164                 throw std::invalid_argument("unknown file format");
165         }
166         return std::unique_ptr<SoundBuffer>(buffer);
167 }
168 //}}}
169 //{{{ create_streaming_sound
170 std::unique_ptr<mof::SoundBuffer> SoundDevice::create_streaming_sound(const mof::tstring& filename)
171 {
172         //---\83t\83H\81[\83}\83b\83g\82ð\92²\82×\82é
173         // TODO \8aÖ\90\94\89»
174         tstring format;
175         try {
176                 boost::regex regex("(.*)\\.(.*)");//name . format
177                 boost::smatch match;
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");
182                 }
183                 format = match.str(2);  
184         }
185         catch (std::exception &e) {
186                 exit(0);
187         }
188
189         SoundBuffer* buffer = NULL;
190         
191         if(format == "ogg")buffer = loadStreamSound(filename , new OggVorbisFile());
192         else if(format == "wav")buffer = loadStreamSound( filename , new WaveFile());
193         
194         if(buffer == NULL){
195                 *ConsoleOut::getInstance() << _T("UnKnownFileFormat ---") << format;
196                 throw std::invalid_argument("unknown file format");
197         }
198         return std::unique_ptr<SoundBuffer>(buffer);
199 }
200 //}}}
201 }
202 }
203