EstAudio is a very simple audio library for any simple playback. It is based on the miniaudio library and provides a very simple function to play audio files.
EstAudio is also timestretching using signalsmith-stretch
EstAudio has following features:
- Very simple API
- Support for WAV, MP3, OGG, FLAC
- Real-time timestretching, pitchshifting and resampling
- Encoder for timestretching, pitchshifting, resampler and exporting to file
EstAudio supports the following formats:
- WAV
- MP3
- OGG
- FLAC
Basic audio playback:
#include <EstAudio.h>
int main(int argc, char** argv) {
EST_DeviceInit(44100, EST_DEVICE_STEREO); // 44.1hz and stereo
EHANDLE handle;
EST_RESULT result = EST_SampleLoad(argv[1], &handle);
if (result != EST_OK) {
printf("Error loading sample: %s\n", EST_GetError());
return 1;
}
EST_SamplePlay(handle);
printf("Press enter to exit\n");
getchar();
EST_SampleFree(handle);
EST_DeviceFree();
return 0;
}
Load from memory:
#include <EstAudio.h>
int main(int argc, char** argv) {
EST_DeviceInit(44100, EST_DEVICE_STEREO); // 44.1hz and stereo
// Load the sample from memory
const char* data = /* ... */;
size_t size = /* ... */;
EHANDLE handle;
EST_RESULT result = EST_SampleLoadMemory(data, size, &handle);
if (result != EST_OK) {
printf("Error loading sample: %s\n", EST_GetError());
return 1;
}
EST_SamplePlay(handle);
printf("Press enter to exit\n");
getchar();
EST_SampleFree(handle);
EST_DeviceFree();
return 0;
}
Timestretching:
#include <EstAudio.h>
int main(int argc, char** argv) {
EST_DeviceInit(44100, EST_DEVICE_STEREO); // 44.1hz and stereo
EHANDLE handle;
EST_RESULT result = EST_SampleLoad(argv[1], &handle);
if (result != EST_OK) {
printf("Error loading sample: %s\n", EST_GetError());
return 1;
}
// Set the rate to 1.5x and disable pitch
EST_SampleSetAttribute(handle, EST_ATTRIB_RATE, 1.5f);
EST_SampleSetAttribute(handle, EST_ATTRIB_PITCH, EST_FALSE); // or EST_TRUE if you want use pitch
EST_SamplePlay(handle);
printf("Press enter to exit\n");
getchar();
EST_SampleFree(handle);
EST_DeviceFree();
return 0;
}
Encoder, and export to file:
#include <EstEncoder.h>
int main(int argc, char** argv) {
EHANDLE handle;
EST_RESULT result = EST_EncoderLoad(argv[1], NULL, EST_DECODER_UNKNOWN, &handle);
if (result != EST_OK) {
printf("Error loading encoder: %s\n", EST_GetError());
return 1;
}
// Timestretch by 1.5x
EST_EncoderSetAttribute(handle, EST_ATTRIB_ENCODER_TEMPO, 1.5f);
EST_EncoderSetAttribute(handle, EST_ATTRIB_PAN, 0.2f);
EST_EncoderRender(handle);
EST_EncoderExportFile(handle, EST_EXPORT_WAV, "output.wav");
EST_EncoderFree(handle);
return 0;
}
Encoder, and play it:
#include <EstAudio.h>
#include <EstEncoder.h>
int main(int argc, char** argv) {
EST_DeviceInit(44100, EST_DEVICE_STEREO); // 44.1hz and stereo
EHANDLE handle;
EST_RESULT result = EST_EncoderLoad(argv[1], NULL, EST_DECODER_UNKNOWN, &handle);
if (result != EST_OK) {
printf("Error loading encoder: %s\n", EST_GetError());
return 1;
}
// Timestretch by 1.5x
EST_EncoderSetAttribute(handle, EST_ATTRIB_ENCODER_TEMPO, 1.5f);
EST_EncoderSetAttribute(handle, EST_ATTRIB_PAN, 0.2f);
EHANDLE sample;
EST_EncoderGetSample(handle, &sample);
EST_SamplePlay(sample);
printf("Press enter to exit\n");
getchar();
EST_SampleFree(sample);
EST_EncoderFree(handle);
return 0;
}
Read raw PCM and play it:
#include <EstAudio.h>
int main(int argc, char** argv) {
EST_DeviceInit(44100, EST_DEVICE_STEREO); // 44.1hz and stereo
float* data = /* ... */;
size_t pcmSize = /* ... */;
EHANDLE handle;
EST_RESULT result = EST_SampleLoadRawPCM(data, pcmSize, 2, 44100, &handle);
if (result != EST_OK) {
printf("Error loading encoder: %s\n", EST_GetError());
return 1;
}
EST_SamplePlay(handle);
printf("Press enter to exit\n");
getchar();
EST_SampleFree(sample);
EST_DeviceFree();
return 0;
}
To build EstAudio, you need to have vcpkg installed as well as CMake.
Run the following commands to build EstAudio:
git clone https://github.com/estrol/EstAudio.git
cd EstAudio
cmake --preset=x64-windows
cmake --build build --config Release
EstAudio is licensed under the MIT license. See LICENSE for more information.