forked from MoonsideGames/FAudioGMS
				
			sketching out initial implementation
							parent
							
								
									0c206ed427
								
							
						
					
					
						commit
						15edf9bf8a
					
				|  | @ -0,0 +1,3 @@ | |||
| .vscode | ||||
| .vs | ||||
| visualc/x64 | ||||
|  | @ -0,0 +1,3 @@ | |||
| [submodule "FAudio"] | ||||
| 	path = lib/FAudio | ||||
| 	url = https://github.com/FNA-XNA/FAudio | ||||
|  | @ -0,0 +1 @@ | |||
| Subproject commit 28528bc885581bad58050517d78848cb206b2aa3 | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										396
									
								
								src/FAudioGMS.c
								
								
								
								
							
							
						
						
									
										396
									
								
								src/FAudioGMS.c
								
								
								
								
							|  | @ -25,13 +25,409 @@ | |||
|  */ | ||||
| 
 | ||||
| #include "FAudioGMS.h" | ||||
| #include "../lib/FAudio/include/FAPOBase.h" | ||||
| #include "../lib/FAudio/include/FAudioFX.h" | ||||
| #include "../lib/FAudio/include/F3DAudio.h" | ||||
| #include "../lib/FAudio/include/FAudio.h" | ||||
| 
 | ||||
| #define DR_WAV_IMPLEMENTATION | ||||
| #include "../lib/dr_wav.h" | ||||
| 
 | ||||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| 
 | ||||
| static inline void Log(char *string) | ||||
| { | ||||
|     printf("%s", string); | ||||
|     fflush(stdout); | ||||
| } | ||||
| 
 | ||||
| typedef enum FAudioGMS_SoundState | ||||
| { | ||||
|     SoundState_Playing, | ||||
|     SoundState_Paused, | ||||
|     SoundState_Stopped | ||||
| } FAudioGMS_SoundState; | ||||
| 
 | ||||
| typedef struct FAudioGMS_StaticSound | ||||
| { | ||||
|     uint32_t id; | ||||
|     FAudioBuffer buffer; | ||||
|     uint32_t channels; | ||||
|     uint32_t samplesPerSecond; | ||||
|     uint32_t loopStart; | ||||
|     uint32_t loopLength; | ||||
| } FAudioGMS_StaticSound; | ||||
| 
 | ||||
| typedef struct FAudioGMS_SoundInstance | ||||
| { | ||||
|     uint32_t id; | ||||
|     FAudioSourceVoice *handle; | ||||
|     FAudioWaveFormatEx format; | ||||
|     uint8_t loop; /* bool */ | ||||
|     FAudioGMS_SoundState soundState; | ||||
|     F3DAUDIO_DSP_SETTINGS dspSettings; | ||||
| 
 | ||||
|     float pan; | ||||
|     float pitch; | ||||
|     float volume; | ||||
|     float reverb; | ||||
|     float lowPassFilter; | ||||
|     float highPassFilter; | ||||
|     float bandPassFilter; | ||||
| } FAudioGMS_SoundInstance; | ||||
| 
 | ||||
| typedef struct FAudioGMS_Device | ||||
| { | ||||
|     FAudio* handle; | ||||
|     FAudioDeviceDetails deviceDetails; | ||||
|     FAudioMasteringVoice *masteringVoice; | ||||
|     FAudioSubmixVoice *reverbVoice; | ||||
|     FAudioVoiceSends reverbSends; | ||||
| 
 | ||||
|     FAudioGMS_StaticSound **staticSounds; | ||||
|     uint32_t staticSoundCount; | ||||
| 
 | ||||
|     FAudioGMS_SoundInstance **staticSoundInstances; | ||||
|     uint32_t staticSoundInstanceCount; | ||||
| } FAudioGMS_Device; | ||||
| 
 | ||||
| static FAudioGMS_Device *device = NULL; | ||||
| 
 | ||||
| void FAudioGMS_Init() | ||||
| { | ||||
|     device = malloc(sizeof(FAudioGMS_Device)); | ||||
| 
 | ||||
|     uint32_t result = FAudioCreate(&device->handle, 0, FAUDIO_DEFAULT_PROCESSOR); | ||||
| 
 | ||||
|     if (result != 0) | ||||
|     { | ||||
|         Log("Failed to create device! Bailing!"); | ||||
|         free(device); | ||||
|         device = NULL; | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     /* Find a suitable device */ | ||||
| 
 | ||||
|     uint32_t deviceCount; | ||||
|     FAudio_GetDeviceCount(device->handle, &deviceCount); | ||||
| 
 | ||||
|     if (deviceCount == 0) | ||||
|     { | ||||
|         Log("No audio devices found! Bailing!"); | ||||
|         FAudio_Release(device->handle); | ||||
|         free(device); | ||||
|         device = NULL; | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     FAudioDeviceDetails deviceDetails; | ||||
| 
 | ||||
|     uint32_t i = 0; | ||||
|     for (i = 0; i < deviceCount; i += 1) | ||||
|     { | ||||
|         FAudio_GetDeviceDetails( | ||||
|             device->handle, | ||||
|             i, | ||||
|             &deviceDetails); | ||||
| 
 | ||||
|         if ((deviceDetails.Role & FAudioDefaultGameDevice) == FAudioDefaultGameDevice) | ||||
|         { | ||||
|             device->deviceDetails = deviceDetails; | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (i == deviceCount) | ||||
|     { | ||||
|         i = 0; /* whatever we'll just use the first one i guess */ | ||||
|         FAudio_GetDeviceDetails( | ||||
|             device->handle, | ||||
|             i, | ||||
|             &deviceDetails); | ||||
| 
 | ||||
|         device->deviceDetails = deviceDetails; | ||||
|     } | ||||
| 
 | ||||
|     if (FAudio_CreateMasteringVoice( | ||||
|         device->handle, | ||||
|         &device->masteringVoice, | ||||
|         FAUDIO_DEFAULT_CHANNELS, | ||||
|         FAUDIO_DEFAULT_SAMPLERATE, | ||||
|         0, | ||||
|         i, | ||||
|         NULL | ||||
|     ) != 0) | ||||
|     { | ||||
|         Log("No mastering voice found! Bailing!"); | ||||
|         FAudio_Release(device->handle); | ||||
|         free(device); | ||||
|         device = NULL; | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     /* Init reverb */ | ||||
| 
 | ||||
|     FAPO *reverb = malloc(sizeof(FAPO)); | ||||
| 
 | ||||
|     FAudioCreateReverb(&reverb, 0); | ||||
| 
 | ||||
|     FAudioEffectChain *reverbChain = malloc(sizeof(FAudioEffectChain)); | ||||
| 
 | ||||
|     reverbChain->EffectCount = 1; | ||||
|     reverbChain->pEffectDescriptors = malloc(sizeof(FAudioEffectDescriptor)); | ||||
| 
 | ||||
|     FAudioEffectDescriptor *reverbDescriptor = reverbChain->pEffectDescriptors; | ||||
| 
 | ||||
|     reverbDescriptor->InitialState = 1; | ||||
|     reverbDescriptor->OutputChannels = device->deviceDetails.OutputFormat.Format.nChannels == 6 ? 6 : 1; | ||||
|     reverbDescriptor->pEffect = reverb; | ||||
| 
 | ||||
|     FAudio_CreateSubmixVoice( | ||||
|         device->handle, | ||||
|         &device->reverbVoice, | ||||
|         1, /* omnidirectional reverb */ | ||||
|         device->deviceDetails.OutputFormat.Format.nSamplesPerSec, | ||||
|         0, | ||||
|         0, | ||||
|         NULL, | ||||
|         reverbChain); | ||||
| 
 | ||||
|     FAPOBase_Release((FAPOBase*)reverb); | ||||
|     free(reverb); | ||||
|     free(reverbChain->pEffectDescriptors); | ||||
|     free(reverbChain); | ||||
| 
 | ||||
|     FAudioFXReverbParameters *reverbParams = malloc(sizeof(FAudioFXReverbParameters)); | ||||
| 
 | ||||
|     reverbParams->WetDryMix = 100.0f; | ||||
|     reverbParams->ReflectionsDelay = 7; | ||||
|     reverbParams->ReverbDelay = 11; | ||||
|     reverbParams->RearDelay = FAUDIOFX_REVERB_DEFAULT_REAR_DELAY; | ||||
|     reverbParams->PositionLeft = FAUDIOFX_REVERB_DEFAULT_POSITION; | ||||
|     reverbParams->PositionRight = FAUDIOFX_REVERB_DEFAULT_POSITION; | ||||
|     reverbParams->PositionMatrixLeft = FAUDIOFX_REVERB_DEFAULT_POSITION_MATRIX; | ||||
|     reverbParams->PositionMatrixRight = FAUDIOFX_REVERB_DEFAULT_POSITION_MATRIX; | ||||
|     reverbParams->EarlyDiffusion = 15; | ||||
|     reverbParams->LateDiffusion = 15; | ||||
|     reverbParams->LowEQGain = 8; | ||||
|     reverbParams->LowEQCutoff = 4; | ||||
|     reverbParams->HighEQGain = 8; | ||||
|     reverbParams->HighEQCutoff = 6; | ||||
|     reverbParams->RoomFilterFreq = 5000.0f; | ||||
|     reverbParams->RoomFilterMain = -10.0f; | ||||
|     reverbParams->RoomFilterHF = -1.0f; | ||||
|     reverbParams->ReflectionsGain = -26.0200005f; | ||||
|     reverbParams->ReverbGain = 10.0f; | ||||
|     reverbParams->DecayTime = 1.49000001f; | ||||
|     reverbParams->Density = 100.0f; | ||||
|     reverbParams->RoomSize = FAUDIOFX_REVERB_DEFAULT_ROOM_SIZE; | ||||
| 
 | ||||
|     FAudioVoice_SetEffectParameters( | ||||
|         device->reverbVoice, | ||||
|         0, | ||||
|         reverbParams, | ||||
|         sizeof(FAudioFXReverbParameters), | ||||
|         0); | ||||
| 
 | ||||
|     free(reverbParams); | ||||
| 
 | ||||
|     /* Init reverb sends */ | ||||
| 
 | ||||
|     device->reverbSends.SendCount = 2; | ||||
|     device->reverbSends.pSends = malloc(2 * sizeof(FAudioSendDescriptor)); | ||||
| 
 | ||||
|     device->reverbSends.pSends[0].Flags = 0; | ||||
|     device->reverbSends.pSends[0].pOutputVoice = device->masteringVoice; | ||||
|     device->reverbSends.pSends[1].Flags = 0; | ||||
|     device->reverbSends.pSends[1].pOutputVoice = device->reverbVoice; | ||||
| 
 | ||||
|     device->staticSounds = NULL; | ||||
|     device->staticSoundCount = 0; | ||||
| 
 | ||||
|     Log("FAudio initialized successfully!"); | ||||
| } | ||||
| 
 | ||||
| void FAudioGMS_Update() | ||||
| { | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| /* Taken from https://github.com/FNA-XNA/FNA/blob/master/src/Audio/SoundEffectInstance.cs */ | ||||
| static void SetPanMatrixCoefficients(FAudioGMS_SoundInstance *instance) | ||||
| { | ||||
|     /* Two major things to notice:
 | ||||
|     * 1. The spec assumes any speaker count >= 2 has Front Left/Right. | ||||
|     * 2. Stereo panning is WAY more complicated than you think. | ||||
|     *    The main thing is that hard panning does NOT eliminate an | ||||
|     *    entire channel; the two channels are blended on each side. | ||||
|     * -flibit | ||||
|     */ | ||||
| 
 | ||||
|     float* outputMatrix = (float*) instance->dspSettings.pMatrixCoefficients; | ||||
|     if (instance->dspSettings.SrcChannelCount == 1) | ||||
|     { | ||||
|         if (instance->dspSettings.DstChannelCount == 1) | ||||
|         { | ||||
|             outputMatrix[0] = 1.0f; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             outputMatrix[0] = (instance->pan > 0.0f) ? (1.0f - instance->pan) : 1.0f; | ||||
|             outputMatrix[1] = (instance->pan < 0.0f) ? (1.0f  + instance->pan) : 1.0f; | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         if (instance->dspSettings.DstChannelCount == 1) | ||||
|         { | ||||
|             outputMatrix[0] = 1.0f; | ||||
|             outputMatrix[1] = 1.0f; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             if (instance->pan <= 0.0f) | ||||
|             { | ||||
|                 // Left speaker blends left/right channels
 | ||||
|                 outputMatrix[0] = 0.5f * instance->pan + 1.0f; | ||||
|                 outputMatrix[1] = 0.5f * -instance->pan; | ||||
|                 // Right speaker gets less of the right channel
 | ||||
|                 outputMatrix[2] = 0.0f; | ||||
|                 outputMatrix[3] = instance->pan + 1.0f; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 // Left speaker gets less of the left channel
 | ||||
|                 outputMatrix[0] = -instance->pan + 1.0f; | ||||
|                 outputMatrix[1] = 0.0f; | ||||
|                 // Right speaker blends right/left channels
 | ||||
|                 outputMatrix[2] = 0.5f * instance->pan; | ||||
|                 outputMatrix[3] = 0.5f * -instance->pan + 1.0f; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| double FAudioGMS_StaticSound_LoadWAV(char *filePath) | ||||
| { | ||||
|     drwav_uint64 frameCount; | ||||
| 
 | ||||
|     FAudioGMS_StaticSound *sound = malloc(sizeof(FAudioGMS_StaticSound)); | ||||
|     float *pSampleData = drwav_open_file_and_read_pcm_frames_f32(filePath, &sound->channels, &sound->samplesPerSecond, &frameCount, NULL); | ||||
|     if (pSampleData == NULL) | ||||
|     { | ||||
|         Log("Error opening WAV file: "); | ||||
|         Log(filePath); | ||||
|     } | ||||
| 
 | ||||
|     sound->buffer.AudioBytes = (uint32_t)(frameCount * sizeof(float)); | ||||
|     sound->buffer.Flags = FAUDIO_END_OF_STREAM; | ||||
|     sound->buffer.LoopBegin = 0; | ||||
|     sound->buffer.LoopCount = 0; | ||||
|     sound->buffer.LoopLength = 0; | ||||
|     sound->buffer.pAudioData = (uint8_t*) pSampleData; | ||||
|     sound->buffer.pContext = NULL; | ||||
|     sound->buffer.PlayBegin = 0; | ||||
|     sound->buffer.PlayLength = 0; | ||||
| 
 | ||||
|     sound->loopStart = 0; | ||||
|     sound->loopLength = 0; | ||||
| 
 | ||||
|     /* FIXME: id re-use system */ | ||||
|     sound->id = device->staticSoundCount; | ||||
| 
 | ||||
|     device->staticSounds = realloc(device->staticSounds, (device->staticSoundCount + 1) * sizeof(FAudioGMS_StaticSound*)); | ||||
|     device->staticSounds[device->staticSoundCount] = sound; | ||||
|     device->staticSoundCount += 1; | ||||
| 
 | ||||
|     return (double)sound->id; | ||||
| } | ||||
| 
 | ||||
| double FAudioGMS_SoundInstance_CreateFromStaticSound(double id) | ||||
| { | ||||
|     FAudioGMS_StaticSound *staticSound = device->staticSounds[(uint32_t)id]; | ||||
|     FAudioGMS_SoundInstance *instance = malloc(sizeof(FAudioGMS_SoundInstance)); | ||||
| 
 | ||||
|     instance->handle = NULL; | ||||
|     instance->format.wFormatTag = 3; | ||||
|     instance->format.wBitsPerSample = 32; | ||||
|     instance->format.nChannels = staticSound->channels; | ||||
|     instance->format.nBlockAlign = (uint16_t)(4 * staticSound->channels); | ||||
|     instance->format.nSamplesPerSec = staticSound->samplesPerSecond; | ||||
|     instance->format.nAvgBytesPerSec = instance->format.nBlockAlign * staticSound->samplesPerSecond; | ||||
| 
 | ||||
|     FAudio_CreateSourceVoice( | ||||
|         device->handle, | ||||
|         &instance->handle, | ||||
|         &instance->format, | ||||
|         FAUDIO_VOICE_USEFILTER, | ||||
|         FAUDIO_DEFAULT_FREQ_RATIO, | ||||
|         NULL, | ||||
|         NULL, | ||||
|         NULL); | ||||
| 
 | ||||
|     if (instance->handle == NULL) | ||||
|     { | ||||
|         Log("SoundInstance failed to initialize!"); | ||||
|         free(instance); | ||||
|         return -1; | ||||
|     } | ||||
| 
 | ||||
|     instance->dspSettings.DopplerFactor = 1.0f; | ||||
|     instance->dspSettings.SrcChannelCount = staticSound->channels; | ||||
|     instance->dspSettings.DstChannelCount = device->deviceDetails.OutputFormat.Format.nChannels; | ||||
| 
 | ||||
|     uint32_t memsize = 4 * instance->dspSettings.SrcChannelCount * instance->dspSettings.DstChannelCount; | ||||
|     instance->dspSettings.pMatrixCoefficients = malloc(memsize); | ||||
|     memset(instance->dspSettings.pMatrixCoefficients, 0, memsize); | ||||
| 
 | ||||
|     SetPanMatrixCoefficients(instance); | ||||
| 
 | ||||
|     FAudioVoice_SetOutputVoices( | ||||
|         instance->handle, | ||||
|         &device->reverbSends); | ||||
| 
 | ||||
|     instance->soundState = SoundState_Stopped; | ||||
| 
 | ||||
|     /* FIXME: id re-use system */ | ||||
|     instance->id = device->staticSoundInstanceCount; | ||||
| 
 | ||||
|     device->staticSoundInstances = realloc(device->staticSoundInstances, (device->staticSoundCount + 1) * sizeof(FAudioGMS_SoundInstance*)); | ||||
|     device->staticSoundInstances[device->staticSoundInstanceCount] = instance; | ||||
|     device->staticSoundInstanceCount += 1; | ||||
| 
 | ||||
|     return (double)instance->id; | ||||
| } | ||||
| 
 | ||||
| void FAudioGMS_SoundInstance_Destroy(double id) | ||||
| { | ||||
|     FAudioGMS_SoundInstance *instance = device->staticSoundInstances[(uint32_t)id]; | ||||
| 
 | ||||
|     if (instance != NULL) | ||||
|     { | ||||
|         FAudioVoice_DestroyVoice(instance->handle); | ||||
|         free(instance->dspSettings.pMatrixCoefficients); | ||||
|         free(instance); | ||||
|         device->staticSoundInstances[(uint32_t)id] = NULL; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void FAudioGMS_StaticSound_Destroy(double id) | ||||
| { | ||||
|     FAudioGMS_StaticSound *sound = device->staticSounds[(uint32_t)id]; | ||||
| 
 | ||||
|     if (sound != NULL) | ||||
|     { | ||||
|         free((void*)sound->buffer.pAudioData); | ||||
|         free(sound); | ||||
|         device->staticSounds[(uint32_t)id] = NULL; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void FAudioGMS_Destroy() | ||||
| { | ||||
|     FAudio_Release(device->handle); | ||||
|     free(device); | ||||
|     device = NULL; | ||||
| } | ||||
|  |  | |||
|  | @ -44,7 +44,14 @@ extern "C" { | |||
| #endif /* __cplusplus */ | ||||
| 
 | ||||
| FAUDIOGMSAPI void FAudioGMS_Init(); | ||||
| FAUDIOGMSAPI void FAudioGMS_Update(); | ||||
| 
 | ||||
| FAUDIOGMSAPI double FAudioGMS_StaticSound_LoadWAV(char *filePath); | ||||
| 
 | ||||
| FAUDIOGMSAPI double FAudioGMS_SoundInstance_CreateFromStaticSound(double id); | ||||
| 
 | ||||
| FAUDIOGMSAPI void FAudioGMS_SoundInstance_Destroy(double id); | ||||
| FAUDIOGMSAPI void FAudioGMS_StaticSound_Destroy(double id); | ||||
| FAUDIOGMSAPI void FAudioGMS_Destroy(); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
|  |  | |||
|  | @ -1,25 +1,58 @@ | |||
| Microsoft Visual Studio Solution File, Format Version 12.00 | ||||
| # Visual Studio 15 | ||||
| VisualStudioVersion = 15.0.28307.645 | ||||
| # Visual Studio Version 16 | ||||
| VisualStudioVersion = 16.0.31727.386 | ||||
| MinimumVisualStudioVersion = 10.0.40219.1 | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAudioGMS", "FAudioGMS.vcxproj", "{6DB15344-E000-45CB-A48A-1D72F7D6E945}" | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAudioGMS", "FAudioGMS.vcxproj", "{4F20502A-F926-4D12-872D-64AC2E065078}" | ||||
| 	ProjectSection(ProjectDependencies) = postProject | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2} = {90A103EF-E403-47D4-BBBB-0F206B9FA7F2} | ||||
| 	EndProjectSection | ||||
| EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAudio", "..\lib\FAudio\visualc\FAudio.vcxproj", "{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		Debug|x64 = Debug|x64 | ||||
| 		Debug|x86 = Debug|x86 | ||||
| 		MinSizeRel|x64 = MinSizeRel|x64 | ||||
| 		MinSizeRel|x86 = MinSizeRel|x86 | ||||
| 		Release|x64 = Release|x64 | ||||
| 		Release|x86 = Release|x86 | ||||
| 		RelWithDebInfo|x64 = RelWithDebInfo|x64 | ||||
| 		RelWithDebInfo|x86 = RelWithDebInfo|x86 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.Debug|x64.ActiveCfg = Debug|x64 | ||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.Debug|x64.Build.0 = Debug|x64 | ||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.MinSizeRel|x64.ActiveCfg = Release|x64 | ||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.MinSizeRel|x64.Build.0 = Release|x64 | ||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.Release|x64.ActiveCfg = Release|x64 | ||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.Release|x64.Build.0 = Release|x64 | ||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.RelWithDebInfo|x64.ActiveCfg = Release|x64 | ||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.RelWithDebInfo|x64.Build.0 = Release|x64 | ||||
| 		{4F20502A-F926-4D12-872D-64AC2E065078}.Debug|x64.ActiveCfg = Debug|x64 | ||||
| 		{4F20502A-F926-4D12-872D-64AC2E065078}.Debug|x64.Build.0 = Debug|x64 | ||||
| 		{4F20502A-F926-4D12-872D-64AC2E065078}.Debug|x86.ActiveCfg = Debug|Win32 | ||||
| 		{4F20502A-F926-4D12-872D-64AC2E065078}.Debug|x86.Build.0 = Debug|Win32 | ||||
| 		{4F20502A-F926-4D12-872D-64AC2E065078}.MinSizeRel|x64.ActiveCfg = Release|x64 | ||||
| 		{4F20502A-F926-4D12-872D-64AC2E065078}.MinSizeRel|x64.Build.0 = Release|x64 | ||||
| 		{4F20502A-F926-4D12-872D-64AC2E065078}.MinSizeRel|x86.ActiveCfg = Debug|Win32 | ||||
| 		{4F20502A-F926-4D12-872D-64AC2E065078}.MinSizeRel|x86.Build.0 = Debug|Win32 | ||||
| 		{4F20502A-F926-4D12-872D-64AC2E065078}.Release|x64.ActiveCfg = Release|x64 | ||||
| 		{4F20502A-F926-4D12-872D-64AC2E065078}.Release|x64.Build.0 = Release|x64 | ||||
| 		{4F20502A-F926-4D12-872D-64AC2E065078}.Release|x86.ActiveCfg = Release|Win32 | ||||
| 		{4F20502A-F926-4D12-872D-64AC2E065078}.Release|x86.Build.0 = Release|Win32 | ||||
| 		{4F20502A-F926-4D12-872D-64AC2E065078}.RelWithDebInfo|x64.ActiveCfg = Release|x64 | ||||
| 		{4F20502A-F926-4D12-872D-64AC2E065078}.RelWithDebInfo|x64.Build.0 = Release|x64 | ||||
| 		{4F20502A-F926-4D12-872D-64AC2E065078}.RelWithDebInfo|x86.ActiveCfg = Release|Win32 | ||||
| 		{4F20502A-F926-4D12-872D-64AC2E065078}.RelWithDebInfo|x86.Build.0 = Release|Win32 | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}.Debug|x64.ActiveCfg = Debug|x64 | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}.Debug|x64.Build.0 = Debug|x64 | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}.Debug|x86.ActiveCfg = Debug|Win32 | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}.Debug|x86.Build.0 = Debug|Win32 | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}.MinSizeRel|x64.ActiveCfg = Debug|x64 | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}.MinSizeRel|x64.Build.0 = Debug|x64 | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}.MinSizeRel|x86.ActiveCfg = Debug|Win32 | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}.MinSizeRel|x86.Build.0 = Debug|Win32 | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}.Release|x64.ActiveCfg = Release|x64 | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}.Release|x64.Build.0 = Release|x64 | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}.Release|x86.ActiveCfg = Release|Win32 | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}.Release|x86.Build.0 = Release|Win32 | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}.RelWithDebInfo|x64.ActiveCfg = Release|x64 | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}.RelWithDebInfo|x64.Build.0 = Release|x64 | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}.RelWithDebInfo|x86.ActiveCfg = Release|Win32 | ||||
| 		{90A103EF-E403-47D4-BBBB-0F206B9FA7F2}.RelWithDebInfo|x86.Build.0 = Release|Win32 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(SolutionProperties) = preSolution | ||||
| 		HideSolutionNode = FALSE | ||||
|  |  | |||
|  | @ -91,6 +91,11 @@ | |||
|   <ItemGroup> | ||||
|     <ClInclude Include="..\src\FAudioGMS.h" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="..\lib\FAudio\visualc\FAudio.vcxproj"> | ||||
|       <Project>{90a103ef-e403-47d4-bbbb-0f206b9fa7f2}</Project> | ||||
|     </ProjectReference> | ||||
|   </ItemGroup> | ||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||||
|   <ImportGroup Label="ExtensionTargets"> | ||||
|   </ImportGroup> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue