OSDN Git Service

run loop input and output of wave
authorBreak <t_windbreak@yahoo.co.jp>
Sat, 12 Jun 2010 23:37:18 +0000 (08:37 +0900)
committerBreak <t_windbreak@yahoo.co.jp>
Sat, 12 Jun 2010 23:37:18 +0000 (08:37 +0900)
source/CInputWave.cpp
source/CInputWave.h
source/COutputWave.cpp
source/COutputWave.h
source/CWaveData.cpp
source/CWaveData.h
source/main.cpp

index aba1511..0ca76ab 100644 (file)
@@ -7,7 +7,6 @@
 #include <MMSystem.h>
 //#include <tchar.h>
 
-
 ////////////////////////////////////////////////////////////////////////////////
 // \83R\83\93\83X\83g\83\89\83N\83^
 ////////////////////////////////////////////////////////////////////////////////
@@ -46,7 +45,34 @@ void CALLBACK CInputWave::waveInProc(HWAVEIN in_hWaveIn, UINT in_Message, DWORD
        // 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;
+               m_isInput = false;
+               // \8e\9f\82Ì\83o\83b\83t\83@\82ª\82 \82é\82©\8c\9f\8d¸\82·\82é
+               if(m_pWaveData->nextWriteBuffer() != NULL){
+                       start();
+               }
+               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;
+       }
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -63,27 +89,23 @@ bool CInputWave::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é
+       // 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;
@@ -98,26 +120,25 @@ bool CInputWave::close()
 
        if(m_isOpen){
                m_isOpen = false;
-               // \83w\83b\83_\81[\89ð\95ú\97p\8aÖ\90\94
+               // uninitialize a wave header
                waveInUnprepareHeader(m_hWaveIn, &m_WaveHeader, sizeof(WAVEHDR));
-               // \83f\83o\83C\83X\83N\83\8d\81[\83Y\8aÖ\90\94
+               // close a wave device handle
                waveInClose(m_hWaveIn);
        }
        return true;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// \93ü\97Í\81i\98^\89¹\81j\82ð\8aJ\8en\82·\82é
+// prepare buffer of wave
 ////////////////////////////////////////////////////////////////////////////////
-bool CInputWave::start()
+bool CInputWave::prepareWaveBuffer()
 {
-       // \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){
-               return false;
-       }
+       m_WaveHeader.lpData         = m_pWaveData->getWriteBuffer();
+       m_WaveHeader.dwBufferLength = m_pWaveData->getWriteBufferSize();
+       m_WaveHeader.dwFlags        = 0;
 
-       // \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é
+       // initialize a wave header
+       // must use this function for initialize, because not open wave header structure
        switch(waveInPrepareHeader(m_hWaveIn, &m_WaveHeader, sizeof(WAVEHDR))){
        // \90¬\8c÷
        case MMSYSERR_NOERROR:
@@ -141,7 +162,7 @@ bool CInputWave::start()
                break;
        }
 
-       // \83o\83b\83t\83@\82ð\93n\82·
+       // take a buffer for wave
        switch(waveInAddBuffer(m_hWaveIn, &m_WaveHeader, sizeof(WAVEHDR))){
        // \90¬\8c÷
        case MMSYSERR_NOERROR:
@@ -173,7 +194,20 @@ bool CInputWave::start()
                break;
 
        }
+       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){
+               return false;
+       }
+
+       prepareWaveBuffer();
        waveInStart(m_hWaveIn);
        m_isInput = true;
        return true;
@@ -196,28 +230,3 @@ bool CInputWave::stop()
        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;
-       }
-}
index 5510a5f..307740e 100644 (file)
@@ -41,13 +41,14 @@ public:
        // \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);
 
 
        ////////////////////////////////////////////////////////////////////////////////
@@ -60,12 +61,14 @@ public:
        bool open();
        // \83f\83o\83C\83X\82ð\95Â\82\82é
        bool close();
+protected:
+       // prepare buffer of wave
+       bool prepareWaveBuffer();
+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
index 4691d15..f7c022d 100644 (file)
@@ -46,9 +46,37 @@ void CALLBACK COutputWave::waveOutProc(HWAVEOUT in_hWaveOut, UINT in_Message, DW
        // 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:
+               m_isOutput = false;
+               std::cout << "WOM_DATA" << std::endl;
+               // \8e\9f\82Ì\83o\83b\83t\83@\82ª\82 \82é\82©\8c\9f\8d¸\82·\82é
+               if(m_pWaveData->nextReadBuffer() != NULL){
+                       start();
+               }
+               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»
 ////////////////////////////////////////////////////////////////////////////////
@@ -61,8 +89,6 @@ void COutputWave::initialize()
 ////////////////////////////////////////////////////////////////////////////////
 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) {
@@ -71,18 +97,6 @@ bool COutputWave::open()
                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;
@@ -113,6 +127,19 @@ bool COutputWave::start()
                return false;
        }
 
+       // Wave\83w\83b\83_\81[
+       m_WaveHeader.lpData         = m_pWaveData->getReadBuffer();
+       m_WaveHeader.dwBufferLength = m_pWaveData->getReadBufferSize();
+       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));
+
        // \8fo\97Í\81i\8dÄ\90\81j\82ð\8aJ\8en\82·\82é
        waveOutWrite(m_hWaveOut, &m_WaveHeader, sizeof(WAVEHDR));
        m_isOutput = true;
@@ -135,29 +162,3 @@ bool COutputWave::stop()
 
        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;
-       }
-}
index 3ea0f6d..b8dd431 100644 (file)
@@ -41,13 +41,14 @@ public:
        // \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);
 
 
        ////////////////////////////////////////////////////////////////////////////////
@@ -64,8 +65,6 @@ public:
        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
index c4030ee..ca09e5c 100644 (file)
@@ -10,8 +10,6 @@
 ////////////////////////////////////////////////////////////////////////////////
 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;
@@ -19,10 +17,6 @@ CWaveData::CWaveData()
        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;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -45,27 +39,38 @@ void CWaveData::initialize()
        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_RecordSecond)
 {
-       if(m_RecordSecond == 0){
+       if(in_BufferNumber < 1 || in_RecordSecond == 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_RecordSecond = in_RecordSecond;
+               tempWaveBuffer.m_BufferSize   = m_WaveFormat.nAvgBytesPerSec * in_RecordSecond;
+               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;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -73,10 +78,12 @@ bool CWaveData::allocBuffer()
 ////////////////////////////////////////////////////////////////////////////////
 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;
 }
index ab0bebf..444fe70 100644 (file)
@@ -3,7 +3,7 @@
 #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;
+       // \98^\89¹\8e\9e\8aÔ [\95b]
+       DWORD m_RecordSecond;
+       // \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
 {
@@ -25,14 +36,19 @@ 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;
 
 
        ////////////////////////////////////////////////////////////////////////////////
@@ -57,7 +73,7 @@ public:
        // \8f\89\8aú\89»
        void initialize();
        // \83o\83b\83t\83@\82ð\8am\95Û
-       bool allocBuffer();
+       bool allocBuffer(int in_BufferNumber, DWORD in_RecordSecond);
        // \83o\83b\83t\83@\82ð\89ð\95ú
        bool freeBuffer();
 
@@ -65,34 +81,79 @@ public:
        // \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()
+
+       // 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;
+       }
+
+       // 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;
        }
 
        ////////////////////////////////////////////////////////////////////////////////
index 9284f4a..e6df681 100644 (file)
@@ -294,9 +294,7 @@ void reshape(int w, int h)
 int main(int argc, char* argv[])
 {
        g_WaveData.initialize();
-       g_WaveData.setRecordSecond(10);
-       g_WaveData.allocBuffer();
-
+       g_WaveData.allocBuffer(10, 2);
 
        g_InputWave.initialize();
        g_InputWave.setWaveData(&g_WaveData);