#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 fplAudioDeviceFormat *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.deviceFormat.channels = 2;
settings.
audio.deviceFormat.sampleRate = 48000;
if (deviceCount > 0) {
settings.
audio.deviceID = audioDevices[0];
}
}
}
result = 0;
}
return(result);
}
fpl_common_api bool fplGetAudioHardwareFormat(fplAudioDeviceFormat *outFormat)
Retrieves the native format for the current audio device.
fpl_common_api fplAudioResultType fplPlayAudio()
Start playing asynchronous audio.
fpl_common_api uint32_t fplGetAudioDevices(fplAudioDeviceInfo *devices, uint32_t maxDeviceCount)
Retrieves all playback audio devices.
fpl_common_api fplAudioResultType fplStopAudio()
Stop playing asynchronous audio.
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()
Wait for a character to be typed in the console input and return it.
#define fplAssert(exp)
Breaks with an runtime assertion, when the specified expression evaluates to false.
#define fplArrayCount(arr)
Returns the element count from a static array. This should ideally produce a compile error when passi...
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.
void * userData
User data pointer for client read callback.
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.
A structure containing settings, such as window, video, etc.
fplAudioSettings audio
Audio settings.
A union containing a id of the underlying backend.