OSDN Git Service

run loop input wave
[internetcity/break_prototype.git] / source / CInputWave.cpp
1 // \8b\9e
2 #include "CInputWave.h"
3
4
5 #include <iostream>
6 #include <Windows.h>
7 #include <MMSystem.h>
8 //#include <tchar.h>
9
10
11 ////////////////////////////////////////////////////////////////////////////////
12 // \83R\83\93\83X\83g\83\89\83N\83^
13 ////////////////////////////////////////////////////////////////////////////////
14 CInputWave::CInputWave()
15 {
16         // Wave\83f\83o\83C\83X\83n\83\93\83h\83\8b
17         m_hWaveIn = 0;
18
19         // Wave\83w\83b\83_\81[
20         m_WaveHeader.lpData         = NULL;
21         m_WaveHeader.dwBufferLength = 0;
22         m_WaveHeader.dwFlags        = 0;
23
24         m_pWaveData = NULL;
25
26         // \83f\83o\83C\83X\82ð\83I\81[\83v\83\93\82µ\82Ä\82¢\82é
27         m_isOpen = false;
28         // \8dÄ\90\92\86
29         m_isInput = false;
30 }
31
32 ////////////////////////////////////////////////////////////////////////////////
33 // \83f\83X\83g\83\89\83N\83^
34 ////////////////////////////////////////////////////////////////////////////////
35 CInputWave::~CInputWave()
36 {
37         close();
38 }
39
40
41 ////////////////////////////////////////////////////////////////////////////////
42 // \93ü\97Í\83f\83o\83C\83X\82Ì\8fó\91Ô\82ð\92m\82ç\82¹\82é\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94
43 ////////////////////////////////////////////////////////////////////////////////
44 void CALLBACK CInputWave::waveInProc(HWAVEIN in_hWaveIn, UINT in_Message, DWORD in_Instance, DWORD in_Param1, DWORD in_Param2)
45 {
46         // waveInOpen\8e\9e\82Éin_Instance\82É\83N\83\89\83X\82Ì\83|\83C\83\93\83^\82ð\8ai\94[\82µ\82Ä\82¨\82­
47
48         CInputWave* a_pInputWave = reinterpret_cast<CInputWave*>(in_Instance);
49         a_pInputWave->procedureWave(in_hWaveIn, in_Message, in_Instance, in_Param1, in_Param2);
50 }
51
52 ////////////////////////////////////////////////////////////////////////////////
53 // \8f\89\8aú\89»
54 ////////////////////////////////////////////////////////////////////////////////
55 void CInputWave::initialize()
56 {
57 }
58
59 ////////////////////////////////////////////////////////////////////////////////
60 // \83f\83o\83C\83X\82ð\8aJ\82­
61 ////////////////////////////////////////////////////////////////////////////////
62 bool CInputWave::open()
63 {
64         // \98A\91±\82Å\8dÄ\90\82·\82é\8fê\8d\87\82Í\83_\83u\83\8b\83o\83b\83t\83@\82ð\8eg\97p\82·\82é\81H
65
66         // \83f\83o\83C\83X\82ð\8aJ\82­
67         // \8aJ\82­\83f\83o\83C\83X\82à\88ø\90\94\82Å\8ew\92è\82Å\82«\82é\82æ\82¤\82É\82·\82é
68         if(waveInOpen(&m_hWaveIn, WAVE_MAPPER, m_pWaveData->getWaveFormat(), reinterpret_cast<DWORD>(waveInProc), reinterpret_cast<DWORD>(this), CALLBACK_FUNCTION) != MMSYSERR_NOERROR) {
69                 //MessageBox(NULL, TEXT("WAVE\83f\83o\83C\83X\82Ì\83I\81[\83v\83\93\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B"), NULL, MB_ICONWARNING);
70                 throw "WAVE\83f\83o\83C\83X\82Ì\83I\81[\83v\83\93\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B";
71                 return false;
72         }
73
74         // Wave\83w\83b\83_\81[
75         m_WaveHeader.lpData         = m_pWaveData->getWaveBuffer();
76         m_WaveHeader.dwBufferLength = m_pWaveData->getBufferSize();
77         m_WaveHeader.dwFlags        = 0;
78
79         if(m_WaveHeader.lpData == NULL){
80                 return false;
81         }
82
83         // \83w\83b\83_\81[\82ð\8f\80\94õ\82·\82é
84         waveInPrepareHeader(m_hWaveIn, &m_WaveHeader, sizeof(WAVEHDR));
85         // \83o\83b\83t\83@\82ð\93n\82·
86         waveInAddBuffer(m_hWaveIn, &m_WaveHeader, sizeof(WAVEHDR));
87         m_isOpen = true;
88
89         return true;
90 }
91
92 ////////////////////////////////////////////////////////////////////////////////
93 // \83f\83o\83C\83X\82ð\95Â\82\82é
94 ////////////////////////////////////////////////////////////////////////////////
95 bool CInputWave::close()
96 {
97         stop();
98
99         if(m_isOpen){
100                 m_isOpen = false;
101                 // \83w\83b\83_\81[\89ð\95ú\97p\8aÖ\90\94
102                 waveInUnprepareHeader(m_hWaveIn, &m_WaveHeader, sizeof(WAVEHDR));
103                 // \83f\83o\83C\83X\83N\83\8d\81[\83Y\8aÖ\90\94
104                 waveInClose(m_hWaveIn);
105         }
106         return true;
107 }
108
109 ////////////////////////////////////////////////////////////////////////////////
110 // \93ü\97Í\81i\98^\89¹\81j\82ð\8aJ\8en\82·\82é
111 ////////////////////////////////////////////////////////////////////////////////
112 bool CInputWave::start()
113 {
114         // \83f\83o\83C\83X\82ð\8aJ\82¢\82Ä\82¢\82È\82¢\82©\81A\98^\89¹\92\86\82È\82çfalse\82ð\95Ô\82·
115         if(!m_isOpen || m_isInput){
116                 return false;
117         }
118
119         // \83o\83b\83t\83@\82ð\8dÄ\82Ñ\93n\82³\82È\82¢\82Æ\90V\82½\82É\98^\89¹\82Å\82«\82È\82¢\82ç\82µ\82¢
120         // \83w\83b\83_\81[\82ð\8f\80\94õ\82·\82é
121         switch(waveInPrepareHeader(m_hWaveIn, &m_WaveHeader, sizeof(WAVEHDR))){
122         // \90¬\8c÷
123         case MMSYSERR_NOERROR:
124                 break;
125
126         // \95Ê\82Ì\83X\83\8c\83b\83h\82ª\83n\83\93\83h\83\8b\82ð\8eg\97p\92\86\82Å\82 \82é
127         case MMSYSERR_HANDLEBUSY:
128                 throw "waveInPrepareHeader: \95Ê\82Ì\83X\83\8c\83b\83h\82ª\83n\83\93\83h\83\8b\82ð\8eg\97p\92\86\82Å\82 \82é ";
129                 break;
130         // \83f\83o\83C\83X\83n\83\93\83h\83\8b\82ª\96³\8cø\82Å\82 \82é
131         case MMSYSERR_INVALHANDLE:
132                 throw "waveInPrepareHeader: \83f\83o\83C\83X\83n\83\93\83h\83\8b\82ª\96³\8cø\82Å\82 \82é";
133                 break;
134         // \83f\83o\83C\83X\83h\83\89\83C\83o\82ª\82È\82¢
135         case MMSYSERR_NODRIVER:
136                 throw "waveInPrepareHeader:\83f\83o\83C\83X\83h\83\89\83C\83o\82ª\82È\82¢";
137                 break;
138         // \83\81\83\82\83\8a\82ð\8a\84\82è\93\96\82Ä\82ç\82ê\82È\82¢\81A\82Ü\82½\82Í\83\8d\83b\83N\82Å\82«\82È\82¢
139         case MMSYSERR_NOMEM:
140                 throw "waveInPrepareHeader: \83\81\83\82\83\8a\82ð\8a\84\82è\93\96\82Ä\82ç\82ê\82È\82¢\81A\82Ü\82½\82Í\83\8d\83b\83N\82Å\82«\82È\82¢";
141                 break;
142         }
143
144         // \83o\83b\83t\83@\82ð\93n\82·
145         switch(waveInAddBuffer(m_hWaveIn, &m_WaveHeader, sizeof(WAVEHDR))){
146         // \90¬\8c÷
147         case MMSYSERR_NOERROR:
148                 break;
149
150         // \95Ê\82Ì\83X\83\8c\83b\83h\82ª\83n\83\93\83h\83\8b\82ð\8eg\97p\92\86\82Å\82 \82é
151         case MMSYSERR_HANDLEBUSY:
152                 throw "waveInAddBuffer: \95Ê\82Ì\83X\83\8c\83b\83h\82ª\83n\83\93\83h\83\8b\82ð\8eg\97p\92\86\82Å\82 \82é";
153                 break;
154
155         // \83f\83o\83C\83X\83n\83\93\83h\83\8b\82ª\96³\8cø\82Å\82 \82é
156         case MMSYSERR_INVALHANDLE:
157                 throw "waveInAddBuffer: \83f\83o\83C\83X\83n\83\93\83h\83\8b\82ª\96³\8cø\82Å\82 \82é";
158                 break;
159
160         // \83f\83o\83C\83X\83h\83\89\83C\83o\82ª\82È\82¢
161         case MMSYSERR_NODRIVER:
162                 throw "waveInAddBuffer: \83f\83o\83C\83X\83h\83\89\83C\83o\82ª\82È\82¢";
163                 break;
164
165         // \83\81\83\82\83\8a\82ð\8a\84\82è\93\96\82Ä\82ç\82ê\82È\82¢\81A\82Ü\82½\82Í\83\8d\83b\83N\82Å\82«\82È\82¢
166         case MMSYSERR_NOMEM:
167                 throw "waveInAddBuffer: \83\81\83\82\83\8a\82ð\8a\84\82è\93\96\82Ä\82ç\82ê\82È\82¢\81A\82Ü\82½\82Í\83\8d\83b\83N\82Å\82«\82È\82¢";
168                 break;
169
170         // \83o\83b\83t\83@\82ª\8f\80\94õ\82³\82ê\82Ä\82¢\82È\82¢
171         case WAVERR_UNPREPARED:
172                 throw "waveInAddBuffer: \83o\83b\83t\83@\82ª\8f\80\94õ\82³\82ê\82Ä\82¢\82È\82¢";
173                 break;
174
175         }
176
177         waveInStart(m_hWaveIn);
178         m_isInput = true;
179         return true;
180 }
181
182 ////////////////////////////////////////////////////////////////////////////////
183 // \93ü\97Í\81i\98^\89¹\81j\82ð\92â\8e~\82·\82é
184 ////////////////////////////////////////////////////////////////////////////////
185 bool CInputWave::stop()
186 {
187         // \98^\89¹\92\86\82Å\82È\82¢\82È\82çfalse\82ð\95Ô\82·
188         if(!m_isInput){
189                 return false;
190         }
191
192         m_isInput = false;
193         waveInStop(m_hWaveIn);
194
195
196         return true;
197 }
198
199 ////////////////////////////////////////////////////////////////////////////////
200 // \93ü\97Í\83f\83o\83C\83X\82Ì\8fó\91Ô\82ð\92m\82ç\82¹\82é\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94
201 ////////////////////////////////////////////////////////////////////////////////
202 void CInputWave::procedureWave(HWAVEIN in_hWaveIn, UINT in_Message, DWORD in_Instance, DWORD in_Param1, DWORD in_Param2)
203 {
204         // \83\81\83b\83Z\81[\83W\82Ì\8eí\97Þ\82²\82Æ\82Ì\8f\88\97\9d\82ð\8ds\82¤
205         switch(in_Message){
206         // \83f\83o\83C\83X\82ª waveInClose \8aÖ\90\94\82Å\83N\83\8d\81[\83Y\82³\82ê\82½\82Æ\82«\82É\91\97\90M\82³\82ê\82Ü\82·\81B
207         case WIM_CLOSE:
208                 std::cout << "WIM_CLOSE" << std::endl;
209                 break;
210         // \83f\83o\83C\83X\82ª\81AwaveInAddBuffer \8aÖ\90\94\82Å\91\97\90M\82³\82ê\82½\83f\81[\83^\83u\83\8d\83b\83N\82Ì\8f\88\97\9d\82ð\8fI\97¹\82µ\82½\82Æ\82«\82É\91\97\90M\82³\82ê\82Ü\82·\81B
211         case WIM_DATA:
212                 m_isInput = false;
213                 std::cout << "WIM_DATA" << std::endl;
214                 break;
215         // \83f\83o\83C\83X\82ª waveInOpen \8aÖ\90\94\82Å\83I\81[\83v\83\93\82³\82ê\82½\82Æ\82«\82É\91\97\90M\82³\82ê\82Ü\82·\81B
216         case WIM_OPEN:
217                 std::cout << "WIM_OPEN" << std::endl;
218                 break;
219         default:
220                 throw "error: WAVE Call Back";
221                 break;
222         }
223 }