#include <MMSystem.h>
//#include <tchar.h>
-
////////////////////////////////////////////////////////////////////////////////
// \83R\83\93\83X\83g\83\89\83N\83^
////////////////////////////////////////////////////////////////////////////////
// \83f\83o\83C\83X\82ð\83I\81[\83v\83\93\82µ\82Ä\82¢\82é
m_isOpen = false;
- // \8dÄ\90¶\92\86
+ // \93ü\97Í\92\86
m_isInput = false;
+
+ m_MaxNumberOfBuffer = 3;
+ m_NumberOfBufferInQueue = 0;
}
////////////////////////////////////////////////////////////////////////////////
// waveInOpen\8e\9e\82Éin_Instance\82É\83N\83\89\83X\82Ì\83|\83C\83\93\83^\82ð\8ai\94[\82µ\82Ä\82¨\82
CInputWave* a_pInputWave = reinterpret_cast<CInputWave*>(in_Instance);
- a_pInputWave->procedureWave(in_hWaveIn, in_Message, in_Instance, in_Param1, in_Param2);
+ a_pInputWave->callbackWave(in_hWaveIn, in_Message, in_Instance, in_Param1, in_Param2);
+}
+
+void CInputWave::callbackWave(HWAVEIN in_hWaveIn, UINT in_Message, DWORD in_Instance, DWORD in_Param1, DWORD in_Param2)
+{
+ // \83\81\83b\83Z\81[\83W\82Ì\8eí\97Þ\82²\82Æ\82Ì\8f\88\97\9d\82ð\8ds\82¤
+ switch(in_Message){
+ // \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
+ case WIM_CLOSE:
+ std::cout << "WIM_CLOSE" << std::endl;
+ break;
+
+ // \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
+ case WIM_DATA:
+ std::cout << "WIM_DATA" << std::endl;
+ // \98^\89¹\83t\83\89\83O\82ª\97§\82Á\82Ä\82¢\82é\8fê\8d\87\82Í\83o\83b\83t\83@\82ð\89Á\82¦\82é
+ m_NumberOfBufferInQueue--;
+ try{
+ if(m_isInput){
+ start();
+ }
+ else{
+ m_isInput = false;
+ }
+ }
+ catch(...){
+ m_isInput = false;
+ }
+ break;
+
+ // \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
+ case WIM_OPEN:
+ std::cout << "WIM_OPEN" << std::endl;
+ break;
+ default:
+ throw "error: WAVE Call Back";
+ break;
+ }
}
////////////////////////////////////////////////////////////////////////////////
{
// \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
- // \83f\83o\83C\83X\82ð\8aJ\82
- // \8aJ\82\83f\83o\83C\83X\82à\88ø\90\94\82Å\8ew\92è\82Å\82«\82é\82æ\82¤\82É\82·\82é
+ // open a wave device handle
+ // \81¦\8aJ\82\83f\83o\83C\83X\82à\88ø\90\94\82Å\8ew\92è\82Å\82«\82é\82æ\82¤\82É\82·\82é
if(waveInOpen(&m_hWaveIn, WAVE_MAPPER, m_pWaveData->getWaveFormat(), reinterpret_cast<DWORD>(waveInProc), reinterpret_cast<DWORD>(this), CALLBACK_FUNCTION) != MMSYSERR_NOERROR) {
- //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);
- throw "WAVE\83f\83o\83C\83X\82Ì\83I\81[\83v\83\93\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B";
+ throw "failer open wave device handle";
return false;
}
- // Wave\83w\83b\83_\81[
- m_WaveHeader.lpData = m_pWaveData->getWaveBuffer();
- m_WaveHeader.dwBufferLength = m_pWaveData->getBufferSize();
+ // set wave header elements
+ // get new buffer of wave
+ m_WaveHeader.lpData = m_pWaveData->getWriteBuffer();
+ m_WaveHeader.dwBufferLength = m_pWaveData->getWriteBufferSize();
m_WaveHeader.dwFlags = 0;
if(m_WaveHeader.lpData == NULL){
return false;
}
- // \83w\83b\83_\81[\82ð\8f\80\94õ\82·\82é
- waveInPrepareHeader(m_hWaveIn, &m_WaveHeader, sizeof(WAVEHDR));
- // \83o\83b\83t\83@\82ð\93n\82·
- waveInAddBuffer(m_hWaveIn, &m_WaveHeader, sizeof(WAVEHDR));
m_isOpen = true;
return true;
if(m_isOpen){
m_isOpen = false;
- // \83w\83b\83_\81[\89ð\95ú\97p\8aÖ\90\94
- waveInUnprepareHeader(m_hWaveIn, &m_WaveHeader, sizeof(WAVEHDR));
- // \83f\83o\83C\83X\83N\83\8d\81[\83Y\8aÖ\90\94
+ // uninitialize a wave header
+ waveInUnprepareHeader(m_hWaveIn, m_pWaveData->getWriteWaveHeader(), sizeof(WAVEHDR));
+ // close a wave device handle
waveInClose(m_hWaveIn);
}
return true;
}
////////////////////////////////////////////////////////////////////////////////
+// add wave buffer in queue
+////////////////////////////////////////////////////////////////////////////////
+bool CInputWave::addWaveBuffer()
+{
+ while(m_NumberOfBufferInQueue < m_MaxNumberOfBuffer){
+ WAVEHDR* a_pWaveHeader = m_pWaveData->getWriteWaveHeader();
+ a_pWaveHeader->lpData = m_pWaveData->getWriteBuffer();
+ a_pWaveHeader->dwBufferLength = m_pWaveData->getWriteBufferSize();
+ a_pWaveHeader->dwFlags = 0;
+
+ m_pWaveData->nextWriteBuffer();
+
+ // initialize a wave header
+ // must use this function for initialize, because not open wave header structure
+ switch(waveInPrepareHeader(m_hWaveIn, a_pWaveHeader, sizeof(WAVEHDR))){
+ // \90¬\8c÷
+ case MMSYSERR_NOERROR:
+ break;
+
+ // \95Ê\82Ì\83X\83\8c\83b\83h\82ª\83n\83\93\83h\83\8b\82ð\8eg\97p\92\86\82Å\82 \82é
+ case MMSYSERR_HANDLEBUSY:
+ throw "waveInPrepareHeader: \95Ê\82Ì\83X\83\8c\83b\83h\82ª\83n\83\93\83h\83\8b\82ð\8eg\97p\92\86\82Å\82 \82é ";
+ break;
+ // \83f\83o\83C\83X\83n\83\93\83h\83\8b\82ª\96³\8cø\82Å\82 \82é
+ case MMSYSERR_INVALHANDLE:
+ throw "waveInPrepareHeader: \83f\83o\83C\83X\83n\83\93\83h\83\8b\82ª\96³\8cø\82Å\82 \82é";
+ break;
+ // \83f\83o\83C\83X\83h\83\89\83C\83o\82ª\82È\82¢
+ case MMSYSERR_NODRIVER:
+ throw "waveInPrepareHeader:\83f\83o\83C\83X\83h\83\89\83C\83o\82ª\82È\82¢";
+ break;
+ // \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¢
+ case MMSYSERR_NOMEM:
+ 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¢";
+ break;
+ }
+
+ // take a buffer for wave
+ switch(waveInAddBuffer(m_hWaveIn, a_pWaveHeader, sizeof(WAVEHDR))){
+ // \90¬\8c÷
+ case MMSYSERR_NOERROR:
+ break;
+
+ // \95Ê\82Ì\83X\83\8c\83b\83h\82ª\83n\83\93\83h\83\8b\82ð\8eg\97p\92\86\82Å\82 \82é
+ case MMSYSERR_HANDLEBUSY:
+ throw "waveInAddBuffer: \95Ê\82Ì\83X\83\8c\83b\83h\82ª\83n\83\93\83h\83\8b\82ð\8eg\97p\92\86\82Å\82 \82é";
+ break;
+
+ // \83f\83o\83C\83X\83n\83\93\83h\83\8b\82ª\96³\8cø\82Å\82 \82é
+ case MMSYSERR_INVALHANDLE:
+ throw "waveInAddBuffer: \83f\83o\83C\83X\83n\83\93\83h\83\8b\82ª\96³\8cø\82Å\82 \82é";
+ break;
+
+ // \83f\83o\83C\83X\83h\83\89\83C\83o\82ª\82È\82¢
+ case MMSYSERR_NODRIVER:
+ throw "waveInAddBuffer: \83f\83o\83C\83X\83h\83\89\83C\83o\82ª\82È\82¢";
+ break;
+
+ // \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¢
+ case MMSYSERR_NOMEM:
+ 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¢";
+ break;
+
+ // \83o\83b\83t\83@\82ª\8f\80\94õ\82³\82ê\82Ä\82¢\82È\82¢
+ case WAVERR_UNPREPARED:
+ throw "waveInAddBuffer: \83o\83b\83t\83@\82ª\8f\80\94õ\82³\82ê\82Ä\82¢\82È\82¢";
+ break;
+
+ }
+ m_NumberOfBufferInQueue++;
+ }
+ return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
// \93ü\97Í\81i\98^\89¹\81j\82ð\8aJ\8en\82·\82é
////////////////////////////////////////////////////////////////////////////////
bool CInputWave::start()
{
- // \83f\83o\83C\83X\82ð\8aJ\82¢\82Ä\82¢\82È\82¢\82©\81A\98^\89¹\92\86\82È\82çfalse\82ð\95Ô\82·
- if(!m_isOpen || m_isInput){
+ // \83f\83o\83C\83X\82ð\8aJ\82¢\82Ä\82¢\82È\82¢\82È\82çfalse\82ð\95Ô\82·
+ if(!m_isOpen){
return false;
}
- // \83o\83b\83t\83@\82ð\8dÄ\82Ñ\93n\82³\82È\82¢\82Æ\90V\82½\82É\98^\89¹\82Å\82«\82È\82¢\82ç\82µ\82¢
- // \83w\83b\83_\81[\82ð\8f\80\94õ\82·\82é
- switch(waveInPrepareHeader(m_hWaveIn, &m_WaveHeader, sizeof(WAVEHDR))){
- // \90¬\8c÷
- case MMSYSERR_NOERROR:
- break;
- // \95Ê\82Ì\83X\83\8c\83b\83h\82ª\83n\83\93\83h\83\8b\82ð\8eg\97p\92\86\82Å\82 \82é
- case MMSYSERR_HANDLEBUSY:
- throw "waveInPrepareHeader: \95Ê\82Ì\83X\83\8c\83b\83h\82ª\83n\83\93\83h\83\8b\82ð\8eg\97p\92\86\82Å\82 \82é ";
- break;
- // \83f\83o\83C\83X\83n\83\93\83h\83\8b\82ª\96³\8cø\82Å\82 \82é
- case MMSYSERR_INVALHANDLE:
- throw "waveInPrepareHeader: \83f\83o\83C\83X\83n\83\93\83h\83\8b\82ª\96³\8cø\82Å\82 \82é";
- break;
- // \83f\83o\83C\83X\83h\83\89\83C\83o\82ª\82È\82¢
- case MMSYSERR_NODRIVER:
- throw "waveInPrepareHeader:\83f\83o\83C\83X\83h\83\89\83C\83o\82ª\82È\82¢";
- break;
- // \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¢
- case MMSYSERR_NOMEM:
- 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¢";
- break;
- }
+ // \83o\83b\83t\83@\82ð\89Á\82¦\82é
+ addWaveBuffer();
- // \83o\83b\83t\83@\82ð\93n\82·
- switch(waveInAddBuffer(m_hWaveIn, &m_WaveHeader, sizeof(WAVEHDR))){
+ switch(waveInStart(m_hWaveIn)){
// \90¬\8c÷
case MMSYSERR_NOERROR:
break;
- // \95Ê\82Ì\83X\83\8c\83b\83h\82ª\83n\83\93\83h\83\8b\82ð\8eg\97p\92\86\82Å\82 \82é
- case MMSYSERR_HANDLEBUSY:
- throw "waveInAddBuffer: \95Ê\82Ì\83X\83\8c\83b\83h\82ª\83n\83\93\83h\83\8b\82ð\8eg\97p\92\86\82Å\82 \82é";
- break;
-
- // \83f\83o\83C\83X\83n\83\93\83h\83\8b\82ª\96³\8cø\82Å\82 \82é
+ // \8ew\92è\82³\82ê\82½\83f\83o\83C\83X\83n\83\93\83h\83\8b\82Í\96³\8cø\82Å\82·\81B
case MMSYSERR_INVALHANDLE:
- throw "waveInAddBuffer: \83f\83o\83C\83X\83n\83\93\83h\83\8b\82ª\96³\8cø\82Å\82 \82é";
break;
- // \83f\83o\83C\83X\83h\83\89\83C\83o\82ª\82È\82¢
+ // \83f\83o\83C\83X\83h\83\89\83C\83o\82ª\91¶\8dÝ\82µ\82Ü\82¹\82ñ\81B
case MMSYSERR_NODRIVER:
- throw "waveInAddBuffer: \83f\83o\83C\83X\83h\83\89\83C\83o\82ª\82È\82¢";
break;
- // \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¢
+ // \83\81\83\82\83\8a\82ð\8a\84\82è\93\96\82Ä\82ç\82ê\82È\82¢\82©\81A\82Ü\82½\82Í\83\8d\83b\83N\82Å\82«\82Ü\82¹\82ñ\81B
case MMSYSERR_NOMEM:
- 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¢";
break;
-
- // \83o\83b\83t\83@\82ª\8f\80\94õ\82³\82ê\82Ä\82¢\82È\82¢
- case WAVERR_UNPREPARED:
- throw "waveInAddBuffer: \83o\83b\83t\83@\82ª\8f\80\94õ\82³\82ê\82Ä\82¢\82È\82¢";
- break;
-
}
-
- waveInStart(m_hWaveIn);
m_isInput = true;
return true;
}
return true;
}
-////////////////////////////////////////////////////////////////////////////////
-// \93ü\97Í\83f\83o\83C\83X\82Ì\8fó\91Ô\82ð\92m\82ç\82¹\82é\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94
-////////////////////////////////////////////////////////////////////////////////
-void CInputWave::procedureWave(HWAVEIN in_hWaveIn, UINT in_Message, DWORD in_Instance, DWORD in_Param1, DWORD in_Param2)
-{
- // \83\81\83b\83Z\81[\83W\82Ì\8eí\97Þ\82²\82Æ\82Ì\8f\88\97\9d\82ð\8ds\82¤
- switch(in_Message){
- // \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
- case WIM_CLOSE:
- std::cout << "WIM_CLOSE" << std::endl;
- break;
- // \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
- case WIM_DATA:
- m_isInput = false;
- std::cout << "WIM_DATA" << std::endl;
- break;
- // \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
- case WIM_OPEN:
- std::cout << "WIM_OPEN" << std::endl;
- break;
- default:
- throw "error: WAVE Call Back";
- break;
- }
-}
bool m_isOpen;
// \98^\89¹\92\86
bool m_isInput;
+ // \83L\83\85\81[\82É\89Á\82¦\82é\83o\83b\83t\83@\90\94
+ int m_MaxNumberOfBuffer;
+ // \83L\83\85\81[\82É\89Á\82¦\82Ä\82¢\82é\83o\83b\83t\83@\90\94
+ int m_NumberOfBufferInQueue;
////////////////////////////////////////////////////////////////////////////////
// \83R\83\93\83X\83g\83\89\83N\83^
// \83f\83X\83g\83\89\83N\83^
////////////////////////////////////////////////////////////////////////////////
public:
- ~CInputWave();
+ virtual ~CInputWave();
////////////////////////////////////////////////////////////////////////////////
// \83R\81[\83\8b\83o\83b\83N\95Ï\90\94
////////////////////////////////////////////////////////////////////////////////
// \93ü\97Í\83f\83o\83C\83X\82Ì\8fó\91Ô\82ð\92m\82ç\82¹\82é\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94
static void CALLBACK waveInProc(HWAVEIN in_hWaveIn, UINT in_Message, DWORD in_Instance, DWORD in_Param1, DWORD in_Param2);
+ void callbackWave(HWAVEIN in_hWaveIn, UINT in_Message, DWORD in_Instance, DWORD in_Param1, DWORD in_Param2);
////////////////////////////////////////////////////////////////////////////////
bool open();
// \83f\83o\83C\83X\82ð\95Â\82¶\82é
bool close();
+protected:
+ // add wave buffer in queue
+ bool addWaveBuffer();
+public:
// \93ü\97Í\81i\98^\89¹\81j\82ð\8aJ\8en\82·\82é
bool start();
// \93ü\97Í\81i\98^\89¹\81j\82ð\92â\8e~\82·\82é
bool stop();
- // \93ü\97Í\83f\83o\83C\83X\82Ì\8fó\91Ô\82ð\92m\82ç\82¹\82é\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94
- void procedureWave(HWAVEIN in_hWaveIn, UINT in_Message, DWORD in_Instance, DWORD in_Param1, DWORD in_Param2);
////////////////////////////////////////////////////////////////////////////////
// \91®\90«\83\81\83\\83b\83h
m_isOpen = false;
// \8dÄ\90¶\92\86
m_isOutput = false;
+
+ m_MaxNumberOfBuffer = 2;
+ m_NumberOfBufferInQueue = 0;
}
////////////////////////////////////////////////////////////////////////////////
// waveInOpen\8e\9e\82Éin_Instance\82É\83N\83\89\83X\82Ì\83|\83C\83\93\83^\82ð\8ai\94[\82µ\82Ä\82¨\82
COutputWave* a_pOutputWave = reinterpret_cast<COutputWave*>(in_Instance);
- a_pOutputWave->procedureWave(in_hWaveOut, in_Message, in_Instance, in_Param1, in_Param2);
+ a_pOutputWave->callbackWave(in_hWaveOut, in_Message, in_Instance, in_Param1, in_Param2);
+}
+
+void COutputWave::callbackWave(HWAVEOUT in_hWaveOut, UINT in_Message, DWORD in_Instance, DWORD in_Param1, DWORD in_Param2)
+{
+ // \83\81\83b\83Z\81[\83W\82Ì\8eí\97Þ\82²\82Æ\82Ì\8f\88\97\9d\82ð\8ds\82¤
+ switch(in_Message){
+ // \83f\83o\83C\83X\82ª waveOutClose \8aÖ\90\94\82Å\83N\83\8d\81[\83Y\82³\82ê\82½\82Æ\82«\82É\91\97\90M\82³\82ê\82Ü\82·\81B
+ case WOM_CLOSE:
+ std::cout << "WOM_CLOSE" << std::endl;
+ break;
+
+ // \83f\83o\83C\83X\83h\83\89\83C\83o\82ª\81AwaveOutWrite \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
+ case WOM_DONE:
+ std::cout << "WOM_DATA" << std::endl;
+ // \8dÄ\90¶\83t\83\89\83O\82ª\97§\82Á\82Ä\82¢\82é\8fê\8d\87\82Í\83o\83b\83t\83@\82ð\89Á\82¦\82é
+ m_NumberOfBufferInQueue--;
+ try{
+ if(m_isOutput){
+ start();
+ }
+ else{
+ m_isOutput = false;
+ }
+ }
+ catch(...){
+ m_isOutput = false;
+ }
+ break;
+
+ // \83f\83o\83C\83X\82ª waveOutOpen \8aÖ\90\94\82Å\83I\81[\83v\83\93\82³\82ê\82½\82Æ\82«\82É\91\97\90M\82³\82ê\82Ü\82·\81B
+ case WOM_OPEN:
+ std::cout << "WOM_OPEN" << std::endl;
+ break;
+ default:
+ throw "error: WAVE Call Back";
+ break;
+ }
}
+
////////////////////////////////////////////////////////////////////////////////
// \8f\89\8aú\89»
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
bool COutputWave::open()
{
- // \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
-
// \83f\83o\83C\83X\82ð\8aJ\82
// \8aJ\82\83f\83o\83C\83X\82à\88ø\90\94\82Å\8ew\92è\82Å\82«\82é\82æ\82¤\82É\82·\82é
if(waveOutOpen(&m_hWaveOut, WAVE_MAPPER, m_pWaveData->getWaveFormat(), reinterpret_cast<DWORD>(waveOutProc), reinterpret_cast<DWORD>(this), CALLBACK_FUNCTION) != MMSYSERR_NOERROR) {
return false;
}
- // Wave\83w\83b\83_\81[
- m_WaveHeader.lpData = m_pWaveData->getWaveBuffer();
- m_WaveHeader.dwBufferLength = m_pWaveData->getBufferSize();
- m_WaveHeader.dwFlags = 0;
-
- if(m_WaveHeader.lpData == NULL){
- return false;
- }
-
-
- // \83w\83b\83_\81[\82ð\8f\80\94õ\82·\82é
- waveOutPrepareHeader(m_hWaveOut, &m_WaveHeader, sizeof(WAVEHDR));
m_isOpen = true;
return true;
}
////////////////////////////////////////////////////////////////////////////////
+// add wave buffer in queue
+////////////////////////////////////////////////////////////////////////////////
+bool COutputWave::addWaveBuffer()
+{
+ while(m_NumberOfBufferInQueue < m_MaxNumberOfBuffer){
+ WAVEHDR* a_pWaveHeader = m_pWaveData->getReadWaveHeader();
+ m_WaveHeader.lpData = m_pWaveData->getReadBuffer();
+ m_WaveHeader.dwBufferLength = m_pWaveData->getReadBufferSize();
+ m_WaveHeader.dwFlags = 0;
+
+ m_pWaveData->nextReadBuffer();
+
+ if(m_WaveHeader.lpData == NULL){
+ return false;
+ }
+
+ // \83w\83b\83_\81[\82ð\8f\80\94õ\82·\82é
+ waveOutPrepareHeader(m_hWaveOut, a_pWaveHeader, sizeof(WAVEHDR));
+
+ m_NumberOfBufferInQueue++;
+ }
+ return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
// \8fo\97Í\81i\8dÄ\90¶\81j\82ð\8aJ\8en\82·\82é
////////////////////////////////////////////////////////////////////////////////
bool COutputWave::start()
{
- // \83f\83o\83C\83X\82ð\8aJ\82¢\82Ä\82¢\82È\82¢\82©\81A\8dÄ\90¶\92\86\82È\82çfalse\82ð\95Ô\82·
- if(!m_isOpen || m_isOutput){
+ // \83f\83o\83C\83X\82ð\8aJ\82¢\82Ä\82¢\82È\82¢\82È\82çfalse\82ð\95Ô\82·
+ if(!m_isOpen){
return false;
}
- // \8fo\97Í\81i\8dÄ\90¶\81j\82ð\8aJ\8en\82·\82é
- waveOutWrite(m_hWaveOut, &m_WaveHeader, sizeof(WAVEHDR));
- m_isOutput = true;
+ while(m_NumberOfBufferInQueue < m_MaxNumberOfBuffer){
+ WAVEHDR* a_pWaveHeader = m_pWaveData->getReadWaveHeader();
+ a_pWaveHeader->lpData = m_pWaveData->getReadBuffer();
+ a_pWaveHeader->dwBufferLength = m_pWaveData->getReadBufferSize();
+ a_pWaveHeader->dwFlags = 0;
+
+ if(a_pWaveHeader->lpData == NULL){
+ return false;
+ }
+
+ m_pWaveData->nextReadBuffer();
+
+ // \83w\83b\83_\81[\82ð\8f\80\94õ\82·\82é
+ waveOutPrepareHeader(m_hWaveOut,a_pWaveHeader , sizeof(WAVEHDR));
+ // \8fo\97Í\81i\8dÄ\90¶\81j\82ð\8aJ\8en\82·\82é
+ waveOutWrite(m_hWaveOut, a_pWaveHeader, sizeof(WAVEHDR));
+ m_isOutput = true;
+
+ m_NumberOfBufferInQueue++;
+ }
return true;
}
return false;
}
- m_isOutput = false;
waveOutReset(m_hWaveOut);
+ m_isOutput = false;
return true;
}
-
-////////////////////////////////////////////////////////////////////////////////
-// \8fo\97Í\83f\83o\83C\83X\82Ì\8fó\91Ô\82ð\92m\82ç\82¹\82é\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94
-////////////////////////////////////////////////////////////////////////////////
-void COutputWave::procedureWave(HWAVEOUT in_hWaveOut, UINT in_Message, DWORD in_Instance, DWORD in_Param1, DWORD in_Param2)
-{
- // \83\81\83b\83Z\81[\83W\82Ì\8eí\97Þ\82²\82Æ\82Ì\8f\88\97\9d\82ð\8ds\82¤
- switch(in_Message){
- // \83f\83o\83C\83X\82ª waveOutClose \8aÖ\90\94\82Å\83N\83\8d\81[\83Y\82³\82ê\82½\82Æ\82«\82É\91\97\90M\82³\82ê\82Ü\82·\81B
- case WOM_CLOSE:
- std::cout << "WOM_CLOSE" << std::endl;
- break;
- // \83f\83o\83C\83X\83h\83\89\83C\83o\82ª\81AwaveOutWrite \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
- case WOM_DONE:
- m_isOutput = false;
- std::cout << "WOM_DATA" << std::endl;
- break;
- // \83f\83o\83C\83X\82ª waveOutOpen \8aÖ\90\94\82Å\83I\81[\83v\83\93\82³\82ê\82½\82Æ\82«\82É\91\97\90M\82³\82ê\82Ü\82·\81B
- case WOM_OPEN:
- std::cout << "WOM_OPEN" << std::endl;
- break;
- default:
- throw "error: WAVE Call Back";
- break;
- }
-}
bool m_isOpen;
// \8dÄ\90¶\92\86
bool m_isOutput;
+ // \83L\83\85\81[\82É\89Á\82¦\82é\83o\83b\83t\83@\90\94
+ int m_MaxNumberOfBuffer;
+ // \83L\83\85\81[\82É\89Á\82¦\82Ä\82¢\82é\83o\83b\83t\83@\90\94
+ int m_NumberOfBufferInQueue;
////////////////////////////////////////////////////////////////////////////////
// \83R\83\93\83X\83g\83\89\83N\83^
// \83f\83X\83g\83\89\83N\83^
////////////////////////////////////////////////////////////////////////////////
public:
- ~COutputWave();
+ virtual ~COutputWave();
////////////////////////////////////////////////////////////////////////////////
// \83R\81[\83\8b\83o\83b\83N\95Ï\90\94
////////////////////////////////////////////////////////////////////////////////
// \8fo\97Í\83f\83o\83C\83X\82Ì\8fó\91Ô\82ð\92m\82ç\82¹\82é\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94
static void CALLBACK waveOutProc(HWAVEOUT in_hWaveOut, UINT in_Message, DWORD in_Instance, DWORD in_Param1, DWORD in_Param2);
+ void callbackWave(HWAVEOUT in_hWaveOut, UINT in_Message, DWORD in_Instance, DWORD in_Param1, DWORD in_Param2);
////////////////////////////////////////////////////////////////////////////////
bool open();
// \83f\83o\83C\83X\82ð\95Â\82¶\82é
bool close();
+protected:
+ // add wave buffer in queue
+ bool addWaveBuffer();
+public:
// \8fo\97Í\81i\8dÄ\90¶\81j\82ð\8aJ\8en\82·\82é
bool start();
// \8fo\97Í\81i\8dÄ\90¶\81j\82ð\92â\8e~\82·\82é
bool stop();
- // \8fo\97Í\83f\83o\83C\83X\82Ì\8fó\91Ô\82ð\92m\82ç\82¹\82é\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94
- void procedureWave(HWAVEOUT in_hWaveOut, UINT in_Message, DWORD in_Instance, DWORD in_Param1, DWORD in_Param2);
////////////////////////////////////////////////////////////////////////////////
// \91®\90«\83\81\83\\83b\83h
////////////////////////////////////////////////////////////////////////////////
CWaveData::CWaveData()
{
- // \83o\83b\83t\83@\82Ö\82Ì\83|\83C\83\93\83^
- m_pWaveBuffer = NULL;
// Wave\83t\83H\81[\83}\83b\83g
m_WaveFormat.wFormatTag = WAVE_FORMAT_PCM;
m_WaveFormat.nChannels = 1;
m_WaveFormat.wBitsPerSample = 8;
m_WaveFormat.nBlockAlign = m_WaveFormat.wBitsPerSample / 8 * m_WaveFormat.nChannels;
m_WaveFormat.nAvgBytesPerSec = m_WaveFormat.nSamplesPerSec * m_WaveFormat.nBlockAlign;
- // \83o\83b\83t\83@\83T\83C\83Y [\95b]
- m_RecordSecond = 10;
- // \83o\83b\83t\83@\83T\83C\83Y [byte]
- m_BufferSize = 0;
}
////////////////////////////////////////////////////////////////////////////////
m_WaveFormat.wBitsPerSample = 8;
m_WaveFormat.nBlockAlign = m_WaveFormat.wBitsPerSample / 8 * m_WaveFormat.nChannels;
m_WaveFormat.nAvgBytesPerSec = m_WaveFormat.nSamplesPerSec * m_WaveFormat.nBlockAlign;
-
- m_RecordSecond = 0;
- m_BufferSize = 0;
}
////////////////////////////////////////////////////////////////////////////////
// \83o\83b\83t\83@\82ð\8am\95Û
////////////////////////////////////////////////////////////////////////////////
-bool CWaveData::allocBuffer()
+bool CWaveData::allocBuffer(int in_BufferNumber, DWORD in_RecorMilliSecond)
{
- if(m_RecordSecond == 0){
+ if(in_BufferNumber < 1 || in_RecorMilliSecond == 0){
return false;
}
- if(m_pWaveBuffer != NULL){
- return true;
+ if(m_WaveBuffers.empty()){
+ // free
+ if(!freeBuffer()){
+ return false;
+ }
+ }
+
+ for(int i = 0; i < in_BufferNumber; i++){
+ StructWaveBuffer tempWaveBuffer;
+ tempWaveBuffer.m_RecorMilliSecond = in_RecorMilliSecond;
+ tempWaveBuffer.m_BufferSize = m_WaveFormat.nAvgBytesPerSec * in_RecorMilliSecond / 1000;
+ tempWaveBuffer.m_pWaveBuffer = new char[tempWaveBuffer.m_BufferSize];
+
+ m_WaveBuffers.push_back(tempWaveBuffer);
}
- m_pWaveBuffer = new char[m_BufferSize];
+ // \93Ç\82Ý\8eæ\82è\83o\83b\83t\83@\82Æ\8f\91\82«\8d\9e\82Ý\83o\83b\83t\83@\82ð\8ew\92è\82µ\82Ä\82¨\82
+ m_ReadOfWaveBuffers = m_WaveBuffers.begin();
+ m_WriteOfWaveBuffers = m_WaveBuffers.begin();
- return false;
+ return true;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
bool CWaveData::freeBuffer()
{
- if(m_pWaveBuffer != NULL){
- delete m_pWaveBuffer;
- m_pWaveBuffer = NULL;
- return true;
+ if(!m_WaveBuffers.empty()){
+ WaveBufferTable::iterator tempIterator = m_WaveBuffers.begin();
+ while(tempIterator != m_WaveBuffers.end()){
+ delete tempIterator->m_pWaveBuffer;
+ tempIterator++;
+ }
}
- return false;
+ return true;
}
#define INC_CWaveData
-
+#include <list>
#include <Windows.h>
// \8aÖ\90\94\96¼\82Í\83\8d\81[\83\8f\83L\83\83\83\81\83\8b\83P\81[\83X\82Æ\82·\82é
+// wave buffer struct
+struct StructWaveBuffer
+{
+ // \83o\83b\83t\83@\82Ö\82Ì\83|\83C\83\93\83^
+ char* m_pWaveBuffer;
+ // Wave\83w\83b\83_\81[
+ WAVEHDR m_WaveHeader;
+ // \98^\89¹\8e\9e\8aÔ [\83~\83\8a\95b]
+ DWORD m_RecorMilliSecond;
+ // \83o\83b\83t\83@\83T\83C\83Y [byte]
+ DWORD m_BufferSize;
+};
+
////////////////////////////////////////////////////////////////////////////////
// CWaveData
// Wave\83f\81[\83^\82ð\88µ\82¤\83N\83\89\83X
// \83o\83b\83t\83@\82Ì\8aÇ\97\9d\81i\8am\95Û\82Æ\89ð\95ú\81j\82ð\8ds\82¤
-// \83o\83b\83t\83@\83v\81[\83\8b\82ð\97p\82¢\82½\82Ù\82¤\82ª\82æ\82¢\82Æ\8ev\82¤\82ª\8c»\8fó\82Í\8am\95Û\82µ\82Á\82Ï\82È\82µ\82Æ\82·\82é
+// \83L\83\85\81[\82ð\97p\82¢\82Ä\83o\83b\83t\83@\8aÇ\97\9d\82ð\8ds\82¤
////////////////////////////////////////////////////////////////////////////////
class CWaveData
{
// \83\81\83\93\83o\95Ï\90\94
////////////////////////////////////////////////////////////////////////////////
private:
- // \83o\83b\83t\83@\82Ö\82Ì\83|\83C\83\93\83^
- char* m_pWaveBuffer;
- // Wave\83t\83H\81[\83}\83b\83g
+ // wave format
WAVEFORMATEX m_WaveFormat;
- // \98^\89¹\8e\9e\8aÔ [\95b]
- DWORD m_RecordSecond;
- // \83o\83b\83t\83@\83T\83C\83Y [byte]
- DWORD m_BufferSize;
+
+
+ // typedef wave buffer table type
+ typedef std::list<StructWaveBuffer> WaveBufferTable;
+ // wave buffer table
+ WaveBufferTable m_WaveBuffers;
+
+ // read iterator
+ WaveBufferTable::iterator m_ReadOfWaveBuffers;
+ // write iterator
+ WaveBufferTable::iterator m_WriteOfWaveBuffers;
////////////////////////////////////////////////////////////////////////////////
// \8f\89\8aú\89»
void initialize();
// \83o\83b\83t\83@\82ð\8am\95Û
- bool allocBuffer();
+ bool allocBuffer(int in_BufferNumber, DWORD in_RecorMilliSecond);
// \83o\83b\83t\83@\82ð\89ð\95ú
bool freeBuffer();
// \91®\90«\83\81\83\\83b\83h
////////////////////////////////////////////////////////////////////////////////
public:
- // \98^\89¹\8e\9e\8aÔ\82ð\83Z\83b\83g
- bool setRecordSecond(DWORD in_RecordSecond)
+ bool empty()
{
- if(m_pWaveBuffer != NULL){
- // \83\81\83\82\83\8a\82ª\8am\95Û\82µ\82Ä\82 \82é\8aÔ\82Í\98^\89¹\8e\9e\8aÔ\82ð\95Ï\8dX\82µ\82È\82¢
- return false;
+ if(m_ReadOfWaveBuffers == m_WriteOfWaveBuffers){
+ return true;
}
- m_RecordSecond = in_RecordSecond;
- m_BufferSize = m_WaveFormat.nAvgBytesPerSec * m_RecordSecond;
- return true;
+ return false;
}
- // Wave\83o\83b\83t\83@\82ð\8eæ\93¾\82·\82é
- char* getWaveBuffer()
+ // Wave\83t\83H\81[\83}\83b\83g\82Ö\82Ì\83|\83C\83\93\83^\82ð\8eæ\93¾\82·\82é
+ const WAVEFORMATEX* getWaveFormat()
{
- return m_pWaveBuffer;
+ return &m_WaveFormat;
}
- // \83o\83b\83t\83@\83T\83C\83Y\82ð\8eæ\93¾\82·\82é
- DWORD getBufferSize()
+ // \93Ç\82Ý\8eæ\82è\83o\83b\83t\83@\97p\8aÖ\90\94
+ // Wave\83o\83b\83t\83@\82Ì\93Ç\82Ý\8eæ\82è\83|\83C\83\93\83^\82ð\8eæ\93¾\82·\82é
+ char* getReadBuffer()
{
- return m_BufferSize;
+ // \83o\83b\83t\83@\82ª\8bó\82È\82çNULL\82ð\95Ô\82·
+ if(empty()){
+ return NULL;
+ }
+
+ return m_ReadOfWaveBuffers->m_pWaveBuffer;
}
- // Wave\83t\83H\81[\83}\83b\83g\82Ö\82Ì\83|\83C\83\93\83^\82ð\8eæ\93¾\82·\82é
- const WAVEFORMATEX* getWaveFormat()
+ // \8e\9f\82Ì\93Ç\82Ý\8eæ\82è\83o\83b\83t\83@\82ð\8eæ\93¾\82·\82é
+ char* nextReadBuffer()
{
- return &m_WaveFormat;
+ // \83o\83b\83t\83@\82ª\8bó\82È\82çNULL\82ð\95Ô\82·
+ if(empty()){
+ return NULL;
+ }
+
+ m_ReadOfWaveBuffers++;
+ if(m_ReadOfWaveBuffers == m_WaveBuffers.end()){
+ m_ReadOfWaveBuffers = m_WaveBuffers.begin();
+ }
+ return m_ReadOfWaveBuffers->m_pWaveBuffer;
+ }
+
+ // \93Ç\82Ý\8d\9e\82Ý\83o\83b\83t\83@\83T\83C\83Y\82ð\8eæ\93¾\82·\82é
+ DWORD getReadBufferSize()
+ {
+ return m_ReadOfWaveBuffers->m_BufferSize;
+ }
+
+ WAVEHDR* getReadWaveHeader()
+ {
+ return &m_ReadOfWaveBuffers->m_WaveHeader;
+ }
+
+ // \8f\91\82«\8d\9e\82Ý\83o\83b\83t\83@\97p\8aÖ\90\94
+ // Wave\83o\83b\83t\83@\82Ì\8f\91\82«\8d\9e\82Ý\83|\83C\83\93\83^\82ð\8eæ\93¾\82·\82é
+ char* getWriteBuffer()
+ {
+ return m_WriteOfWaveBuffers->m_pWaveBuffer;
+ }
+
+ // \8e\9f\82Ì\8f\91\82«\8d\9e\82Ý\83o\83b\83t\83@\82ð\8eæ\93¾\82·\82é
+ char* nextWriteBuffer()
+ {
+ WaveBufferTable::iterator a_NextWriteOfWaveBuffer = m_WriteOfWaveBuffers;
+ a_NextWriteOfWaveBuffer++;
+ if(a_NextWriteOfWaveBuffer == m_WaveBuffers.end()){
+ a_NextWriteOfWaveBuffer = m_WaveBuffers.begin();
+ }
+ if(a_NextWriteOfWaveBuffer == m_ReadOfWaveBuffers){
+ // \8f\91\82«\8d\9e\82Ý\83|\83C\83\93\83^\82ª\93Ç\82Ý\8d\9e\82Ý\83|\83C\83\93\83^\82É\92Ç\82¢\82Â\82\82½\82ßNULL\82ð\95Ô\82·
+ return NULL;
+ }
+ m_WriteOfWaveBuffers = a_NextWriteOfWaveBuffer;
+ return m_WriteOfWaveBuffers->m_pWaveBuffer;
+ }
+
+ // \8f\91\82«\8d\9e\82Ý\83o\83b\83t\83@\83T\83C\83Y\82ð\8eæ\93¾\82·\82é
+ DWORD getWriteBufferSize()
+ {
+ return m_WriteOfWaveBuffers->m_BufferSize;
+ }
+
+ WAVEHDR* getWriteWaveHeader()
+ {
+ return &m_WriteOfWaveBuffers->m_WaveHeader;
}
////////////////////////////////////////////////////////////////////////////////
case 'i':
g_InputWave.start();
break;
+ case 'I':
+ g_InputWave.stop();
+ break;
case 'o':
g_OutputWave.start();
break;
+ case 'O':
+ g_OutputWave.stop();
+ break;
case 'q':
case 'Q':
case '\033': /* '\033' \82Í ESC \82Ì ASCII \83R\81[\83h */
+ std::cout << "g_InputWave.stop" << std::endl;
+ g_InputWave.stop();
+ std::cout << "g_OutputWave.stop" << std::endl;
+ g_OutputWave.stop();
+ std::cout << "g_InputWave.close" << std::endl;
+ g_InputWave.close();
+ std::cout << "g_OutputWave.close" << std::endl;
+ g_OutputWave.close();
std::cout << "end" << std::endl;
exit(0);
default:
}
- // \89¹\82É\8aÖ\82·\82é\8f\88\97\9d
- if(isBeep){
- isBeep = 0;
- g_OutputWave.open();
- }
-
glutPostRedisplay();
}
int main(int argc, char* argv[])
{
g_WaveData.initialize();
- g_WaveData.setRecordSecond(10);
- g_WaveData.allocBuffer();
-
+ // \83o\83b\83t\83@\83T\83C\83Y1000\81A\98^\89¹\8e\9e\8aÔ100ms
+ g_WaveData.allocBuffer(1000, 100);
g_InputWave.initialize();
g_InputWave.setWaveData(&g_WaveData);