//--------------------------------------------------------------------------- #include #include #include #pragma hdrstop #include "WavePlayerForm.h" #include "Wave.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TWaveForm *WaveForm; //--------------------------------------------------------------------------- void CALLBACK RecordCallbackProc(HWAVEIN hwi, //In ¹öÆÛ°¡ ²Ë áÀ» °æ¿ì ó¸®.. UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2); void CALLBACK TimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2); //--------------------------------------------------------------------------- __fastcall TWaveForm::TWaveForm(TComponent* Owner) : TForm(Owner) { m_BufferCount = 0; m_DSBufferCount = 0; m_playCount = 0; } //--------------------------------------------------------------------------- void TWaveForm::InitPriamy(HWND hwnd) { HRESULT hr; hr = DirectSoundCreate(NULL, &m_pDSound, NULL); if(FAILED(hr)) { ShowMessage("º°°Å ¾Æ´Ñ ´ÙÀÌ·¢Æ® »ç¿îµå ½ÇÆÐ ¤Ñ¤Ñ;"); return; } if(FAILED(hr = m_pDSound->SetCooperativeLevel(hwnd, DSSCL_NORMAL))) { ShowMessage("Çù·Â ·¡º§ ¼³Á¤..."); return ; } ZeroMemory(&m_desdPrimary, sizeof(DSBUFFERDESC)); m_desdPrimary.dwSize = sizeof(DSBUFFERDESC); m_desdPrimary.dwFlags = DSBCAPS_PRIMARYBUFFER; if(FAILED(hr = m_pDSound->CreateSoundBuffer(&m_desdPrimary, &m_pDSBPrimary, NULL))) { ShowMessage("ù¹øÂ° ¹öÆÛ ¸¦ ¸¸µé´Ù ½ÇÆÐ"); return; } } //--------------------------------------------------------------------------- void TWaveForm::InitSecond() { WAVEFORMATEX wf; //¿þÀÌºê ÆÄÀÏ Àç»ýÀ» À§ÇÑ Æ÷¸Ë PVOID pMem; DWORD dwSize; wf.wFormatTag = WAVE_FORMAT_PCM; wf.nChannels = 1L; wf.wBitsPerSample = 16; wf.nSamplesPerSec = 8000L; wf.nAvgBytesPerSec = 16000L; wf.nBlockAlign = 2L; //2¹øÂ° ¹öÆÛ¸¦ ¸¸µé±âÀ§ÇØ DSBUFFERDESC »ûÆÃ m_desdSecond.dwSize = sizeof(DSBUFFERDESC); m_desdSecond.dwFlags = DSBCAPS_CTRLPOSITIONNOTIFY //Æ÷Áö¼Ç Å뺸¹æ½Ä »ç¿ë | DSBCAPS_GETCURRENTPOSITION2; //½ºÆ®¸®¹Ö ¹öÆÛ »ç¿ë m_desdSecond.dwBufferBytes = MAXNUMOFBUFFER*BUFFER_SIZE; //¹öÆÛ »çÀÌÁî m_desdSecond.lpwfxFormat = (tWAVEFORMATEX*)&wf; if(FAILED(m_pDSound->CreateSoundBuffer(&m_desdSecond, &m_pDSBSecond, NULL))) { ShowMessage("µÎ¹øÂ°²¨ ¸¸µé±â ½ÇÆÐ..."); return; } //µ¥ÀÌÅ͸¦ ÀÐ¾î µéÀ̱â À§Çؼ­ for(int i = 0 ; i < 2 ; i++) { if(FAILED(m_pDSBSecond->Lock(BUFFER_SIZE*i, BUFFER_SIZE, &pMem, &dwSize, 0, 0, 0))) { ShowMessage("¶ôÀÌ ¾È°É¸²"); return; } m_DSBufferCount++; memcpy(pMem, PlayBuf.Data[m_playCount++], BUFFER_SIZE); if(m_playCount == MAXNUMOFBUFFER) m_playCount = 0; if(m_DSBufferCount == MAXNUMOFBUFFER) m_DSBufferCount = 0; if(FAILED(m_pDSBSecond->Unlock( pMem, dwSize, 0, 0))) { ShowMessage("¶ô ÇØÁ¦¾ÈµÈ´Ù.. ¤Ì.¤Ì"); return; } } } //--------------------------------------------------------------------------- void TWaveForm::PlaySound() { m_pDSBPrimary->Play(PlayBuf.Data[0][0], 0, SND_ASYNC); // m_pDSBPrimary->Play(0, 0, DSBPLAY_LOOPING); // m_pDSBSecond->Play(0, 0, DSBPLAY_LOOPING); //ShowMessage("ff"); } //--------------------------------------------------------------------------- void CALLBACK TimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2) { PVOID pMem; DWORD dwSize; if(WaveForm->m_DSBufferCount == MAXNUMOFBUFFER) WaveForm->m_DSBufferCount = 0; if(WaveForm->m_playCount == MAXNUMOFBUFFER) WaveForm->m_playCount = 0; if(FAILED(WaveForm->m_pDSBSecond->Lock(BUFFER_SIZE* WaveForm->m_DSBufferCount, BUFFER_SIZE, &pMem, &dwSize, 0, 0, 0))) { ShowMessage("ŸÀÌ¸Ó ¶ôÀÌ ¾È°É¸²"); return; } WaveForm->m_DSBufferCount++; memcpy(pMem, WaveForm->PlayBuf.Data[WaveForm->m_playCount++], BUFFER_SIZE); if(FAILED(WaveForm->m_pDSBSecond->Unlock( pMem, dwSize, 0, 0))) { ShowMessage("ŸÀÌ¸Ó ¶ô ÇØÁ¦¾ÈµÈ´Ù.. ¤Ì.¤Ì"); return; } } //--------------------------------------------------------------------------- void TWaveForm::SocketPlaySound(BYTE* pWaveIn) { memset( PlayBuf.Data[PlayBuf.Count], 0x00, BUFFER_SIZE ); memcpy(PlayBuf.Data[PlayBuf.Count++], pWaveIn , BUFFER_SIZE); if(PlayBuf.Count == MAXNUMOFBUFFER) PlayBuf.Count = 0; if(PlayBuf.Count == 2 && WaveForm->m_StartFlag == false) { WaveForm->m_StartFlag = true; InitPriamy(WavePlayerMainForm->Handle); InitSecond(); PlaySound(); } } //--------------------------------------------------------------------------- void TWaveForm::SocketPlayStop() { m_pDSBSecond->Stop(); m_pDSBSecond->Release(); m_pDSBPrimary->Release(); m_pDSound->Release(); m_DSBufferCount = 0; m_playCount = 0; m_StartFlag = true; PlayBuf.Count = 0; } //--------------------------------------------------------------------------- /* ARS Demo System ±¸Ãà JCT º¸µå ¿£Áø : SL-2 ½ºÅýº 011-595-7577 ±èÅÂ½Ä ÀÌ»ç 5/3 ¿ÀÀü 10:30¿¡ ¹ÌÆÃ ±â°£ 10ÀÏ */ //´ëÀü½Ã À¯¼º±¸ ±¸¼ºµ¿ 21¹øÁö ±Ý°­È¯°æ°ü¸®Ã»³» ÁßºÎ±Ç °üÁ¦ °ü¸®ÆÀ(ȯ°æ°ü¸®°ø´Ü) //½Å¹®È£