コード例 #1
0
ファイル: SDL_winmm.c プロジェクト: AMDmi3/symwars3
static void
WINMM_CloseDevice(_THIS)
{
    /* Close up audio */
    if (this->hidden != NULL) {
        int i;

        if (this->hidden->audio_sem) {
            CloseHandle(this->hidden->audio_sem);
            this->hidden->audio_sem = 0;
        }

        /* Clean up mixing buffers */
        for (i = 0; i < NUM_BUFFERS; ++i) {
            if (this->hidden->wavebuf[i].dwUser != 0xFFFF) {
                waveOutUnprepareHeader(this->hidden->hout,
                                       &this->hidden->wavebuf[i],
                                       sizeof(this->hidden->wavebuf[i]));
                this->hidden->wavebuf[i].dwUser = 0xFFFF;
            }
        }

        /* Free raw mixing buffer */
        SDL_free(this->hidden->mixbuf);
        this->hidden->mixbuf = NULL;

        if (this->hidden->hin) {
            waveInClose(this->hidden->hin);
            this->hidden->hin = 0;
        }

        if (this->hidden->hout) {
            waveOutClose(this->hidden->hout);
            this->hidden->hout = 0;
        }

        SDL_free(this->hidden);
        this->hidden = NULL;
    }
}
コード例 #2
0
ファイル: wave.c プロジェクト: AndreyNazarov/q2pro
/*
==============
WAVE_Shutdown

Reset the sound device for exiting
===============
*/
static void WAVE_Shutdown(void)
{
    int     i;

    Com_Printf("Shutting down wave sound\n");

    if (hWaveOut) {
        Com_DPrintf("...resetting waveOut\n");
        waveOutReset(hWaveOut);

        if (lpWaveHdr) {
            Com_DPrintf("...unpreparing headers\n");
            for (i = 0; i < WAV_BUFFERS; i++)
                waveOutUnprepareHeader(hWaveOut, lpWaveHdr + i, sizeof(WAVEHDR));
        }

        Com_DPrintf("...closing waveOut\n");
        waveOutClose(hWaveOut);

        if (hWaveHdr) {
            Com_DPrintf("...freeing WAV header\n");
            GlobalUnlock(hWaveHdr);
            GlobalFree(hWaveHdr);
        }

        if (hData) {
            Com_DPrintf("...freeing WAV buffer\n");
            GlobalUnlock(hData);
            GlobalFree(hData);
        }

    }

    hWaveOut = 0;
    hData = 0;
    hWaveHdr = 0;
    lpData = NULL;
    lpWaveHdr = NULL;
    wav_init = false;
}
コード例 #3
0
ファイル: winsnd2.c プロジェクト: nightfly19/renyang-learn
static void winsnd_write_postprocess(MSFilter *f){
	WinSnd *d=(WinSnd*)f->data;
	MMRESULT mr;
	int i;
	if (d->outdev==NULL) return;
	mr=waveOutReset(d->outdev);
	if (mr != MMSYSERR_NOERROR){
		ms_error("waveOutReset() error");
		return ;
	}
	for(i=0;i<WINSND_OUT_NBUFS;++i){
		WAVEHDR *hdr=&d->hdrs_write[i];
		mblk_t *old;
		if (hdr->dwFlags & WHDR_DONE){
			mr=waveOutUnprepareHeader(d->outdev,hdr,sizeof(*hdr));
			if (mr != MMSYSERR_NOERROR){
				ms_error("waveOutUnprepareHeader error");
			}
			old=(mblk_t*)hdr->dwUser;
			if (old) freemsg(old);
			hdr->dwUser=0;
		}
	}
	mr=waveOutClose(d->outdev);
	if (mr != MMSYSERR_NOERROR){
		ms_error("waveOutClose() error");
		return ;
	}
	ms_message("Shutting down sound device (playing: %i) (d->write_rq.q_mcount=%i) (input-output: %i) (notplayed: %i)", d->nbufs_playing, d->write_rq.q_mcount, d->stat_input - d->stat_output, d->stat_notplayed);
	flushq(&d->write_rq,0);
	d->ready=0;
	d->workaround=0;

#ifndef DISABLE_SPEEX
	if (d->pst!=NULL)
	    speex_preprocess_state_destroy(d->pst);
	d->pst=NULL;
	d->pst_frame_size=0;
#endif
}
コード例 #4
0
void Platform_Win32_Sound_SoundStream_WMM::Play()
	{
	if (playing_)
		{
		return;
		}
	for (int i=0; i<WaveBlockCount; i++)
		{
        if(waveBlocks_[i].dwFlags & WHDR_PREPARED)
			{
			waveOutUnprepareHeader(hWaveOut_, &waveBlocks_[i], sizeof(WAVEHDR));
			}
		int bytesToWrite=WaveBlockSize-(int)(waveBlocks_[i].dwUser);
		int remainder=0;
		if (soundPosition_+bytesToWrite>size_)
			{
			int roomLeft=size_-soundPosition_;
			remainder=bytesToWrite-roomLeft;
			bytesToWrite=roomLeft;
			}
        memcpy(waveBlocks_[i].lpData+waveBlocks_[i].dwUser, static_cast<char*>(soundBuffer_)+soundPosition_,bytesToWrite);
		soundPosition_+=bytesToWrite;
		soundPosition_%=size_;
		if (remainder>0)
			{
	        memcpy(waveBlocks_[i].lpData+waveBlocks_[i].dwUser+bytesToWrite, static_cast<char*>(soundBuffer_)+soundPosition_,remainder);
			soundPosition_+=remainder;
			soundPosition_%=size_;
			}
        waveBlocks_[i].dwBufferLength = WaveBlockSize;
        waveOutPrepareHeader(hWaveOut_, &waveBlocks_[i], sizeof(WAVEHDR));
        waveOutWrite(hWaveOut_, &waveBlocks_[i], sizeof(WAVEHDR));

		EnterCriticalSection(&waveCriticalSection_);
        firstUsedWaveBlock_=0;
        LeaveCriticalSection(&waveCriticalSection_);
        lastUsedWaveBlock_=WaveBlockCount-1;
		}
	playing_=true;
	}
コード例 #5
0
bool CWaveDevice::InternalClose()
//-------------------------------
{
	MPT_TRACE();
	if(m_hWaveOut)
	{
		waveOutReset(m_hWaveOut);
		m_JustStarted = false;
		InterlockedExchange(&m_nBuffersPending, 0);
		m_nWriteBuffer = 0;
		m_nDoneBuffer = 0;
		while(m_nPreparedHeaders > 0)
		{
			m_nPreparedHeaders--;
			waveOutUnprepareHeader(m_hWaveOut, &m_WaveBuffers[m_nPreparedHeaders], sizeof(WAVEHDR));
		}
		waveOutClose(m_hWaveOut);
		m_hWaveOut = NULL;
	}
	#ifdef _DEBUG
		if(m_DriverBugs.load())
		{
				SendDeviceMessage(LogError, MPT_USTRING("Errors were detected while playing sound:\n") + GetStatistics().text);
		}
	#endif
	m_DriverBugs = 0;
	m_Failed = false;
	if(m_ThreadWakeupEvent)
	{
		CloseHandle(m_ThreadWakeupEvent);
		m_ThreadWakeupEvent = NULL;
	}
	{
		MPT_LOCK_GUARD<mpt::mutex> guard(m_PositionWraparoundMutex);
		MemsetZero(m_PositionLast);
		m_PositionWrappedCount = 0;
	}
	return true;
}
コード例 #6
0
ファイル: audiowin32.c プロジェクト: lackofentropy/nyquist
/* 
 * if any buffer is non-empty, send it out
 * return success when all buffers have been returned empty
 */
int audio_flush(snd_type snd)
{
    buffer_state *cur = (buffer_state *) snd->u.audio.descriptor;
    int *index = &(cur->pollee);
    LPWAVEHDR whdrs = cur->whdr;
    int i = 0;
    int test = 0;
    int processed = 0; 
    int numbuf = cur->numofbuffers;
    MMRESULT er;
    
    if (snd->write_flag != SND_WRITE) return SND_SUCCESS;

    if (cur->posinbuffer > 0) { /* flush final partial buffer of data */
        cur->whdr[*index].dwBufferLength = cur->posinbuffer;
        if (er = waveOutPrepareHeader(cur->u.h_out, &(cur->whdr[*index]), sizeof(WAVEHDR))) {
            mm_error_handler(snd, er, snd_fail);
            return !SND_SUCCESS;
        }
        if (er = waveOutWrite(cur->u.h_out, &(cur->whdr[*index]), sizeof(WAVEHDR))) {
            waveOutUnprepareHeader(cur->u.h_out, &(cur->whdr[*index]), sizeof(WAVEHDR));
            mm_error_handler(snd, er, snd_fail);
            return !SND_SUCCESS;
        }
        cur->posinbuffer = 0;
        if (++(*index) >= cur->numofbuffers){
            *index = 0;
        }
    }

    for (i = 0; i < numbuf; i++){ 
        if (whdrs[i].dwFlags & WHDR_DONE) {
            test++;
        }
    }

    if (test < numbuf) return !SND_SUCCESS;
    else return SND_SUCCESS;
}
コード例 #7
0
ファイル: SndOut_waveOut.cpp プロジェクト: KitoHo/pcsx2
    void Close()
    {
        // Stop Thread
        fprintf(stderr, "* SPU2-X: Waiting for waveOut thread to finish...");
        waveout_running = false;

        WaitForSingleObject(thread, INFINITE);
        CloseHandle(thread);

        fprintf(stderr, " Done.\n");

        //
        // Clean up
        //
        waveOutReset(hwodevice);
        for (u32 i = 0; i < numBuffers; i++) {
            waveOutUnprepareHeader(hwodevice, &whbuffer[i], sizeof(WAVEHDR));
        }
        waveOutClose(hwodevice);

        safe_delete_array(qbuffer);
    }
コード例 #8
0
DWORD WINAPI thread_func(LPVOID lpParameter)
{
	while (true)
	{
		// Try to unprepare header
		if (waveOutUnprepareHeader(hWaveOut, &(header[nextPlayBlock]), sizeof(WAVEHDR))
			!= WAVERR_STILLPLAYING)
		{
#ifdef USEDSOUND
			mzkPlayBlock(myMuzikBlock[nextPlayBlock]);
#endif
			waveOutPrepareHeader(hWaveOut, &(header[nextPlayBlock]), sizeof(WAVEHDR));
			waveOutWrite(hWaveOut, &(header[nextPlayBlock]), sizeof(WAVEHDR));
			nextPlayBlock++;
			if (nextPlayBlock >= NUM_PLAY_BLOCKS) nextPlayBlock = 0;
		}
		else
		{
			Sleep(1);
		}
	}
}
コード例 #9
0
ファイル: SoundGen.cpp プロジェクト: nzeemin/nemigabtl
void SoundGen_Finalize()
{
    if (!m_SoundGenInitialized)
        return;

    while (waveFreeBlockCount < BLOCK_COUNT)
        Sleep(10);

    for (int i = 0; i < waveFreeBlockCount; i++)
    {
        if (waveBlocks[i].dwFlags & WHDR_PREPARED)
            waveOutUnprepareHeader(hWaveOut, &waveBlocks[i], sizeof(WAVEHDR));
    }

    DeleteCriticalSection(&waveCriticalSection);
    waveOutClose(hWaveOut);

    HeapFree(GetProcessHeap(), 0, waveBlocks);
    waveBlocks = nullptr;

    m_SoundGenInitialized = false;
}
コード例 #10
0
ファイル: SoundGen.cpp プロジェクト: nzeemin/nemigabtl
void CALLBACK SoundGen_FeedDAC(unsigned short L, unsigned short R)
{
    unsigned int word;
    WAVEHDR* current;

    if (!m_SoundGenInitialized)
        return;

    word = ((unsigned int)R << 16) + L;
    memcpy(&buffer[bufcurpos], &word, 4);
    bufcurpos += 4;

    if (bufcurpos >= BUFSIZE)
    {
        current = &waveBlocks[waveCurrentBlock];

        if (current->dwFlags & WHDR_PREPARED)
            waveOutUnprepareHeader(hWaveOut, current, sizeof(WAVEHDR));

        memcpy(current->lpData, buffer, BUFSIZE);
        current->dwBufferLength = BLOCK_SIZE;

        waveOutPrepareHeader(hWaveOut, current, sizeof(WAVEHDR));
        waveOutWrite(hWaveOut, current, sizeof(WAVEHDR));

        EnterCriticalSection(&waveCriticalSection);
        waveFreeBlockCount--;
        LeaveCriticalSection(&waveCriticalSection);

        while (!waveFreeBlockCount)
            Sleep(1);

        waveCurrentBlock++;
        if (waveCurrentBlock >= BLOCK_COUNT)
            waveCurrentBlock = 0;

        bufcurpos = 0;
    }
}
コード例 #11
0
ファイル: Audio.cpp プロジェクト: mewiteor/ConsolePlayer
DWORD CAudio::AudioThreadProc()
{
    for (;;)
    {
        while (m_bContinue&&DataEmpty())
        {
            DebugPrint("空\n");
            WaitForSingleObject(m_hNotEmptyEvent, 100);
        }
        if (m_bForce || !m_bContinue && DataEmpty())break;
        DebugPrint("m_cWaveHdr:index:%u,flags:%u\n", m_dwWaveHdrIndex, m_cWaveHdr[m_dwWaveHdrIndex].dwFlags);
        if (m_cWaveHdr[m_dwWaveHdrIndex].dwFlags & WHDR_PREPARED)
        {
            waveOutUnprepareHeader(m_hWaveOut, m_cWaveHdr + m_dwWaveHdrIndex, sizeof(WAVEHDR));
            if (MAX_WAVE_DATA_COUNT == ++m_dwEnd)m_dwEnd = 0;
            DebugPrint("减小:%u:%u:%u\n", m_dwStart, m_dwCur, m_dwEnd);
            SetEvent(m_hNotFullEvent);
        }
        m_cWaveHdr[m_dwWaveHdrIndex].lpData = m_cData[m_dwCur].data;
        m_cWaveHdr[m_dwWaveHdrIndex].dwBufferLength = (DWORD)m_cData[m_dwCur].len;
        if (!m_bAudioStart)
        {
            m_bAudioStart = true;
            SetEvent(m_hStartEvent);
            while (!m_bVideoStart)
                WaitForSingleObject(m_hStartEvent, 100);
        }
        waveOutPrepareHeader(m_hWaveOut, m_cWaveHdr + m_dwWaveHdrIndex, sizeof(WAVEHDR));
        waveOutWrite(m_hWaveOut, m_cWaveHdr + m_dwWaveHdrIndex, sizeof(WAVEHDR));
        if (MAX_WAVE_DATA_COUNT == ++m_dwCur)m_dwCur = 0;
        DebugPrint("中间:%u:%u:%u\n", m_dwStart, m_dwCur, m_dwEnd);
        if (MAX_WAVE_COUNT == ++m_dwWaveHdrIndex)m_dwWaveHdrIndex = 0;
        InterlockedIncrement(&m_dwCount);
        while (m_dwCount >= MAX_WAVE_COUNT)WaitForSingleObject(m_hDataEvent, INFINITE);
        if (MAX_WAVE_COUNT - 1 != m_dwCount)DebugPrint("%u\n", m_dwCount);
    }
    while (m_dwCount)WaitForSingleObject(m_hDataEvent, INFINITE);
    return 0;
}
コード例 #12
0
ファイル: winmm.c プロジェクト: uberpixel/openal-soft
static void WinMMStopPlayback(ALCdevice *device)
{
    WinMMData *data = (WinMMData*)device->ExtraData;
    void *buffer = NULL;
    int i;

    if(data->killNow)
        return;

    // Set flag to stop processing headers
    data->killNow = AL_TRUE;
    althrd_join(data->thread, &i);

    // Release the wave buffers
    for(i = 0; i < 4; i++)
    {
        waveOutUnprepareHeader(data->WaveHandle.Out, &data->WaveBuffer[i], sizeof(WAVEHDR));
        if(i == 0) buffer = data->WaveBuffer[i].lpData;
        data->WaveBuffer[i].lpData = NULL;
    }
    free(buffer);
}
コード例 #13
0
ファイル: sound.cpp プロジェクト: RaymondLiao/elektronika
void NativeSoundMix::CloseNativeDevice()
{
	if ( !isOpen ) return;

	SetEvent(playEvent);	// signal the thread to quit

	EnterCritical(); // do this after we kill the timer proc to prevent a deadlock

	if ( !isOpen ) {
		LeaveCritical();
		return;	// It is possible for timeKillEvent to call CloseDevice
	}
	isOpen = false;
	
	HWAVEOUT hW = hWaveOut;
	hWaveOut = 0;	// flag that we are shutting down so PollSound will bail

	int res = waveOutReset(hW);
	FLASHASSERT(res == MMSYSERR_NOERROR);

	for ( int i = 0; i < nBuffers; i++ ) {
		int limit = 50;
		while ( limit-- ) {
			int res = waveOutUnprepareHeader(hW, waveHDR+i, sizeof(WAVEHDR));
			if ( res != WAVERR_STILLPLAYING ) {
				FLASHASSERT(res == MMSYSERR_NOERROR);
				break;
			}
			Sleep(1);
		}
	}

	res = waveOutClose(hW);
	FLASHASSERT(res == MMSYSERR_NOERROR);

	CloseHandle(playThread);
	playThread = 0;
	LeaveCritical();
}
コード例 #14
0
ファイル: gaudio_play_lld.c プロジェクト: bhdminh/uGFX
static DWORD WINAPI waveProc(LPVOID arg) {
	MSG			msg;
	WAVEHDR		*pwh;
	(void)		arg;

	while (GetMessage(&msg, 0, 0, 0)) {
		switch (msg.message) {
			case MM_WOM_DONE:
				pwh = (WAVEHDR *)msg.lParam;

				// Windows - Let go!
				waveOutUnprepareHeader(ah, pwh, sizeof(WAVEHDR));

				// Give the buffer back to the Audio Free List
				gfxSystemLock();
				gaudioPlayReleaseDataBlockI((GDataBuffer *)pwh->dwUser);
				gfxSystemUnlock();
				pwh->lpData = 0;
				nQueuedBuffers--;

				// Are we stopping?
				if (!isRunning) {
					// Have we finished yet?
					if (!nQueuedBuffers) {
						gfxSystemLock();
						gaudioPlayDoneI();
						gfxSystemUnlock();
					}
	                break;
				}

				// Try and get a new block
				senddata(pwh);
				break;
		}
	}
	return 0;
}
コード例 #15
0
ファイル: Playback.cpp プロジェクト: Kopakc/NoiseCraft
void destroyPlayback()
{
    if(_device){
        while(true){
            bool done = true;
            for(int i=0; i<BufferCount; i++){
                if(_buffers[i].isUsed){
                    done = false;
                }else{
                    if(_buffers[i].header.dwFlags & WHDR_PREPARED){
                        waveOutUnprepareHeader(_device, &_buffers[i].header, sizeof(WAVEHDR));
                    }
                }
            }
            if(done){
                break;
            }else{
                Sleep(10);
            }
        }
        waveOutClose(_device);
    }
}
コード例 #16
0
ファイル: Sound.cpp プロジェクト: wonktnodi/webrtc_port
DWORD CWaveBuffer::m_dwRelease()
{
	DWORD dwErr = MMSYSERR_NOERROR;

	if(m_hWaveOut != NULL)
	{
		if((dwErr = waveOutUnprepareHeader(m_hWaveOut, &m_header, sizeof(m_header))) == WAVERR_STILLPLAYING)
			return dwErr;

		m_hWaveOut = NULL;
	}
	
	if(m_hWaveIn != NULL)
	{
		if((dwErr = waveInUnprepareHeader(m_hWaveIn, &m_header, sizeof(m_header))) == WAVERR_STILLPLAYING)
			return dwErr;

		m_hWaveIn = NULL;
	}

	m_header.dwFlags |= WHDR_DONE;
	return MMSYSERR_NOERROR;
}
コード例 #17
0
MMRESULT CDeviceWaveIO::StopBuffers()
{
	HWAVEOUT hwo = mhandle_out;
	HWAVEIN hwi = mhandle_in;

	MMRESULT mmres = MMSYSERR_NOERROR;

	// Close device - release buffers
	for (tint32 iStructIx = 0; iStructIx < miRunningStructs; iStructIx++) {
		if (mbOutput) {
			MMRESULT mmres1 = waveOutUnprepareHeader(hwo, &mawavehdrOutput[iStructIx], sizeof(WAVEHDR));
			if (mmres == MMSYSERR_NOERROR)
				mmres = mmres1;
		}
		if (mbInput) {
			MMRESULT mmres2 = waveInUnprepareHeader(hwi, &mawavehdrInput[iStructIx], sizeof(WAVEHDR));
			if (mmres == MMSYSERR_NOERROR)
				mmres = mmres2;
		}
	}

	return mmres;
} // StopBuffers
コード例 #18
0
DWORD CAudioMgr_recv::AudioOutThreadProc(LPVOID lpParameter)
{
	CAudioMgr_recv* pMgr = (CAudioMgr_recv*)lpParameter;
	MSG msg;
	while(GetMessage(&msg,0,0,0))
	{
		switch(msg.message)
		{
		case IOM_AUDIO:
			pMgr->m_audioplay.Play((char*)msg.lParam,(int)msg.wParam);
			break;
		case WOM_DONE:
			{
				WAVEHDR* pwh=(WAVEHDR*)msg.lParam;
				waveOutUnprepareHeader((HWAVEOUT)msg.wParam,pwh,sizeof(WAVEHDR));
				delete []pwh->lpData;
				delete pwh;
			}
			break;
		}
	}
	return msg.wParam;
}
コード例 #19
0
void CAudioWave::Shutdown( void )
{
	int		i;

	/////////////////////////////////////////////////////////////////////////////////////////////
	if (hWaveOut)
	{
		waveOutReset (hWaveOut);

		if (lpWaveHdr)
		{
			for (i=0 ; i< WAV_BUFFERS ; i++)
				waveOutUnprepareHeader (hWaveOut, lpWaveHdr+i, sizeof(WAVEHDR));
		}

		waveOutClose (hWaveOut);

		if (hWaveHdr)
		{
			GlobalUnlock(hWaveHdr); 
			GlobalFree(hWaveHdr);
		}

		if (hData)
		{
			GlobalUnlock(hData);
			GlobalFree(hData);
		}

	}

	hWaveOut = 0;
	hData = 0;
	hWaveHdr = 0;
	lpData = NULL;
	lpWaveHdr = NULL;
}
コード例 #20
0
ファイル: audio_win32.c プロジェクト: Rambonuaa/BoundCheck4
static
int wait(struct buffer *buffer)
{
  MMRESULT error;

  if (!buffer->playing)
    return 0;

  switch (WaitForSingleObject(buffer->event_handle, INFINITE)) {
  case WAIT_OBJECT_0:
    break;

  case WAIT_ABANDONED:
    audio_error = _("wait abandoned");
    return -1;

  case WAIT_TIMEOUT:
    audio_error = _("wait timeout");
    return -1;

  case WAIT_FAILED:
  default:
    audio_error = _("wait failed");
    return -1;
  }

  buffer->playing = 0;

  error = waveOutUnprepareHeader(wave_handle, &buffer->wave_header,
				 sizeof(buffer->wave_header));
  if (error != MMSYSERR_NOERROR) {
    audio_error = error_text(error);
    return -1;
  }

  return 0;
}
コード例 #21
0
	int Close() {
		stopProcessing = true;
		SetEvent(hEvent);
		if (hThread != NULL) {
#ifdef ENABLE_DEBUG_OUTPUT
			std::cout << "Waiting for rendering thread to die\n";
#endif
			WaitForSingleObject(hThread, INFINITE);
			hThread = NULL;
		}
		int wResult = waveOutReset(hWaveOut);
		if (wResult != MMSYSERR_NOERROR) {
			MessageBox(NULL, L"Failed to Reset WaveOut", L"MT32", MB_OK | MB_ICONEXCLAMATION);
			return 8;
		}

		for (UINT i = 0; i < chunks; i++) {
			wResult = waveOutUnprepareHeader(hWaveOut, &WaveHdr[i], sizeof(WAVEHDR));
			if (wResult != MMSYSERR_NOERROR) {
				MessageBox(NULL, L"Failed to Unprepare Wave Header", L"MT32", MB_OK | MB_ICONEXCLAMATION);
				return 8;
			}
		}
		delete[] WaveHdr;
		WaveHdr = NULL;

		wResult = waveOutClose(hWaveOut);
		if (wResult != MMSYSERR_NOERROR) {
			MessageBox(NULL, L"Failed to Close WaveOut", L"MT32", MB_OK | MB_ICONEXCLAMATION);
			return 8;
		}
		if (hEvent != NULL) {
			CloseHandle(hEvent);
			hEvent = NULL;
		}
		return 0;
	}
コード例 #22
0
ファイル: Audio.cpp プロジェクト: cugxiangzhenwei/TSP_Zhenwei
CAudio::~CAudio()
{
	if (m_bIsWaveInUsed)
	{
	//	waveInStop(m_hWaveIn);
		waveInReset(m_hWaveIn);

		for (int i = 0; i < AUDIOCAPBUF_NUM; i++)
			waveInUnprepareHeader(m_hWaveIn, m_lpInAudioHdr[i], sizeof(WAVEHDR));

		waveInClose(m_hWaveIn);
		TerminateThread(m_hThreadCallBack, -1);
	}

	if (m_bIsWaveOutUsed)
	{
		waveOutReset(m_hWaveOut);
		for (int i = 0; i < AUDIOCAPBUF_NUM; i++)
			waveOutUnprepareHeader(m_hWaveOut, m_lpInAudioHdr[i], sizeof(WAVEHDR));

		waveOutClose(m_hWaveOut);
	}		

	for (int i = 0; i < AUDIOCAPBUF_NUM; i++)
	{
		delete [] m_lpInAudioData[i];
		delete m_lpInAudioHdr[i];
		
		delete [] m_lpOutAudioData[i];
		delete m_lpOutAudioHdr[i];
	}

	CloseHandle(m_hEventWaveIn);
	CloseHandle(m_hStartRecord);
	CloseHandle(m_hThreadCallBack);
}
コード例 #23
0
ファイル: winmm_output_plugin.c プロジェクト: GunioRobot/mpd
/**
 * Wait until the buffer is finished.
 */
static bool
winmm_drain_buffer(struct winmm_output *wo, struct winmm_buffer *buffer,
		   GError **error_r)
{
	if ((buffer->hdr.dwFlags & WHDR_DONE) == WHDR_DONE)
		/* already finished */
		return true;

	while (true) {
		MMRESULT result = waveOutUnprepareHeader(wo->handle,
							 &buffer->hdr,
							 sizeof(buffer->hdr));
		if (result == MMSYSERR_NOERROR)
			return true;
		else if (result != WAVERR_STILLPLAYING) {
			g_set_error(error_r, winmm_output_quark(), result,
				    "waveOutUnprepareHeader() failed");
			return false;
		}

		/* wait some more */
		WaitForSingleObject(wo->event, INFINITE);
	}
}
コード例 #24
0
ファイル: win32ao.c プロジェクト: BackupTheBerlios/nautilus
/**
 * win32ao_close()
 * Terminate playback.
 * This function blocks until all data that was written has been played.
 * Return 0 if happy, -1 if error.
 */
int win32ao_close(void) {
	MMRESULT res;
	int i;

	// commit possible partially filled buffer
	if (commit(whoutBufNo))
		return -1;

	// unpause (no-op if already unpaused)
	res = waveOutRestart(waveout);
	if (checkWaveOutResult(waveout, res, "waveOutRestart"))
		return -1;

	// wait for buffers to finish and unprepare them all
	for (i = 0; i < whoutBufCnt; ++i) {
		while ((whout[i]->dwFlags & WHDR_INQUEUE) != 0) {
			// buffer not ready, wait, try again
			WaitForSingleObject(whoutEvent, INFINITE);
		}
		// unprepare the buffer
		res = waveOutUnprepareHeader(waveout, whout[i], sizeof(WAVEHDR));
		if (checkWaveOutResult(waveout, res, "waveOutUnprepareHeader"))
			return -1;
		// free memory
		free(whout[i]->lpData);
		free(whout[i]);
	}
	free(whout);

	// close 
	res = waveOutClose(waveout);
	if (checkWaveOutResult(waveout, res, "waveOutClose"))
		return -1;
			
	return 0;
}
コード例 #25
0
void CSoundPlayer::Close()
{
	if (NULL != soundObj.pWaveHdr && soundObj.initWaveHdr == 0x01)
	{
		MMRESULT	mmhr;
		for( unsigned int i=0; i<soundObj.waveHdrNum; i++ ) 
		{
			//if (soundObj.pWaveHdr[i].dwBufferLength < 1)		continue;

			soundObj.pWaveHdr[i].dwFlags = 0;
			mmhr = waveOutUnprepareHeader( soundObj.hWaveOut, &soundObj.pWaveHdr[i], sizeof(WAVEHDR) );
			soundObj.pWaveHdr[i].dwBufferLength = 0;
		}
	}
	soundObj.initWaveHdr = 0x00;

	if (NULL != soundObj.hWaveOut)
	{
		waveOutClose(soundObj.hWaveOut);
		soundObj.hWaveOut = NULL;
	}
	//if( soundObj.hNotify ) CloseHandle( soundObj.hNotify );
	//soundObj.hNotify = NULL;
}
コード例 #26
0
ファイル: sndmng.cpp プロジェクト: mbanquiero/games
void CSoundManager::Streaming()
{
	// revisa si hay bloques pendientes que se terminaron: 
	for(int i=0;i<cant_bloques;++i)
	{
		if(waveOutUnprepareHeader(hWaveOut, bloques_pendientes[i], sizeof(WAVEHDR))
			!=WAVERR_STILLPLAYING)
		{
			// ya termino de procesarse, (o dio un error, sea como sea: )
			// libero la memoria
			delete bloques_pendientes[i]->lpData;
			delete bloques_pendientes[i];
			// marco el bloque para borrar
			bloques_pendientes[i] = NULL;
		}
	}

	int ant_cant = cant_bloques;
	// pack de bloques
	cant_bloques = 0;
	for(i=0;i<ant_cant;++i)
		if(bloques_pendientes[i]!=NULL)
			bloques_pendientes[cant_bloques++] = bloques_pendientes[i];
}
コード例 #27
0
ファイル: wave.cpp プロジェクト: milot-mirdita/PocketGnuBoy
void pcm_close()
{
        if (wout) {
                waveOutReset(wout);
                for (int i = 0; i < buffers; i++)
                        waveOutUnprepareHeader(wout, &hdr[i], sizeof WAVEHDR);
                waveOutClose(wout);
                wout = 0;
        }

        if (buf) {
                free(buf);
                buf = 0;
        }
        if (hdr) {
                free(hdr);
                hdr = 0;
        }
        if (semaph) {
                CloseHandle(semaph);
                semaph = 0;
        }
        memset(&pcm, 0, sizeof pcm);
}
コード例 #28
0
static gboolean
gst_waveform_sink_unprepare (GstAudioSink * asink)
{
  GstWaveFormSink *wfsink = GST_WAVEFORM_SINK (asink);

  /* free wave buffers */
  if (wfsink->wave_buffers) {
    guint index;

    for (index = 0; index < wfsink->buffer_count; index++) {
      if (wfsink->wave_buffers[index].dwFlags & WHDR_PREPARED) {
        MMRESULT mmresult =
            waveOutUnprepareHeader (wfsink->hwaveout,
            &wfsink->wave_buffers[index], sizeof (WAVEHDR));
        if (mmresult != MMSYSERR_NOERROR) {
          waveOutGetErrorText (mmresult, wfsink->error_string,
              ERROR_LENGTH - 1);
          GST_CAT_WARNING_OBJECT (waveformsink_debug, wfsink,
              "gst_waveform_sink_unprepare: Error unpreparing buffer => %s",
              wfsink->error_string);
        }
      }
      g_free (wfsink->wave_buffers[index].lpData);
    }
    g_free (wfsink->wave_buffers);
    wfsink->wave_buffers = NULL;
  }

  /* close waveform-audio output device */
  if (wfsink->hwaveout) {
    waveOutClose (wfsink->hwaveout);
    wfsink->hwaveout = NULL;
  }

  return TRUE;
}
コード例 #29
0
void playWaveSingleTime()
{

    WAVEHDR whdr;
    MMRESULT  result;
    whdr.lpData = pWave;
    whdr.dwBufferLength = waveBufferLength;
    whdr.dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP;
    whdr.dwLoops=1;
    result = waveOutPrepareHeader(hWaveOut,&whdr,sizeof(WAVEHDR));
    if(MMSYSERR_NOERROR !=result)
    {
        printf_s("Error:waveOutPrepareHeader! ErrorCode:%x",result);
        goto freeandend;
    }
    result = waveOutWrite(hWaveOut,&whdr,sizeof(WAVEHDR));
    if(MMSYSERR_NOERROR !=result)
    {
        printf_s("Error:waveOutWrite! ErrorCode:%x",result);
        goto freeandend;
    }
    Sleep(waveLengthSecond*500);
freeandend:
    result = waveOutReset(hWaveOut);
    if(MMSYSERR_NOERROR !=result)
    {
        printf_s("Error:waveOutReset! ErrorCode:%x",result);
    }
    result = waveOutUnprepareHeader(hWaveOut,&whdr,sizeof(WAVEHDR));
    if(MMSYSERR_NOERROR !=result)
    {
        printf_s("Error:waveOutUnprepareHeader! ErrorCode:%x",result);
    }
    free(pWave);
    pWave = NULL;
}
コード例 #30
0
ファイル: WinSound.cpp プロジェクト: Clever-Boy/batterytech
void WinSound::fillNextBuffer(void) {
	if (isStarted) {
		isFilling = TRUE;
		// check if the buffer is already prepared (should not !)
		if (waveHeader[currentBuffer].dwFlags & WHDR_PREPARED)
			waveOutUnprepareHeader(waveOut, &waveHeader[currentBuffer],
					sizeof(WAVEHDR));
		// Call the user function to fill the buffer
		if (userCallback) {
			userCallback(soundBuffer[currentBuffer], bufferSize);
		}
		// Prepare the buffer to be sent to the WaveOut API
		waveHeader[currentBuffer].lpData = (char*) soundBuffer[currentBuffer];
		waveHeader[currentBuffer].dwBufferLength = bufferSize;
		waveOutPrepareHeader(waveOut, &waveHeader[currentBuffer], sizeof(WAVEHDR));
		// Send the buffer the the WaveOut queue
		waveOutWrite(waveOut, &waveHeader[currentBuffer], sizeof(WAVEHDR));
		currentBuffer++;
		if (currentBuffer >= WINSOUND_BUFFERCOUNT) {
			currentBuffer = 0;
		}
		isFilling = FALSE;
	}
}