Final Platform Layer 0.9.8-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 fplAudioDeviceFormat *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 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 fplPlatformRelease()
Releases the resources allocated by the platform layer.
fpl_common_api bool fplPlatformInit(const fplInitFlags initFlags, const fplSettings *initSettings)
Initializes 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.
A structure containing audio device format runtime properties, such as type, samplerate,...
fplAudioFormatType type
Format.
uint32_t sampleRate
Samples per seconds.
uint32_t channels
Number of channels.
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.