Browse Source

load wav with SDL + fix building and linking

main
cosmonaut 9 months ago
parent
commit
c6e3879a67
  1. BIN
      gamemaker/extensions/FAudioGMS/FAudioGMS.dll
  2. 7954
      lib/dr_wav.h
  3. 153
      src/FAudioGMS.c
  4. 10
      visualc/FAudioGMS.vcxproj

BIN
gamemaker/extensions/FAudioGMS/FAudioGMS.dll (Stored with Git LFS)

Binary file not shown.

7954
lib/dr_wav.h

File diff suppressed because it is too large Load Diff

153
src/FAudioGMS.c

@ -26,8 +26,6 @@
#include "SDL.h"
#define DISABLE_XNASONG
#include "FAudioGMS.h"
#include "F3DAudio.h"
@ -36,14 +34,6 @@
#include "FAudio.h"
#define DR_WAV_IMPLEMENTATION
#define DRWAV_MALLOC(sz) SDL_malloc((sz))
#define DRWAV_REALLOC(p, sz) SDL_realloc((p), (sz))
#define DRWAV_FREE(p) SDL_free((p))
#define DRWAV_COPY_MEMORY(dst, src, sz) SDL_memcpy((dst), (src), (sz))
#define DRWAV_ZERO_MEMORY(p, sz) SDL_memset((p), 0, (sz))
#include "../lib/dr_wav.h"
/* stb vorbis defines. this is kind of a mess but oh well */
#include "../lib/FAudio/src/FAudio_internal.h"
@ -102,12 +92,9 @@
#define STB_VORBIS_NO_INTEGER_CONVERSION 1
#include "../lib/FAudio/src/stb_vorbis.h"
#include <stdio.h>
static inline void Log(char *string)
{
printf("%s\n", string);
fflush(stdout);
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "%s\n", string);
}
typedef struct IdStack
@ -182,9 +169,8 @@ typedef struct FAudioGMS_Voice
typedef struct FAudioGMS_StaticSound
{
uint32_t id;
SDL_AudioSpec spec;
FAudioBuffer buffer;
uint32_t channels;
uint32_t samplesPerSecond;
uint32_t lengthInSeconds;
} FAudioGMS_StaticSound;
@ -280,12 +266,18 @@ typedef struct FAudioGMS_Device
static FAudioGMS_Device *device = NULL;
/* Game Maker doesn't let us control execution order on clean up so we have this
* stupid macro to help us not crash on exit */
#define RETURN_ON_NULL_DEVICE(x) \
if (device == NULL) \
{ \
return x; \
/* Game Maker doesn't let us control execution order on clean up so we have these
* stupid macros to help us not crash on exit */
#define RETURN_ON_NULL_DEVICE_VOID \
if (device == NULL) \
{ \
return; \
}
#define RETURN_ON_NULL_DEVICE(x) \
if (device == NULL) \
{ \
return x; \
}
static inline FAudioGMS_StaticSound *FAudioGMS_INTERNAL_LookupStaticSound(uint32_t id)
@ -530,41 +522,30 @@ void FAudioGMS_Init(double spatialDistanceScale, double timestep)
device->timestep = timestep;
Log("FAudio initialized successfully!");
printf("Device: %ls\n", device->deviceDetails.DisplayName);
fflush(stdout);
}
double FAudioGMS_StaticSound_LoadWAV(char *filePath)
{
RETURN_ON_NULL_DEVICE(-1.0)
drwav_uint64 frameCount;
FAudioGMS_StaticSound *sound = SDL_malloc(sizeof(FAudioGMS_StaticSound));
float *pSampleData = drwav_open_file_and_read_pcm_frames_f32(
filePath,
&sound->channels,
&sound->samplesPerSecond,
&frameCount,
NULL);
if (pSampleData == NULL)
if (SDL_LoadWAV(filePath, &sound->spec, &sound->buffer.pAudioData, &sound->buffer.AudioBytes) == NULL)
{
Log("Error opening WAV file: ");
Log(filePath);
SDL_free(sound);
return -1;
}
sound->buffer.AudioBytes = (uint32_t)(frameCount * sound->channels * sizeof(float));
sound->buffer.Flags = 0;
sound->buffer.LoopBegin = 0;
sound->buffer.LoopCount = 0;
sound->buffer.LoopLength = 0;
sound->buffer.PlayBegin = 0;
sound->buffer.PlayLength = frameCount;
sound->buffer.pAudioData = (uint8_t *)pSampleData;
sound->buffer.PlayLength = sound->buffer.AudioBytes / (uint16_t)(sound->spec.channels * SDL_AUDIO_BITSIZE(sound->spec.format) / 8);
sound->buffer.pContext = NULL;
sound->lengthInSeconds = frameCount / sound->samplesPerSecond;
sound->lengthInSeconds = sound->buffer.PlayLength / sound->spec.freq;
if (device->staticSoundIndexStack.count > 0)
{
@ -704,6 +685,7 @@ static void FAudioGMS_INTERNAL_SoundInstance_SetVolume(
static FAudioGMS_SoundInstance *FAudioGMS_INTERNAL_SoundInstance_Init(
uint32_t channelCount,
uint32_t samplesPerSecond,
uint16_t bitSize,
uint8_t isStatic)
{
FAudioGMS_SoundInstance *instance = SDL_malloc(sizeof(FAudioGMS_SoundInstance));
@ -717,12 +699,24 @@ static FAudioGMS_SoundInstance *FAudioGMS_INTERNAL_SoundInstance_Init(
instance->destroyTimerActive = 0;
instance->isGlobalPaused = 0;
instance->format.wFormatTag = FAUDIO_FORMAT_IEEE_FLOAT;
instance->format.wBitsPerSample = 32;
instance->format.nChannels = channelCount;
instance->format.nBlockAlign = (uint16_t)(4 * channelCount);
instance->format.nSamplesPerSec = samplesPerSecond;
instance->format.nAvgBytesPerSec = instance->format.nBlockAlign * samplesPerSecond;
if (isStatic)
{
instance->format.wFormatTag = FAUDIO_FORMAT_PCM;
instance->format.wBitsPerSample = bitSize;
instance->format.nChannels = channelCount;
instance->format.nBlockAlign = (uint16_t)(channelCount * instance->format.wBitsPerSample / 8);
instance->format.nSamplesPerSec = samplesPerSecond;
instance->format.nAvgBytesPerSec = instance->format.nBlockAlign * samplesPerSecond;
}
else
{
instance->format.wFormatTag = FAUDIO_FORMAT_IEEE_FLOAT;
instance->format.wBitsPerSample = bitSize;
instance->format.nChannels = channelCount;
instance->format.nBlockAlign = (uint16_t)(channelCount * instance->format.wBitsPerSample / 8);
instance->format.nSamplesPerSec = samplesPerSecond;
instance->format.nAvgBytesPerSec = instance->format.nBlockAlign * samplesPerSecond;
}
instance->voice.sends.SendCount = 1;
instance->voice.sends.pSends = SDL_malloc(sizeof(FAudioSendDescriptor));
@ -806,8 +800,9 @@ static FAudioGMS_SoundInstance *FAudioGMS_INTERNAL_SoundInstance_CreateFromStati
FAudioGMS_StaticSound *staticSound)
{
FAudioGMS_SoundInstance *instance = FAudioGMS_INTERNAL_SoundInstance_Init(
staticSound->channels,
staticSound->samplesPerSecond,
staticSound->spec.channels,
staticSound->spec.freq,
SDL_AUDIO_BITSIZE(staticSound->spec.format),
1);
instance->isStatic = 1;
@ -978,7 +973,7 @@ static void FAudioGMS_INTERNAL_Apply3D(FAudioGMS_SoundInstance *instance)
static void FAudioGMS_INTERNAL_SoundInstance_AddBuffer(FAudioGMS_SoundInstance *instance)
{
uint32_t defaultRequestedSampleCount = instance->format.nSamplesPerSec / 4;
uint32_t defaultRequestedSampleCount = instance->format.nSamplesPerSec / 10; /* FIXME: make this configurable */
uint32_t requestedSampleCount = defaultRequestedSampleCount;
if (instance->playLength != 0)
@ -1053,7 +1048,7 @@ double FAudioGMS_StreamingSound_LoadOGG(char *filePath)
stb_vorbis_info info = stb_vorbis_get_info(fileHandle);
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_SoundInstance_Init(info.channels, info.sample_rate, 0);
FAudioGMS_INTERNAL_SoundInstance_Init(info.channels, info.sample_rate, 32, 0);
instance->soundData.streamingSound.fileHandle = fileHandle;
instance->soundData.streamingSound.info = info;
@ -1165,7 +1160,7 @@ static void FAudioGMS_INTERNAL_SoundInstance_Play(FAudioGMS_SoundInstance *insta
void FAudioGMS_SoundInstance_Play(double soundInstanceID)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
@ -1197,7 +1192,7 @@ static void FAudioGMS_INTERNAL_SoundInstance_Pause(FAudioGMS_SoundInstance *inst
void FAudioGMS_SoundInstance_Pause(double soundInstanceID)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
FAudioGMS_INTERNAL_SoundInstance_Pause(instance);
@ -1233,7 +1228,7 @@ static void FAudioGMS_INTERNAL_SoundInstance_Stop(FAudioGMS_SoundInstance *insta
void FAudioGMS_SoundInstance_Stop(double soundInstanceID)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
FAudioGMS_INTERNAL_SoundInstance_Stop(instance);
@ -1241,7 +1236,7 @@ void FAudioGMS_SoundInstance_Stop(double soundInstanceID)
void FAudioGMS_SoundInstance_SetLoop(double soundInstanceID, double loop)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
@ -1261,7 +1256,7 @@ void FAudioGMS_SoundInstance_SetLoop(double soundInstanceID, double loop)
void FAudioGMS_SoundInstance_SetPan(double soundInstanceID, double pan)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
@ -1273,7 +1268,7 @@ void FAudioGMS_SoundInstance_SetPan(double soundInstanceID, double pan)
void FAudioGMS_SoundInstance_SetPitch(double soundInstanceID, double pitch)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
@ -1285,7 +1280,7 @@ void FAudioGMS_SoundInstance_SetPitch(double soundInstanceID, double pitch)
void FAudioGMS_SoundInstance_SetVolume(double soundInstanceID, double volume)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
@ -1298,7 +1293,7 @@ void FAudioGMS_SoundInstance_SetVolume(double soundInstanceID, double volume)
void FAudioGMS_SoundInstance_Set3DPosition(double soundInstanceID, double x, double y, double z)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
@ -1325,7 +1320,7 @@ void FAudioGMS_SoundInstance_Set3DVelocity(
double yVelocity,
double zVelocity)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
@ -1348,17 +1343,17 @@ void FAudioGMS_SoundInstance_SetTrackPositionInSeconds(
double soundInstanceID,
double trackPositionInSeconds)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
if (instance != NULL)
{
uint32_t sampleFrame =
instance->soundData.staticSound->samplesPerSecond * trackPositionInSeconds;
instance->soundData.staticSound->spec.freq * trackPositionInSeconds;
FAudioGMS_SoundState currentState = instance->soundState;
if (currentState == SoundState_Playing)
if (currentState == SoundState_Playing || !instance->isStatic)
{
FAudioSourceVoice_Stop(instance->voice.handle, 0, 0);
FAudioSourceVoice_FlushSourceBuffers(instance->voice.handle);
@ -1406,7 +1401,7 @@ void FAudioGMS_SoundInstance_SetPlayRegion(
double startInMilliseconds,
double endInMilliseconds)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
@ -1462,7 +1457,7 @@ void FAudioGMS_SoundInstance_SetVolumeOverTime(
double volume,
double milliseconds)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
@ -1554,7 +1549,7 @@ double FAudioGMS_SoundInstance_GetTrackPositionInSeconds(double soundInstanceID)
void FAudioGMS_SetListenerPosition(double x, double y, double z)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
device->listener.Position.x = x;
device->listener.Position.y = y;
device->listener.Position.z = z;
@ -1562,7 +1557,7 @@ void FAudioGMS_SetListenerPosition(double x, double y, double z)
void FAudioGMS_SetListenerVelocity(double xVelocity, double yVelocity, double zVelocity)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
device->listener.Velocity.x = xVelocity;
device->listener.Velocity.y = yVelocity;
device->listener.Velocity.z = zVelocity;
@ -1595,7 +1590,7 @@ static void FAudioGMS_INTERNAL_SoundInstance_Destroy(FAudioGMS_SoundInstance *in
void FAudioGMS_SoundInstance_Destroy(double soundInstanceID)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
@ -1607,7 +1602,7 @@ void FAudioGMS_SoundInstance_Destroy(double soundInstanceID)
void FAudioGMS_SoundInstance_DestroyWhenFinished(double soundInstanceID)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
@ -1624,14 +1619,14 @@ static void FAudioGMS_INTERNAL_StaticSound_Destroy(FAudioGMS_StaticSound *sound)
{
device->staticSounds[sound->id] = NULL;
IdStack_Push(&device->staticSoundIndexStack, sound->id);
SDL_free((void *)sound->buffer.pAudioData);
SDL_FreeWAV(sound->buffer.pAudioData);
SDL_free(sound);
}
}
void FAudioGMS_StaticSound_Destroy(double staticSoundID)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_StaticSound *sound = FAudioGMS_INTERNAL_LookupStaticSound((uint32_t)staticSoundID);
FAudioGMS_INTERNAL_StaticSound_Destroy(sound);
}
@ -1737,7 +1732,7 @@ static void FAudioGMS_INTERNAL_EffectChain_AddReverb(
void FAudioGMS_EffectChain_AddDefaultReverb(double effectChainID)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_EffectChain *effectChain =
FAudioGMS_INTERNAL_LookupEffectChain((uint32_t)effectChainID);
@ -1790,7 +1785,7 @@ void FAudioGMS_EffectChain_AddReverb(
double density,
double roomSize)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_EffectChain *effectChain =
FAudioGMS_INTERNAL_LookupEffectChain((uint32_t)effectChainID);
@ -1853,7 +1848,7 @@ static void FAudioGMS_INTERNAL_Voice_SetEffectGain(FAudioGMS_Voice *voice, float
void FAudioGMS_SoundInstance_SetEffectGain(double soundInstanceID, double effectGain)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
@ -1900,7 +1895,7 @@ void FAudioGMS_SoundInstance_SetEffectChain(
double effectChainID,
double effectGain)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_SoundInstance *instance =
FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
FAudioGMS_EffectChain *effectChain =
@ -1916,7 +1911,7 @@ void FAudioGMS_SoundInstance_SetEffectChain(
void FAudioGMS_SetMasteringEffectChain(double effectChainID, double effectGain)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_EffectChain *effectChain =
FAudioGMS_INTERNAL_LookupEffectChain((uint32_t)effectChainID);
@ -1928,7 +1923,7 @@ void FAudioGMS_SetMasteringEffectChain(double effectChainID, double effectGain)
void FAudioGMS_SetMasteringEffectGain(double effectGain)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
if (device->fauxMasteringVoice.effectChainAttached)
{
FAudioGMS_INTERNAL_Voice_SetEffectGain(&device->fauxMasteringVoice, effectGain);
@ -1951,7 +1946,7 @@ static void FAudioGMS_INTERNAL_EffectChain_Destroy(FAudioGMS_EffectChain *effect
void FAudioGMS_EffectChain_Destroy(double effectChainID)
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
FAudioGMS_EffectChain *effectChain =
FAudioGMS_INTERNAL_LookupEffectChain((uint32_t)effectChainID);
@ -1963,7 +1958,7 @@ void FAudioGMS_EffectChain_Destroy(double effectChainID)
void FAudioGMS_Update()
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
uint32_t i;
for (i = 0; i < device->soundInstanceCount; i += 1)
@ -2019,7 +2014,7 @@ void FAudioGMS_Update()
void FAudioGMS_PauseAll()
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
uint32_t i;
for (i = 0; i < device->soundInstanceCount; i += 1)
@ -2035,7 +2030,7 @@ void FAudioGMS_PauseAll()
void FAudioGMS_ResumeAll()
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
uint32_t i;
for (i = 0; i < device->soundInstanceCount; i += 1)
@ -2051,7 +2046,7 @@ void FAudioGMS_ResumeAll()
void FAudioGMS_StopAll()
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
uint32_t i;
for (i = 0; i < device->soundInstanceCount; i += 1)
@ -2062,7 +2057,7 @@ void FAudioGMS_StopAll()
void FAudioGMS_Destroy()
{
RETURN_ON_NULL_DEVICE()
RETURN_ON_NULL_DEVICE_VOID
uint32_t i;
for (i = 0; i < device->soundInstanceCount; i += 1)

10
visualc/FAudioGMS.vcxproj

@ -46,6 +46,7 @@
</PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<PlatformToolset>v142</PlatformToolset>
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@ -89,20 +90,23 @@
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<FunctionLevelLinking>false</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<RuntimeLibrary Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MultiThreaded</RuntimeLibrary>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Release|x64'">SetupAPI.lib;Version.lib;Winmm.lib;Imm32.lib;libucrt.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies Condition="'$(Configuration)|$(Platform)'=='Release|x64'">libucrt.lib;SetupAPI.lib;Version.lib;Winmm.lib;Imm32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<ProjectReference>
<UseLibraryDependencyInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</UseLibraryDependencyInputs>
</ProjectReference>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\src\FAudioGMS.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\lib\dr_wav.h" />
<ClInclude Include="..\src\FAudioGMS.h" />
</ItemGroup>
<ItemGroup>

Loading…
Cancel
Save