#define FPL_IMPLEMENTATION
#define FPL_NO_WINDOW
#include <math.h>
struct AudioTest {
uint32_t toneHz;
uint32_t toneVolume;
uint32_t runningSampleIndex;
uint32_t wavePeriod;
bool useSquareWave;
};
static const float PI32 = 3.14159265359f;
static uint32_t FillAudioBuffer(
const fplAudioFormat *nativeFormat,
const uint32_t frameCount,
void *outputSamples,
void *userData) {
AudioTest *audioTest = (AudioTest *)userData;
uint32_t result = 0;
int16_t *outSamples = (int16_t *)outputSamples;
uint32_t halfWavePeriod = audioTest->wavePeriod / 2;
for (uint32_t frameIndex = 0; frameIndex < frameCount; ++frameIndex) {
int16_t sampleValue;
if (audioTest->useSquareWave) {
sampleValue = ((audioTest->runningSampleIndex++ / halfWavePeriod) % 2) ? (int16_t)audioTest->toneVolume : -(int16_t)audioTest->toneVolume;
} else {
float t = 2.0f * PI32 * (float)audioTest->runningSampleIndex++ / (float)audioTest->wavePeriod;
sampleValue = (int16_t)(sinf(t) * audioTest->toneVolume);
}
for (uint32_t channelIndex = 0; channelIndex < nativeFormat->
channels; ++channelIndex) {
*outSamples++ = sampleValue;
++result;
}
}
return result;
}
int main(int argc, char **argv) {
int result = -1;
AudioTest audioTest = {};
audioTest.toneHz = 256;
audioTest.toneVolume = 1000;
audioTest.wavePeriod = settings.
audio.deviceFormat.sampleRate / audioTest.toneHz;
audioTest.useSquareWave = false;
settings.
audio.userData = &audioTest;
settings.
audio.deviceFormat.channels = 2;
settings.
audio.deviceFormat.sampleRate = 48000;
if (deviceCount > 0) {
settings.
audio.deviceID = audioDevices[0];
}
}
}
result = 0;
}
return(result);
}
fpl_common_api fplAudioResultType fplPlayAudio(void)
Start playing asynchronous audio.
fpl_common_api fplAudioResultType fplStopAudio(void)
Stop playing asynchronous audio.
fpl_common_api uint32_t fplGetAudioDevices(const uint32_t maxDeviceCount, const uint32_t deviceInfoSize, fplAudioDeviceInfo *outDevices)
Retrieves all playback audio devices.
fpl_common_api bool fplGetAudioHardwareFormat(fplAudioFormat *outFormat)
Retrieves the native audio format for the current audio device.
fpl_common_api bool fplSetAudioClientReadCallback(fpl_audio_client_read_callback *newCallback, void *userData)
Overwrites the audio client read callback.
fpl_common_api void fplConsoleFormatOut(const char *format,...)
Writes the given formatted text to the standard output console buffer.
fpl_platform_api char fplConsoleWaitForCharInput(void)
Waits for a character to be typed in the console input and returns it.
#define fplAssert(exp)
Breaks with a runtime assertion when the specified expression evaluates to false.
#define fplArrayCount(arr)
Returns the element count from a static array.
fpl_common_api void fplSetDefaultSettings(fplSettings *settings)
Resets the given settings container to default values for window, video, audio, etc.
@ fplInitFlags_Audio
Use asynchronous audio playback.
@ fplAudioFormatType_S16
Signed 16-bit integer PCM.
fpl_b32 startAuto
Start playing of audio samples after platform initialization automatically.
fpl_audio_client_read_callback * clientReadCallback
The callback for retrieving audio data from the client.
fpl_b32 stopAuto
Stop playing of audio samples before platform release automatically.
Stores settings, such as window, video, etc.
fplAudioSettings audio
Audio settings.
Stores the ID of the underlying backend.