static UINT32 play_to_completion(IXAudio2SourceVoice *src, UINT32 max_samples) { XAUDIO2_VOICE_STATE state; HRESULT hr; nloopends = 0; hr = IXAudio2SourceVoice_Start(src, 0, XAUDIO2_COMMIT_NOW); ok(hr == S_OK, "Start failed: %08x\n", hr); while(1){ if(xaudio27) IXAudio27SourceVoice_GetState((IXAudio27SourceVoice*)src, &state); else IXAudio2SourceVoice_GetState(src, &state, 0); if(state.BuffersQueued == 0) break; if(state.SamplesPlayed >= max_samples){ if(xaudio27) IXAudio27SourceVoice_ExitLoop((IXAudio27SourceVoice*)src, XAUDIO2_COMMIT_NOW); else IXAudio2SourceVoice_ExitLoop(src, XAUDIO2_COMMIT_NOW); } Sleep(100); } hr = IXAudio2SourceVoice_Stop(src, 0, XAUDIO2_COMMIT_NOW); ok(hr == S_OK, "Start failed: %08x\n", hr); return state.SamplesPlayed; }
static void XAUDIO2_CloseDevice(_THIS) { if (this->hidden != NULL) { IXAudio2 *ixa2 = this->hidden->ixa2; IXAudio2SourceVoice *source = this->hidden->source; IXAudio2MasteringVoice *mastering = this->hidden->mastering; if (source != NULL) { IXAudio2SourceVoice_Stop(source, 0, XAUDIO2_COMMIT_NOW); IXAudio2SourceVoice_FlushSourceBuffers(source); IXAudio2SourceVoice_DestroyVoice(source); } if (ixa2 != NULL) { IXAudio2_StopEngine(ixa2); } if (mastering != NULL) { IXAudio2MasteringVoice_DestroyVoice(mastering); } if (ixa2 != NULL) { IXAudio2_Release(ixa2); } SDL_free(this->hidden->mixbuf); if (this->hidden->semaphore != NULL) { SDL_DestroySemaphore(this->hidden->semaphore); } SDL_free(this->hidden); this->hidden = NULL; } }
gc_result gaX_device_close_xaudio2(ga_DeviceImpl_XAudio2* in_device) { gc_int32 i; if(in_device->source) { IXAudio2SourceVoice_Stop(in_device->source, 0, XAUDIO2_COMMIT_NOW); IXAudio2SourceVoice_FlushSourceBuffers(in_device->source); IXAudio2SourceVoice_DestroyVoice(in_device->source); } if(in_device->xa) IXAudio2_StopEngine(in_device->xa); if(in_device->master) IXAudio2MasteringVoice_DestroyVoice(in_device->master); if(in_device->xa) IXAudio2_Release(in_device->xa); CoUninitialize(); for(i = 0; i < in_device->numBuffers; ++i) gcX_ops->freeFunc(in_device->buffers[i]); gcX_ops->freeFunc(in_device->buffers); in_device->devType = GA_DEVICE_TYPE_UNKNOWN; in_device->source = 0; in_device->master = 0; in_device->xa = 0; gcX_ops->freeFunc(in_device); return GC_SUCCESS; }
static void xaudio2_free(xaudio2_t *handle) { if (!handle) return; if (handle->pSourceVoice) { IXAudio2SourceVoice_Stop(handle->pSourceVoice, 0, XAUDIO2_COMMIT_NOW); IXAudio2SourceVoice_DestroyVoice(handle->pSourceVoice); } if (handle->pMasterVoice) { IXAudio2MasteringVoice_DestroyVoice(handle->pMasterVoice); } if (handle->pXAudio2) { IXAudio2_Release(handle->pXAudio2); } if (handle->hEvent) CloseHandle(handle->hEvent); free(handle->buf); #if defined(__cplusplus) && !defined(CINTERFACE) delete handle; #else free(handle); #endif }
void snd_stop(void) { xaudio2.opened = FALSE; if (xaudio2.source) { IXAudio2SourceVoice_Stop(xaudio2.source, 0, XAUDIO2_COMMIT_NOW); IXAudio2SourceVoice_FlushSourceBuffers(xaudio2.source); IXAudio2SourceVoice_DestroyVoice(xaudio2.source); xaudio2.source = NULL; } if (xaudio2.engine) { IXAudio2_StopEngine(xaudio2.engine); } if (xaudio2.master) { IXAudio2MasteringVoice_DestroyVoice(xaudio2.master); xaudio2.master = NULL; } if (xaudio2.engine) { IXAudio2_Release(xaudio2.engine); xaudio2.engine = NULL; } if (snd.cache) { if (SNDCACHE->start) { free(SNDCACHE->start); } if (SNDCACHE->silence) { free(SNDCACHE->silence); } if (xaudio2.semaphore) { CloseHandle(xaudio2.semaphore); xaudio2.semaphore = NULL; } snd.cache = NULL; } if (audio_channels_quit) { audio_channels_quit(); } if (audio_quality_quit) { audio_quality_quit(); } }
void xaudio2_free(xaudio2_t *handle) { if (handle) { if (handle->pSourceVoice) { IXAudio2SourceVoice_Stop(handle->pSourceVoice, 0, XAUDIO2_COMMIT_NOW); IXAudio2SourceVoice_DestroyVoice(handle->pSourceVoice); } if (handle->pMasterVoice) IXAudio2MasteringVoice_DestroyVoice(handle->pMasterVoice); if (handle->pXAudio2) IXAudio2_Release(handle->pXAudio2); if (handle->hEvent) CloseHandle(handle->hEvent); free(handle->buf); free(handle); } }
static void XAudio2_Exit(void) { if (UpdateBufferHandle != NULL) { /* signal thread to exit and wait for the exit */ if (threadInUse) { threadInUse = 0; MUTEX_UNLOCK(vars); SetEvent(hBufferEvent); WaitForSingleObject(UpdateBufferHandle, INFINITE); MUTEX_LOCK(vars); } CloseHandle(UpdateBufferHandle); UpdateBufferHandle = NULL; } IXAudio2SourceVoice_Stop(pSourceVoice, 0, 0); if (pSourceVoice) { IXAudio2SourceVoice_DestroyVoice(pSourceVoice); pSourceVoice = NULL; } if (pMasterVoice) { IXAudio2MasteringVoice_DestroyVoice(pMasterVoice); pMasterVoice = NULL; } if (pXAudio2) { IXAudio2_Release(pXAudio2); pXAudio2 = NULL; } #ifndef __cplusplus if (hBufferEvent != NULL) { CloseHandle(hBufferEvent); hBufferEvent = NULL; } #endif #ifndef _XBOX CoUninitialize(); #endif VC_Exit(); }
ga_DeviceImpl_XAudio2* gaX_device_open_xaudio2(gc_int32 in_numBuffers, gc_int32 in_numSamples, ga_Format* in_format) { ga_DeviceImpl_XAudio2* ret = gcX_ops->allocFunc(sizeof(ga_DeviceImpl_XAudio2)); HRESULT result; WAVEFORMATEX fmt; gc_int32 i; ret->devType = GA_DEVICE_TYPE_XAUDIO2; ret->numBuffers = in_numBuffers; ret->numSamples = in_numSamples; memcpy(&ret->format, in_format, sizeof(ga_Format)); ret->sampleSize = ga_format_sampleSize(in_format); ret->nextBuffer = 0; ret->xa = 0; ret->master = 0; CoInitializeEx(NULL, COINIT_MULTITHREADED); result = XAudio2Create(&ret->xa, 0, XAUDIO2_DEFAULT_PROCESSOR); if(FAILED(result)) goto cleanup; result = IXAudio2_CreateMasteringVoice(ret->xa, &ret->master, 2, 44100, 0, 0, 0); if(FAILED(result)) goto cleanup; fmt.cbSize = sizeof(WAVEFORMATEX); ZeroMemory(&fmt, sizeof(WAVEFORMATEX)); fmt.cbSize = sizeof(WAVEFORMATEX); fmt.wFormatTag = WAVE_FORMAT_PCM; fmt.nChannels = 2; fmt.wBitsPerSample = 16; fmt.nSamplesPerSec = 44100; fmt.nBlockAlign = fmt.nChannels * (fmt.wBitsPerSample / 8); fmt.nAvgBytesPerSec = fmt.nSamplesPerSec * fmt.nBlockAlign; result = IXAudio2_CreateSourceVoice(ret->xa, &ret->source, &fmt, XAUDIO2_VOICE_NOPITCH, XAUDIO2_DEFAULT_FREQ_RATIO, 0, 0, 0); if(FAILED(result)) goto cleanup; result =IXAudio2_StartEngine(ret->xa); if(FAILED(result)) goto cleanup; result = IXAudio2SourceVoice_Start(ret->source, 0, XAUDIO2_COMMIT_NOW); if(FAILED(result)) goto cleanup; ret->buffers = gcX_ops->allocFunc(ret->numBuffers * sizeof(void*)); for(i = 0; i < ret->numBuffers; ++i) ret->buffers[i] = gcX_ops->allocFunc(ret->numSamples * ret->sampleSize); return ret; cleanup: if(ret->source) { IXAudio2SourceVoice_Stop(ret->source, 0, XAUDIO2_COMMIT_NOW); IXAudio2SourceVoice_FlushSourceBuffers(ret->source); IXAudio2SourceVoice_DestroyVoice(ret->source); } if(ret->xa) IXAudio2_StopEngine(ret->xa); if(ret->master) IXAudio2MasteringVoice_DestroyVoice(ret->master); if(ret->xa) IXAudio2_Release(ret->xa); CoUninitialize(); gcX_ops->freeFunc(ret); return 0; }
static void XAudio2_PlayStop(void) { do_update = 0; if (pSourceVoice) IXAudio2SourceVoice_Stop(pSourceVoice, 0, 0); VC_PlayStop(); }