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; }
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(); } }
static void XAUDIO2_PlayDevice(_THIS) { XAUDIO2_BUFFER buffer; Uint8 *mixbuf = this->hidden->mixbuf; Uint8 *nextbuf = this->hidden->nextbuf; const int mixlen = this->hidden->mixlen; IXAudio2SourceVoice *source = this->hidden->source; HRESULT result = S_OK; if (!this->enabled) { /* shutting down? */ return; } /* Submit the next filled buffer */ SDL_zero(buffer); buffer.AudioBytes = mixlen; buffer.pAudioData = nextbuf; buffer.pContext = this; if (nextbuf == mixbuf) { nextbuf += mixlen; } else { nextbuf = mixbuf; } this->hidden->nextbuf = nextbuf; result = IXAudio2SourceVoice_SubmitSourceBuffer(source, &buffer, NULL); if (result == XAUDIO2_E_DEVICE_INVALIDATED) { /* !!! FIXME: possibly disconnected or temporary lost. Recover? */ } if (result != S_OK) { /* uhoh, panic! */ IXAudio2SourceVoice_FlushSourceBuffers(source); SDL_OpenedAudioDeviceDisconnected(this); } }
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; }