//--------------------------------------------------------------------------------------
//       Class: SoundResources 
//      Method: (protected) _prepareBuffer 
// Description: Prepares the internal buffers for the doble buffering. 
//--------------------------------------------------------------------------------------
void 
SoundResources::_prepareBuffers(void)
{
	//----------------------------------------------------------------------
	//  Preparing all memory buffer allocation
	//----------------------------------------------------------------------
	m_WaveHeader[2].dwBufferLength = 
	m_WaveHeader[1].dwBufferLength = 
	m_WaveHeader[0].dwBufferLength = dwBufferLength;

	m_WaveHeader[0].lpData = (char *)VirtualAlloc(0, 
												  m_WaveHeader[0].dwBufferLength, 
												  MEM_COMMIT, 
												  PAGE_READWRITE);
	m_WaveHeader[1].lpData = (char *)VirtualAlloc(0, 
												  m_WaveHeader[1].dwBufferLength, 
												  MEM_COMMIT, 
												  PAGE_READWRITE);
	m_WaveHeader[2].lpData = (char *)VirtualAlloc(0, 
												  m_WaveHeader[2].dwBufferLength, 
												  MEM_COMMIT, 
												  PAGE_READWRITE);
	
	//----------------------------------------------------------------------
	// Initialize dwFlags and dwLoops to 0. This seems to be necesary according to the
	// Microsoft Windows documentation 
	//----------------------------------------------------------------------
	m_WaveHeader[0].dwFlags = m_WaveHeader[1].dwFlags = m_WaveHeader[2].dwFlags = 0L;
	m_WaveHeader[0].dwLoops = m_WaveHeader[1].dwLoops = m_WaveHeader[2].dwFlags = 0L; 

	//----------------------------------------------------------------------
	// Initialize the headers
	//----------------------------------------------------------------------
	if ((m_err = waveInPrepareHeader(m_WaveInHandle, &m_WaveHeader[0], sizeof(WAVEHDR)))) 
		printf("yarpsounddriver: Error preparing WAVEHDR -- %08X\n", m_err);
	if ((m_err = waveInPrepareHeader(m_WaveInHandle, &m_WaveHeader[1], sizeof(WAVEHDR)))) 
		printf("yarpsounddriver: Error preparing WAVEHDR -- %08X\n", m_err);
	if ((m_err = waveInPrepareHeader(m_WaveInHandle, &m_WaveHeader[2], sizeof(WAVEHDR)))) 
		printf("yarpsounddriver: Error preparing WAVEHDR -- %08X\n", m_err);

	//----------------------------------------------------------------------
	//  It is necessary to queue the two buffers.  
	//----------------------------------------------------------------------
	if ((m_err = waveInAddBuffer(m_WaveInHandle, &m_WaveHeader[0], sizeof(WAVEHDR))))
		printf("yarpsounddriver: Error queueing WAVEHDR 1! -- %08X\n", m_err);
	if ((m_err = waveInAddBuffer(m_WaveInHandle, &m_WaveHeader[1], sizeof(WAVEHDR))))
		printf("yarpsounddriver: Error queueing WAVEHDR 2! -- %08X\n", m_err);
	if ((m_err = waveInAddBuffer(m_WaveInHandle, &m_WaveHeader[2], sizeof(WAVEHDR))))
		printf("yarpsounddriver: Error queueing WAVEHDR 2! -- %08X\n", m_err);
}
Example #2
0
static bool_t getbuffer(WAVEHDR *pwh) {
	GDataBuffer *paud;

	// Get the next data block to send
	gfxSystemLock();
	paud = gaudioRecordGetFreeBlockI();
	if (!paud && !nQueuedBuffers)
		gaudioRecordDoneI();
	gfxSystemUnlock();
	if (!paud)
		return FALSE;

	// Prepare the wave header for Windows
	pwh->dwUser = (DWORD_PTR)paud;
	pwh->lpData = (LPSTR)(paud+1);			// The data is on the end of the structure
	pwh->dwBufferLength = paud->size;
	pwh->dwFlags = 0;
	if (waveInPrepareHeader(ah, pwh, sizeof(WAVEHDR))) {
		fprintf(stderr, "GAUDIO: Failed to prepare a record buffer");
		exit(-1);
	}

	// Send it to windows
	if (waveInAddBuffer(ah, pwh, sizeof(WAVEHDR))) {
		fprintf(stderr, "GAUDIO: Failed to add the record buffer");
		exit(-1);
	}

	nQueuedBuffers++;
	return TRUE;
}
BOOL RUIAudio::RecAddBuffer(RUIBuffer* pRUIBuffer)
{
	if (pRUIBuffer == NULL)
	{
		ASSERT(FALSE);
		return FALSE;
	}

	BYTE*	pBufferRec = pRUIBuffer->GetBuffer();

	WAVEHDR*	pWaveHdr = (WAVEHDR*) pBufferRec;

	pWaveHdr->lpData         = (LPSTR) (pBufferRec + sizeof(WAVEHDR));
	pWaveHdr->dwBufferLength = pRUIBuffer->GetBufferSize() - sizeof(WAVEHDR);
	pWaveHdr->dwFlags        = 0;
	pWaveHdr->dwUser         = 0;

	if (waveInPrepareHeader(m_hWaveIn, pWaveHdr, sizeof(WAVEHDR)) != MMSYSERR_NOERROR)
	{
		ASSERT(FALSE);
		return FALSE;
	}

	if (waveInAddBuffer(m_hWaveIn, pWaveHdr, sizeof(WAVEHDR)) != MMSYSERR_NOERROR)
	{
		ASSERT(FALSE);
		return FALSE;
	}

	return TRUE;
}
Example #4
0
//为录音分配一组内存
BOOL CAudioRec::AllocBuffer()
{
	BOOL bRet=FALSE;
	UINT i;
	
	m_pHdr=new WAVEHDR[NUM_BUF];
	//为了使录音连续,采用多个缓冲区
	for(i=0;i<NUM_BUF;i++)
	{
		ZeroMemory(&m_pHdr[i],sizeof(WAVEHDR));
		m_pHdr[i].lpData=new char[m_nBufSize];
		m_pHdr[i].dwBufferLength=m_nBufSize;
		m_mmr=waveInPrepareHeader(m_hIn,&m_pHdr[i],sizeof(WAVEHDR));
		if(m_mmr)		
			goto RET;
		
		m_mmr=waveInAddBuffer(m_hIn,&m_pHdr[i],sizeof(WAVEHDR));
		if(m_mmr)
			goto RET;
		

	}
	
	bRet=TRUE;
RET:
	return bRet;
}
Example #5
0
static void nt_resyncaudio(void)
{
    UINT mmresult; 
    int nad, nda, count;
    if (nt_resync_cancelled)
    	return;
    	/* for each open input device, eat all buffers which are marked
    	    ready.  The next one will thus be "busy".  */
    post("resyncing audio");
    for (nad = 0; nad < nt_nwavein; nad++)
    {
    	int phase = ntsnd_inphase[nad];
    	for (count = 0; count < MAXRESYNC; count++)
    	{
	    WAVEHDR *inwavehdr = ntsnd_invec[nad][phase].lpWaveHdr;
	    if (!(inwavehdr->dwFlags & WHDR_DONE)) break;
	    if (inwavehdr->dwFlags & WHDR_PREPARED)
    		waveInUnprepareHeader(ntsnd_indev[nad],
    		    inwavehdr, sizeof(WAVEHDR)); 
	    inwavehdr->dwFlags = 0L;
	    waveInPrepareHeader(ntsnd_indev[nad], inwavehdr, sizeof(WAVEHDR)); 
	    mmresult = waveInAddBuffer(ntsnd_indev[nad], inwavehdr,
	    	sizeof(WAVEHDR));
	    if (mmresult != MMSYSERR_NOERROR)
        	nt_waveinerror("waveInAddBuffer: %s\n", mmresult);
	    ntsnd_inphase[nad] = phase = WRAPFWD(phase + 1);
    	}
    	if (count == MAXRESYNC) post("resync error 1");
    }
    	/* Each output buffer which is "ready" is filled with zeros and
    	queued. */
    for (nda = 0; nda < nt_nwaveout; nda++)
    {
    	int phase = ntsnd_outphase[nda];
    	for (count = 0; count < MAXRESYNC; count++)
    	{
	    WAVEHDR *outwavehdr = ntsnd_outvec[nda][phase].lpWaveHdr;
	    if (!(outwavehdr->dwFlags & WHDR_DONE)) break;
	    if (outwavehdr->dwFlags & WHDR_PREPARED)
    		waveOutUnprepareHeader(ntsnd_outdev[nda],
    		    outwavehdr, sizeof(WAVEHDR)); 
	    outwavehdr->dwFlags = 0L;
	    memset((char *)(ntsnd_outvec[nda][phase].lpData),
	    	0, (CHANNELS_PER_DEVICE * SAMPSIZE * nt_realdacblksize));
	    waveOutPrepareHeader(ntsnd_outdev[nda], outwavehdr,
	    	sizeof(WAVEHDR)); 
	    mmresult = waveOutWrite(ntsnd_outdev[nda], outwavehdr,
	    	sizeof(WAVEHDR)); 
	    if (mmresult != MMSYSERR_NOERROR)
        	nt_waveouterror("waveOutAddBuffer: %s\n", mmresult);
	    ntsnd_outphase[nda] = phase = WRAPFWD(phase + 1);
    	}
    	if (count == MAXRESYNC) post("resync error 2");
    }

#ifdef MIDI_TIMESTAMP
    nt_resetmidisync();
#endif

} 
Example #6
0
int openMicAndStartRecording(DWORD threadId)
{
	int i;

	WAVEFORMATEX m_WaveFormatEx = getDefaultFormat();

	if( MMSYSERR_NOERROR != waveInOpen(&g_recordHandler,WAVE_MAPPER,&m_WaveFormatEx,threadId,0,CALLBACK_THREAD)){
		printf("ER1!\n");
		return -1;
	}

	for(i=0; i<MAXRECBUFFER; i++){
		rechead[i]=CreateWaveHeader();
		if(MMSYSERR_NOERROR != waveInPrepareHeader(g_recordHandler,rechead[i], sizeof(WAVEHDR)) ){
			printf("ER2!   i=%d\n", i);
			return -1;
		}

		if(MMSYSERR_NOERROR != waveInAddBuffer(g_recordHandler, rechead[i], sizeof(WAVEHDR))){
			printf("ER3!\n");
			return -1;
		}

		if(MMSYSERR_NOERROR != waveInStart(g_recordHandler)){
			printf("ER4!\n");	
			return -1;
		}
	}

	printf("Start recording OK!\n");
	return 0;
}
Example #7
0
DWORD CWaveBuffer::m_dwPrepare(HWAVEIN hWaveIn)
{
	m_vPrepareCommon(m_iSize);
	m_hWaveIn = hWaveIn;
	
	return waveInPrepareHeader(m_hWaveIn, &m_header, sizeof(m_header));
}
void RUIAudio::On_WIM_DATA(WAVEHDR* pWaveHdr)
{
	if (m_hWaveIn != NULL && pWaveHdr != NULL && m_pRUIBufferListPCM != NULL && pWaveHdr->dwBytesRecorded > 0)
	{
		DWORD	dwCurrTick = GetTickCount();

#ifdef _USE_AAC_CODEC
		// [neuromos] !아래 코드는 TCP만 지원함
		RUIBuffer*	pRUIBufferPCM = m_pRUIBufferListPCM->AddBuffer((BYTE*) (pWaveHdr->lpData), pWaveHdr->dwBytesRecorded, dwCurrTick);
#else
		if (m_nCodec != PCM_16)
		{
			DWORD	dwFrameSizeEnc = EncodeVoicePCM(m_nCodec, (void*) (pWaveHdr->lpData), pWaveHdr->dwBytesRecorded, (void*) m_pFrameRecEnc, WAVE_FRAME_SIZE);

			m_pRUIBufferListSend->AddUDPFrame(m_nFrameType, 0, m_dwFrameKey, dwFrameSizeEnc           , dwCurrTick, (BYTE*) m_pFrameRecEnc    , dwFrameSizeEnc           , 0);
		}
		else
			m_pRUIBufferListSend->AddUDPFrame(m_nFrameType, 0, m_dwFrameKey, pWaveHdr->dwBytesRecorded, dwCurrTick, (BYTE*) (pWaveHdr->lpData), pWaveHdr->dwBytesRecorded, 0);
#endif

		m_dwFrameKey++;

		if (waveInPrepareHeader(m_hWaveIn, pWaveHdr, sizeof(WAVEHDR)) != MMSYSERR_NOERROR)
		{
			ASSERT(FALSE);
			return;
		}
		
		if( waveInAddBuffer    (m_hWaveIn, pWaveHdr, sizeof(WAVEHDR)) != MMSYSERR_NOERROR)
		{
			ASSERT(FALSE);
			return;
		}
	}
}
Example #9
0
int main()
{
   HWAVEIN   inStream;
   HWAVEOUT outStream;
   WAVEFORMATEX waveFormat;
   WAVEHDR buffer[4];                             // pingpong buffers

   waveFormat.wFormatTag      = WAVE_FORMAT_PCM;  // PCM audio
   waveFormat.nSamplesPerSec  =           22050;  // really 22050 frames/sec
   waveFormat.nChannels       =               2;  // stereo
   waveFormat.wBitsPerSample  =              16;  // 16bits per sample
   waveFormat.cbSize          =               0;  // no extra data
   waveFormat.nBlockAlign     =
      waveFormat.nChannels * waveFormat.wBitsPerSample / 2;
   waveFormat.nAvgBytesPerSec =
      waveFormat.nBlockAlign * waveFormat.nSamplesPerSec;

   // Event: default security descriptor, Manual Reset, initial non-signaled
   HANDLE event = CreateEvent(NULL, TRUE, FALSE, "waveout event");

   waveInOpen(  &inStream, WAVE_MAPPER, &waveFormat, (unsigned long)event, 
      0, CALLBACK_EVENT);
   waveOutOpen(&outStream, WAVE_MAPPER, &waveFormat, (unsigned long)event, 
      0, CALLBACK_EVENT);

   // initialize the input and output PingPong buffers
   int index;
   for(index = 0; index < 4; index++) {
      buffer[index].dwBufferLength = NUM_FRAMES * waveFormat.nBlockAlign;
      buffer[index].lpData         = 
	 (void *)malloc(NUM_FRAMES * waveFormat.nBlockAlign);

      buffer[index].dwFlags        = 0;
      waveInPrepareHeader(  inStream, &buffer[index], sizeof(WAVEHDR));
   }

   ResetEvent(event);
   for(index= 0; index < 4; index++) // queue all buffers for input
      waveInAddBuffer(inStream, &buffer[index], sizeof(WAVEHDR));
   waveInStart(inStream);
    
   while(!( buffer[1].dwFlags & WHDR_DONE)); // poll(!) for 2 full input buffers

   // move the two full buffers to output
   waveOutWrite(outStream, &buffer[0], sizeof(WAVEHDR));
   waveOutWrite(outStream, &buffer[1], sizeof(WAVEHDR));

   int inIndex = 2, outIndex = 0; // the next input and output to watch
   while(1) {  // poll for completed input and output buffers
      if(buffer[inIndex].dwFlags & WHDR_DONE) { // input buffer complete?
	 waveInAddBuffer(  inStream, &buffer[inIndex],  sizeof(WAVEHDR));
	 inIndex = (inIndex+1)%4;   // next buffer to watch for full
      }

      if(buffer[outIndex].dwFlags & WHDR_DONE) { // output buffer complete?
	 waveOutWrite(    outStream, &buffer[outIndex], sizeof(WAVEHDR));
	 outIndex = (outIndex+1)%4;   // next buffer to watch for empty
      }
   }
}
Example #10
0
void WaveInStart(WaveIn *waveIn, BOOL prep)
{
    MMRESULT res;

    res = waveInReset(waveIn->handler);
    if(res) {
        return;
    }

    // prepare header an add the buffer
    waveIn->header.lpData = (char *) waveIn->data;
    waveIn->header.dwBufferLength = waveIn->n * 2;
    waveIn->header.dwBytesRecorded = 0;
    waveIn->header.dwFlags = 0L;
    waveIn->header.dwLoops = 0L;
    waveIn->header.dwUser = 0L;
    waveInPrepareHeader(waveIn->handler, &waveIn->header, sizeof(WAVEHDR));

    res = waveInAddBuffer(waveIn->handler, &waveIn->header, sizeof(WAVEHDR));
    if(res) {
        return;
    }

    res = waveInStart(waveIn->handler);
    if(res) {
        return;
    }
}
Example #11
0
bool CAudio::InitializeWaveIn()
{
	if (!waveInGetNumDevs())
		return false;

	MMRESULT	mmResult;
	DWORD		dwThreadID = 0;
	m_hThreadCallBack = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)waveInCallBack, (LPVOID)this, CREATE_SUSPENDED, &dwThreadID);
	mmResult = waveInOpen(&m_hWaveIn, (WORD)WAVE_MAPPER, &(m_GSMWavefmt.wfx), (LONG)dwThreadID, (LONG)0, CALLBACK_THREAD);

	if (mmResult != MMSYSERR_NOERROR)
		return false;

	for (int i = 0; i < 2; i++)
	{
		m_lpInAudioHdr[i]->lpData = (LPSTR)m_lpInAudioData[i];
		m_lpInAudioHdr[i]->dwBufferLength = m_nBufferLength;
		m_lpInAudioHdr[i]->dwFlags = 0;
		m_lpInAudioHdr[i]->dwLoops = 0;
		waveInPrepareHeader(m_hWaveIn, m_lpInAudioHdr[i], sizeof(WAVEHDR));
	}
	
	waveInAddBuffer(m_hWaveIn, m_lpInAudioHdr[m_nWaveInIndex], sizeof(WAVEHDR));

	ResumeThread(m_hThreadCallBack);
	waveInStart(m_hWaveIn);

	m_bIsWaveInUsed = true;

	return true;

}
WAVEHDR* QAudioInputPrivate::allocateBlocks(int size, int count)
{
    int i;
    unsigned char* buffer;
    WAVEHDR* blocks;
    DWORD totalBufferSize = (size + sizeof(WAVEHDR))*count;

    if((buffer=(unsigned char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
                                         totalBufferSize)) == 0) {
        qWarning("QAudioInput: Memory allocation error");
        return 0;
    }
    blocks = (WAVEHDR*)buffer;
    buffer += sizeof(WAVEHDR)*count;
    for(i = 0; i < count; i++) {
        blocks[i].dwBufferLength = size;
        blocks[i].lpData = (LPSTR)buffer;
        blocks[i].dwBytesRecorded=0;
        blocks[i].dwUser = 0L;
        blocks[i].dwFlags = 0L;
        blocks[i].dwLoops = 0L;
        result = waveInPrepareHeader(hWaveIn,&blocks[i], sizeof(WAVEHDR));
        if(result != MMSYSERR_NOERROR) {
            qWarning("QAudioInput: Can't prepare block %d",i);
            return 0;
        }
        buffer += size;
    }
    return blocks;
}
Example #13
0
	/**
	 * WAV録音準備
	 * @param filename 保存ファイル名
	 * @param channel チャンネル
	 * @param rate レート
	 * @param bits ビット数
	 * @param interval 取得タイミング
	 */
	void openWAV(const tjs_char *filename, int channel, int rate, int bits, int interval) {

		closeWAV();
		
		// ファイルを開く
		wvout = TVPCreateIStream(filename, TJS_BS_WRITE);
		
		// フォーマットを指定
		WAVEFORMATEX waveForm;
		waveForm.wFormatTag      = WAVE_FORMAT_PCM;
		waveForm.nChannels       = channel;
		waveForm.nSamplesPerSec  = rate;
		waveForm.wBitsPerSample  = bits;
		waveForm.nBlockAlign     = waveForm.nChannels * waveForm.wBitsPerSample / 8;
		waveForm.nAvgBytesPerSec = waveForm.nSamplesPerSec * waveForm.nBlockAlign;
		
		// waveIn を開く
		if (waveInOpen(&hwi, WAVE_MAPPER, &waveForm, (DWORD)waveInProc, (DWORD)this, CALLBACK_FUNCTION) != MMSYSERR_NOERROR) {
			TVPThrowExceptionMessage(L"waveInOpen");
		}
		
		/* キャプチャバッファ確保 */
		int length = waveForm.nAvgBytesPerSec * interval / 1000;
		wvhdr.lpData         = new char[length];
		wvhdr.dwBufferLength = length;
		wvhdr.dwFlags        = 0;
		wvhdr.reserved       = 0;

		// バッファを設定
		waveInPrepareHeader(hwi, &wvhdr, sizeof(wvhdr));
		waveInAddBuffer(hwi, &wvhdr, sizeof(wvhdr));
	}
Example #14
0
static int add_wave_in(struct ausrc_st *st)
{
	struct dspbuf *db = &st->bufs[st->pos];
	WAVEHDR *wh = &db->wh;
	MMRESULT res;

	wh->lpData          = (LPSTR)db->mb->buf;
	wh->dwBufferLength  = db->mb->size;
	wh->dwBytesRecorded = 0;
	wh->dwFlags         = 0;
	wh->dwUser          = (DWORD_PTR)db->mb;

	waveInPrepareHeader(st->wavein, wh, sizeof(*wh));
	res = waveInAddBuffer(st->wavein, wh, sizeof(*wh));
	if (res != MMSYSERR_NOERROR) {
		warning("winwave: add_wave_in: waveInAddBuffer fail: %08x\n",
			res);
		return ENOMEM;
	}

	INC_RPOS(st->pos);

	st->inuse++;

	return 0;
}
Example #15
0
//分配内存
BOOL CWaveIn::PerPareBuffer()
{
    //已经分配内存
    if (m_bAllocBuffer)
    {
        //返回
        return FALSE;
    }

    //重置录音设备
    m_mmr = waveInReset(m_hIn);
    //出错
    if (m_mmr)
    {
        //返回
        return FALSE;
    }

    //循环变量
    UINT i;
    //新建WAVEHDR结构
    m_pHdr = new WAVEHDR[NUM_BUF];

    for (i = 0; i < NUM_BUF; i++)
    {
        //初始化
        ZeroMemory(&m_pHdr[i], sizeof(WAVEHDR));
        //波形缓存
        m_pHdr[i].lpData = new char[SIZE_AUDIO_FRAME];
        //缓存大小
        m_pHdr[i].dwBufferLength = SIZE_AUDIO_FRAME;
        m_pHdr[i].dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP;
        m_pHdr[i].dwLoops = 1;

        //准备缓存
        m_mmr = waveInPrepareHeader(m_hIn, &m_pHdr[i], sizeof(WAVEHDR));
        //出错
        if (m_mmr)
        {
            //返回
            return FALSE;
        }

        //添加缓存到录音设备
        m_mmr = waveInAddBuffer(m_hIn, &m_pHdr[i], sizeof(WAVEHDR));
        //出错
        if (m_mmr)
        {
            //返回
            return FALSE;
        }
    }

    //设置内存分配标记
    m_bAllocBuffer = TRUE;

    //返回
    return TRUE;
}
Example #16
0
/*------------------------------------------------------------------------------*/
static void WaveOutSync( void )
{
	MMRESULT	mmRes;

	switch ( WaveOutStep ){
	case -1:
		dprintf( 0, 7, "WaveOut Error%d (0x%08X)", WaveOutErrorStep, (int)WaveOutErrorRes );
		break;
	case 0:
		if ( SettingData.WAVOut != 0 ){ WaveOutStep = 1; }
		break;
	case 1:
		mmRes = waveOutOpen( &HdWaveOut, WaveOutUse, &WaveFormat, (DWORD)WaveOutProc, 0, CALLBACK_FUNCTION );
		if ( WaveOutErrorCheck( mmRes ) != FALSE ){ return; }
		WaveOutStep = 2;
		break;
	case 2:
		if ( WaveInStep != 4 ){ break; }
		if ( WaveOutStatus == WAVEOUTSTATUS_OPEN ){ WaveOutStep = 3; }
		break;
	case 3:
		if ( SettingData.WAVOut == 0 ){ WaveOutStep = 4; break; }
		while ( WaveBuff[WaveOutNextNo].dwUser & 0x0001 ){
			mmRes = waveInUnprepareHeader( HdWaveIn, &WaveBuff[WaveOutNextNo], sizeof(WAVEHDR) );
			if ( WaveOutFlag != 0 ){
				mmioWrite( hWaveRec, (char *)WaveBuff[WaveOutNextNo].lpData,
						   WaveBuff[WaveOutNextNo].dwBufferLength );
			}
			int diff = (WaveOutNextNo+WAVEBUFFNUM - WaveOutLastNo)%WAVEBUFFNUM;
			if ( diff <= WAVEBUFFNUM/2 ){
				mmRes = waveOutPrepareHeader( HdWaveOut, &WaveBuff[WaveOutNextNo], sizeof(WAVEHDR) );
				mmRes = waveOutWrite( HdWaveOut, &WaveBuff[WaveOutNextNo], sizeof(WAVEHDR) );
				WaveBuff[WaveOutNextNo].dwUser |= 0x0020;
			} else {
				WaveBuff[WaveOutNextNo].dwUser |= 0x0010;
			}
			WaveBuff[WaveOutNextNo].dwUser &= ~0x0001;
			WaveOutNextNo = (WaveOutNextNo + 1 ) % WAVEBUFFNUM;
		}
		while ( WaveBuff[WaveOutLastNo].dwUser & 0x0010 ){
			if ( WaveBuff[WaveOutNextNo].dwUser & 0x0020 ){
				mmRes = waveOutUnprepareHeader( HdWaveOut, &WaveBuff[WaveOutLastNo], sizeof(WAVEHDR) );
			}
			mmRes = waveInPrepareHeader( HdWaveIn, &WaveBuff[WaveOutLastNo], sizeof(WAVEHDR) );
			mmRes = waveInAddBuffer( HdWaveIn, &WaveBuff[WaveOutLastNo], sizeof(WAVEHDR) );
			WaveBuff[WaveOutLastNo].dwUser &= ~0x0030;
			WaveOutLastNo = (WaveOutLastNo + 1 ) % WAVEBUFFNUM;
		}
		break;
	case 4:
		waveOutReset( HdWaveOut );
		for ( int i=0; i<WAVEBUFFNUM; i++ ){
			waveOutUnprepareHeader( HdWaveOut, &WaveBuff[i], sizeof(WAVEHDR) );
		}
		waveOutClose( HdWaveOut );
		WaveOutStep = 0;
		break;
	}
}
Example #17
0
/**
 * win32ai_open(int sample_rate)
 * Setup audio for input at specified rate.
 * returns -1 on error, 0 on happy.
 */
int win32ai_open(int sample_rate) {
	WAVEFORMATEX waveFormat;
	MMRESULT res;
	int i;

	// create an event by which audio driver will notify us
	whinEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

	// populate whinFormat struct
	waveFormat.wFormatTag = WAVE_FORMAT_PCM;
	waveFormat.nChannels = 1;
	waveFormat.nSamplesPerSec = sample_rate;
	waveFormat.nAvgBytesPerSec = sample_rate * SAMPLE_BITS / 8;
	waveFormat.nBlockAlign = SAMPLE_BITS / 8;
	waveFormat.wBitsPerSample = SAMPLE_BITS;
	waveFormat.cbSize = 0;

	whinBufNo = 0;
	whinBufIndex = 0;

	// open audio device
	res = waveInOpen(&wavein, WAVE_MAPPER, &waveFormat,
			 (DWORD) whinEvent, (DWORD) 0, CALLBACK_EVENT);
	if (checkWaveInResult(wavein, res, "waveInOpen"))
		return -1;

	// create buffers
	for (i = 0; i < WaveBuf_N; ++i) {
		// allocate buffer header
		whin[i] = (WAVEHDR*) calloc(1, sizeof(WAVEHDR));
		if (whin[i] == NULL) {
			perror("malloc WAVEHDR");
			return -1;		/* need to cleanup XXX */
		}
		// allocate buffer
		whin[i]->lpData = malloc(WaveBuf_SIZE);
		if (whin[i]->lpData == NULL) {
			perror("new char[WaveBuf_SIZE]");
			return -1;		/* need to cleanup XXX */
		}
		whin[i]->dwBufferLength = WaveBuf_SIZE;
		// prepare buffer
		res = waveInPrepareHeader(wavein, whin[i], sizeof(WAVEHDR));
		if (checkWaveInResult(wavein, res, "waveInPrepareHeader"))
			return -1;
		// give buffer to driver
		res = waveInAddBuffer(wavein, whin[i], sizeof(WAVEHDR));
		if (checkWaveInResult(wavein, res, "waveInAddBuffer"))
			return -1;			/* need to cleanup XXX */
	}

	// start device, yeeeeeee haw!
	res = waveInStart(wavein);
	if (checkWaveInResult(wavein, res, "waveInStart"))
		return -1;				/* need to cleanup XXX */

	return 0;
}
Example #18
0
/*
 * Class:     com_ibm_media_protocol_device_DevicePushSourceStream
 * Method:    read
 * Signature: ([BII)I
 */
JNIEXPORT jint JNICALL Java_com_ibm_media_protocol_device_DevicePushSourceStream_read
(JNIEnv* env, jobject obj, jbyteArray arr, jint offset, jint length) {
	
	MMRESULT result;

	jclass cls;
	jmethodID mid;
	jsize len = (*env)->GetArrayLength(env, arr);
	jbyte* body = (*env)->GetByteArrayElements(env, arr, JNI_FALSE);

	/* fill the buffer struct */
	waveHeader.lpData = &body[offset];
	waveHeader.dwBufferLength = length;
	waveHeader.dwBytesRecorded = 0; 
	waveHeader.dwUser = NULL;
	waveHeader.dwFlags = NULL;
	waveHeader.dwLoops = NULL;
	waveHeader.lpNext = NULL;
	waveHeader.reserved = NULL;

	isBufferFilled = FALSE;

	/* preper the buffer */
	result = waveInPrepareHeader(hwi, &waveHeader, sizeof(WAVEHDR)); 
	/* DEBUG */
	if (result != MMSYSERR_NOERROR)
		printf("ERROR while adding buffer to device !\n %d\n", result);
	/* end DEBUG */

	result = waveInAddBuffer(hwi, &waveHeader, sizeof(WAVEHDR));
	/* DEBUG */
	if (result != MMSYSERR_NOERROR)
		printf("ERROR while adding buffer to device !\n %d\n", result);
	/* end DEBUG */
	
	if (!isStarted) 
		startDevice();

	/* wait until buffer was filled */
	while (!isBufferFilled)
		Sleep(10);

	(*env)->ReleaseByteArrayElements(env, arr, body, 0);
    
	/* notify DevicePushSourceStream it can generate another transferData call */
	if (isStarted) {
		cls = (*env)->GetObjectClass(env, obj);
		mid = (*env)->GetMethodID(env, cls, "notify", "()V");
		if (mid == 0) {
			printf("Error indentifying native method\n");
			return;
		}
		(*env)->CallVoidMethod(env, obj, mid);
	}
	
	return waveHeader.dwBytesRecorded;
}
void CAudioInput::OpenMic()
{
	SetWaveHDRInit();
	SetWaveInitFormat();
	waveInOpen(&h_input, 0, &my_wave_format, (DWORD)waveInProc, 0, CALLBACK_FUNCTION);
	waveInPrepareHeader(h_input, mp_wave_header, sizeof(WAVEHDR));
	waveInAddBuffer(h_input, mp_wave_header, sizeof(WAVEHDR));
	waveInStart(h_input);
}
// Define: _start(WORD, DWORD, DWORD) (real)
DWORD waveCapture::_start(const WORD uDevice, const DWORD dwBufferLength, const DWORD dwNumBuffers)
{
    // only one start per session is permitted
    if(_recording)
        return ERR_ALREADYSTARTED;

    // I need dwNumBuffers in stop() as well so I'll set __dwNumBuffers under the counter
    __dwNumBuffers = dwNumBuffers;

    // Define WAVEFORMATEX Structure (WAVEFORMATEX wf):
    wf.wFormatTag      = WAVE_FORMAT_PCM;
    wf.wBitsPerSample  = _wBitsPerSample;
    wf.nChannels       = _nChannels;
    wf.nSamplesPerSec  = _dwSamplePerSec;
    wf.nBlockAlign     = (wf.nChannels * wf.wBitsPerSample) / 8;
    wf.nAvgBytesPerSec = (wf.nSamplesPerSec * wf.nBlockAlign);
    wf.cbSize          = 0;

    // Create event:
    hevent = CreateEvent(NULL,FALSE,FALSE,NULL);
    if(hevent == NULL)
        return ERR_EVENTNULL;

    // WaveInOpen
    if(waveInOpen(&hwi,uDevice,(LPWAVEFORMATEX)&wf,(DWORD)hevent,0,CALLBACK_EVENT) != MMSYSERR_NOERROR)
        return ERR_WAVEINOPEN;

    // Define WAVEHDR Structure:
    buff = new WAVEHDR*[dwNumBuffers];
    for (int i = 0; i<(int)dwNumBuffers; i++)
    {
        buff[i] = new WAVEHDR;
        ZeroMemory(buff[i],sizeof(WAVEHDR));
        buff[i]->lpData          = (char*) malloc(dwBufferLength);
        buff[i]->dwBufferLength  = dwBufferLength;
        buff[i]->dwBytesRecorded = 0;
        buff[i]->dwUser          = 0;
        buff[i]->dwFlags         = 0;
        buff[i]->dwLoops         = 0;

        if(waveInPrepareHeader(hwi, buff[i], sizeof(WAVEHDR)) != MMSYSERR_NOERROR)
            return ERR_WAVEINPREPAREHEADER;

        if(waveInAddBuffer(hwi, buff[i], sizeof(WAVEHDR)) != MMSYSERR_NOERROR)
            return ERR_WAVEINADDBUFFER;
    }

    // Start capturing...
    if(waveInStart(hwi) != MMSYSERR_NOERROR)
        return ERR_WAVEINSTART;

    _dwBufferCount      = 0;
    dwTotalBufferLength = 0;
    _recording          = true;
    return ERR_NOERROR;
}
Example #21
0
/**
 * win32ai_read(buf, size)
 * Read stuff and return count of what was read.
 * Return -1 on error.
 */
int win32ai_read(unsigned char *buf, unsigned bufsiz) {
	unsigned char *bufptr = buf;
	unsigned char *bufend = buf + bufsiz;
	MMRESULT res;
	int i, n;

	// rumage through buffers looking for data
	for (i = whinBufNo; bufptr < bufend; i = (i + 1) % WaveBuf_N) {

		// wait for buffer if necessary
		while ((whin[i]->dwFlags & WHDR_DONE) == 0) {
			// buffer not ready, wait, try again
			WaitForSingleObject(whinEvent, INFINITE);
		}

		// unprepare buffer (no op if already unprepared)
		if (whin[i]->dwUser == 0) {
			whin[i]->dwUser = 1;
			res = waveInUnprepareHeader(wavein, whin[i], sizeof(WAVEHDR));
			if (checkWaveInResult(wavein, res, "waveInUnprepareHeader"))
				return -1;
		}

		// do something with data, dwBytesRecorded
		n = whin[i]->dwBytesRecorded;
		if (bufptr + n > bufend)
			n = bufend - bufptr;
		memcpy(bufptr, whin[i]->lpData + WaveBuf_SIZE
			- whin[i]->dwBytesRecorded, n);
		bufptr += n;
		whin[i]->dwBytesRecorded -= n;

		if (whin[i]->dwBytesRecorded == 0) {
			// initialization
			whin[i]->dwUser = 0;
			whin[i]->dwFlags = 0;
			whin[i]->dwBufferLength = WaveBuf_SIZE;

			// prepare buffer
			res = waveInPrepareHeader(wavein, whin[i], sizeof(WAVEHDR));
			if (checkWaveInResult(wavein, res, "waveInPrepareHeader"))
				return -1;
			
			// give buffer back to driver
			res = waveInAddBuffer(wavein, whin[i], sizeof(WAVEHDR));
			if (checkWaveInResult(wavein, res, "waveInAddBuffer"))
				return -1;

			// done with this buffer, point to the next one
			whinBufNo = (whinBufNo + 1) % WaveBuf_N;
		}
	}

	return bufptr - buf;
}
void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, DWORD dwInstance, 
							DWORD dwParam1, DWORD dwParam2){
	switch(uMsg){
	case WIM_DATA:
		pTemp->GetBufferData();
		waveInUnprepareHeader(pTemp->h_input, pTemp->mp_wave_header, sizeof(WAVEHDR));
		waveInPrepareHeader(pTemp->h_input, pTemp->mp_wave_header, sizeof(WAVEHDR));
		waveInAddBuffer(pTemp->h_input, pTemp->mp_wave_header, sizeof(WAVEHDR));
		break;
	}
}
Example #23
0
static void do_read(struct userdata *u) {
    uint32_t free_frags;
    pa_memchunk memchunk;
    WAVEHDR *hdr;
    MMRESULT res;
    void *p;

    if (!u->source)
        return;

    if (!PA_SOURCE_IS_LINKED(u->source->state))
        return;

    EnterCriticalSection(&u->crit);
    free_frags = u->free_ifrags;
    u->free_ifrags = 0;
    LeaveCriticalSection(&u->crit);

    if (free_frags == u->fragments)
        pa_log_debug("WaveIn overflow!");

    while (free_frags) {
        hdr = &u->ihdrs[u->cur_ihdr];
        if (hdr->dwFlags & WHDR_PREPARED)
            waveInUnprepareHeader(u->hwi, hdr, sizeof(WAVEHDR));

        if (hdr->dwBytesRecorded) {
            memchunk.memblock = pa_memblock_new(u->core->mempool, hdr->dwBytesRecorded);
            pa_assert(memchunk.memblock);

            p = pa_memblock_acquire(memchunk.memblock);
            memcpy((char*) p, hdr->lpData, hdr->dwBytesRecorded);
            pa_memblock_release(memchunk.memblock);

            memchunk.length = hdr->dwBytesRecorded;
            memchunk.index = 0;

            pa_source_post(u->source, &memchunk);
            pa_memblock_unref(memchunk.memblock);
        }

        res = waveInPrepareHeader(u->hwi, hdr, sizeof(WAVEHDR));
        if (res != MMSYSERR_NOERROR)
            pa_log_error("Unable to prepare waveIn block: %d", res);

        res = waveInAddBuffer(u->hwi, hdr, sizeof(WAVEHDR));
        if (res != MMSYSERR_NOERROR)
            pa_log_error("Unable to add waveIn block: %d", res);

        free_frags--;
        u->cur_ihdr++;
        u->cur_ihdr %= u->fragments;
    }
}
Example #24
0
void CALLBACK WWaveIn::_WaveInProc(HWAVEIN hwi, UINT uMsg, DWORD dwInstance,DWORD dwParam1, DWORD dwParam2)
{
	WWaveIn *instance = (WWaveIn*) dwInstance;
	
 	switch(uMsg)
	{
	
    	case MM_WIM_OPEN:
        break;

        case MM_WIM_CLOSE:
        break;
		

        case MM_WIM_DATA:
		{
			if(instance->c_fWorking == 0)
				break;

			// add data to queue
			WAVEHDR* header = (WAVEHDR *) dwParam1;
			unsigned int nHaveRecorded = header->dwBytesRecorded;
			

			EnterCriticalSection(&instance->cs);
			// add new data to buffer
			if(nHaveRecorded)
				instance->c_Queue.PushLast(header->lpData, nHaveRecorded);

			unsigned int nHaveInQueue = instance->c_Queue.GetSizeSum();

			if(nHaveInQueue > instance->c_nMaxQueueSizeInBytes)
			{
				// need to cut
				instance->c_Queue.CutDataFifo(nHaveInQueue - instance->c_nMaxQueueSizeInBytes);
			}

			LeaveCriticalSection(&instance->cs);

		
			waveInUnprepareHeader(hwi, header, sizeof(WAVEHDR));
			header->dwFlags = 0;
			waveInPrepareHeader(hwi, header, sizeof(WAVEHDR));
			waveInAddBuffer(hwi, header, sizeof(WAVEHDR));
		



		}
        break;
    }
}
Example #25
0
/**
 * Add input buffer to WAV recorder
 * Input buffer will be used for WAV recording
 */
static javacall_result add_input_buffer(recorder_handle* hRecord, 
                                        WAVEFORMATEX* pFormat)
{
#define BUFFER_SIZE (2048)

    char* pBuffer = NULL;
    long  bufSize = 0;
    MMRESULT mmReturn = 0;

    /* if there is no header, create it */
    if (NULL == hRecord->pHdr) {
        hRecord->pHdr = (LPWAVEHDR)LocalAlloc(LPTR, sizeof(WAVEHDR));
        if (NULL == hRecord->pHdr) return JAVACALL_FAIL;
    }

    /* if there is no buffer, create it */
    if (NULL == hRecord->pHdr->lpData) {
        bufSize = pFormat->nBlockAlign * BUFFER_SIZE;
        hRecord->pHdr->lpData = (char*)LocalAlloc(LPTR, bufSize);
        if (NULL == hRecord->pHdr->lpData) {
            LocalFree((HLOCAL)hRecord->pHdr);
            return JAVACALL_FAIL;
        }
    }
    /* Initialize buffer length */
    hRecord->pHdr->dwBufferLength = bufSize;
    
    /* prepare it */
    mmReturn = waveInPrepareHeader(hRecord->hWAVEIN, hRecord->pHdr, sizeof(WAVEHDR));
    if (MMSYSERR_NOERROR != mmReturn) {
        LocalFree((HLOCAL)hRecord->pHdr->lpData);
        hRecord->pHdr->lpData = NULL;
        LocalFree((HLOCAL)hRecord->pHdr);
        hRecord->pHdr = NULL;
        return JAVACALL_FAIL;
    }

    /* add the input buffer to the queue */
    mmReturn = waveInAddBuffer(hRecord->hWAVEIN, hRecord->pHdr, sizeof(WAVEHDR));
    if (MMSYSERR_NOERROR != mmReturn) {
        waveInUnprepareHeader(hRecord->hWAVEIN, hRecord->pHdr, sizeof(WAVEHDR));
        LocalFree((HLOCAL)hRecord->pHdr->lpData);
        hRecord->pHdr->lpData = NULL;
        LocalFree((HLOCAL)hRecord->pHdr);
        hRecord->pHdr = NULL;
        return JAVACALL_FAIL;
    }

    return JAVACALL_OK;
}
Example #26
0
/**
 * Wave In Callback
 * Call back by Windows
 */
static void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, 
                                DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{
    MMRESULT mmReturn = 0;
    recorder_handle* hRecord = (recorder_handle*)dwInstance;
    DWORD recorded;
        
    if ((NULL == hRecord) || (NULL == hRecord->pHdr))
        return;

    JAVA_DEBUG_PRINT1("[record] waveInProc %d\n", hRecord->isRecording);

    if (uMsg != WIM_DATA)
        return;
    
    if (hRecord->hWAVEIN && hRecord->pHdr) {
        mmReturn = 
            waveInUnprepareHeader(hRecord->hWAVEIN, hRecord->pHdr, sizeof(WAVEHDR));
        if (MMSYSERR_NOERROR != mmReturn) 
            return;
    }

    if (hRecord->isRecording) {
        /* Write to file */
        recorded = hRecord->pHdr->dwBytesRecorded;
        if (recorded) {
            write_wav_file(hRecord, hRecord->pHdr->lpData, recorded);
        }
    
        /* Reuse input buffer */
        mmReturn = 
            waveInPrepareHeader(hRecord->hWAVEIN, hRecord->pHdr, sizeof(WAVEHDR));
        if (MMSYSERR_NOERROR == mmReturn) {
            mmReturn = 
                waveInAddBuffer(hRecord->hWAVEIN, hRecord->pHdr, sizeof(WAVEHDR));
        }
    
        if (MMSYSERR_NOERROR != mmReturn) {
            JAVA_DEBUG_PRINT("[record] Can't reuse input buffer\n");
        }

        return;
    }

    LocalFree(hRecord->pHdr->lpData);
    hRecord->pHdr->lpData = NULL;
    LocalFree(hRecord->pHdr);
    hRecord->pHdr = NULL;
}
Example #27
0
static int32 wavein_enqueue_buf (HWAVEIN h, LPWAVEHDR whdr)
{
    int32 st;
    
    if ((st = waveInPrepareHeader (h, whdr, sizeof(WAVEHDR))) != 0) {
	wavein_error("waveInPrepareHeader", st);
	return -1;
    }
    if ((st = waveInAddBuffer (h, whdr, sizeof(WAVEHDR))) != 0) {
	wavein_error("waveInAddBuffer", st);
	return -1;
    }
    
    return 0;
}
Example #28
0
BOOL Mic_Init_Physical()
{
	if (Mic_Inited)
		return TRUE;

	Mic_Inited = FALSE;

	HRESULT hr;
	WAVEFORMATEX wfx;

	memset(Mic_TempBuf, 0x80, MIC_BUFSIZE);
	memset(Mic_Buffer[0], 0x80, MIC_BUFSIZE);
	memset(Mic_Buffer[1], 0x80, MIC_BUFSIZE);
	Mic_BufPos = 0;

	Mic_WriteBuf = 0;
	Mic_PlayBuf = 1;

	memset(&wfx, 0, sizeof(wfx));
	wfx.cbSize = 0;
	wfx.wFormatTag = WAVE_FORMAT_PCM;
	wfx.nChannels = 1;
	wfx.nSamplesPerSec = 16000;
	wfx.nBlockAlign = 1;
	wfx.nAvgBytesPerSec = 16000;
	wfx.wBitsPerSample = 8;

	hr = waveInOpen(&waveIn, WAVE_MAPPER, &wfx, (DWORD_PTR)waveInProc, 0, CALLBACK_FUNCTION);
	MIC_CHECKERR(hr)

	memset(&waveHdr, 0, sizeof(waveHdr));
	waveHdr.lpData = (LPSTR)Mic_TempBuf;
	waveHdr.dwBufferLength = MIC_BUFSIZE;

	hr = waveInPrepareHeader(waveIn, &waveHdr, sizeof(WAVEHDR));
	MIC_CHECKERR(hr)

	hr = waveInAddBuffer(waveIn, &waveHdr, sizeof(WAVEHDR));
	MIC_CHECKERR(hr)

	hr = waveInStart(waveIn);
	MIC_CHECKERR(hr)

	Mic_Inited = TRUE;
	INFO("win32 microphone init OK\n");

	return TRUE;
}
Example #29
0
LRESULT CChatDlg::onWaveInData(WPARAM wParam, LPARAM lParam)
{
	HWAVEIN hwi = (HWAVEIN) wParam;
	LPWAVEHDR pwh = (LPWAVEHDR) lParam;

	waveInUnprepareHeader(hwi, pwh, sizeof(WAVEHDR));

	short val = *(short *) pwh->lpData;
	m_sendVol.SetPos(abs(val));
	session->sendSpeechData(pwh->lpData, pwh->dwBytesRecorded);

	waveInPrepareHeader(hwi, pwh, sizeof(WAVEHDR));
	waveInAddBuffer(hwi, pwh, sizeof(WAVEHDR));

	return 0;
}
Example #30
0
File: wave.cpp Project: bugou/test
BOOL WaveIn::addBuffer(DWORD size)
{
	WAVEHDR *pwh = new WAVEHDR;
	pwh->dwFlags = 0;
	pwh->dwBufferLength = size;
	pwh->lpData = new char[size];

	waveHeaders.AddTail(pwh);

	if (waveInPrepareHeader(hWaveIn, pwh, sizeof(WAVEHDR)) ||
		waveInAddBuffer(hWaveIn, pwh, sizeof(WAVEHDR))) {
		close();
		return FALSE;
	}
	return TRUE;
}