Final Platform Layer 0.9.9-beta
Loading...
Searching...
No Matches
Simple audio playback

Table of Contents

main.cpp

#define FPL_IMPLEMENTATION
#define FPL_NO_WINDOW
#include <math.h> // sinf
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;
fplAssert(audioTest != nullptr);
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;
// Initialize to default settings which is 48 kHz and 2 Channels
fplSettings settings;
// Optionally overwrite audio settings if needed
// Setup some state for the sine/square wave generation
AudioTest audioTest = {};
audioTest.toneHz = 256;
audioTest.toneVolume = 1000;
audioTest.wavePeriod = settings.audio.deviceFormat.sampleRate / audioTest.toneHz;
audioTest.useSquareWave = false;
// Provide client read callback and optionally user data
settings.audio.clientReadCallback = FillAudioBuffer;
settings.audio.userData = &audioTest;
settings.audio.deviceFormat.type = fplAudioFormatType_S16;
settings.audio.deviceFormat.channels = 2;
settings.audio.deviceFormat.sampleRate = 48000;
// Disable auto start/stop of audio playback
settings.audio.startAuto = false;
settings.audio.stopAuto = false;
// Find audio device
fplAudioDeviceID audioDevices[16] = {};
uint32_t deviceCount = fplGetAudioDevices(audioDevices, fplArrayCount(audioDevices));
if (deviceCount > 0) {
settings.audio.deviceID = audioDevices[0];
fplConsoleFormatOut("Using audio device: %s\n", settings.audio.deviceID.name);
}
}
// Initialize the platform with audio enabled and the settings
// You can overwrite the client read callback and user data if you want to
fplSetAudioClientReadCallback(FillAudioBuffer, &audioTest);
// Start audio playback (This will start calling clientReadCallback regulary)
if (fplPlayAudio() == fplAudioResult_Success) {
// Print out the native audio format
fplConsoleFormatOut("Audio with %lu kHz and %lu channels is playing, press any key to stop playback...\n", nativeFormat.sampleRate, nativeFormat.channels);
// Wait for any key presses
// Stop audio playback
}
// Release the platform
result = 0;
}
return(result);
}
Final Platform Layer (FPL) - A C99 Single-Header-File Platform Abstraction Library.
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 bool fplPlatformInit(const fplInitFlags initFlags, const fplSettings *initSettings)
Initializes the platform layer.
fpl_common_api void fplPlatformRelease(void)
Releases the resources allocated by the platform layer.
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.
Stores audio format properties, such as type, sample rate, channels, etc.
uint16_t channels
Number of channels (uses default when zero).
fplAudioFormatType type
Audio format (uses default when zero).
uint32_t sampleRate
Samples per second (uses default when zero).
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.