NativeInstruments / ni-media

NI Media is a C++ library for reading and writing audio streams.
MIT License
235 stars 34 forks source link
aiff audio cpp cpp14 flac m4a mp3 mp4 music ogg ogg-flac ogg-vorbis pcm sound streams wav

NI MEDIA ni-media CI codecov

NI Media is a library for reading from / writing to audio streams developed at Native Instruments.

Motivation

The goal is to have a modern C++ library for dealing with audio streams in an idiomatic C++ style.

Modern:

Idiomatic:

The following example demonstrates how to stream an entire audio file into a vector:

#include <ni/media/audio/ifstream.h>
#include <vector>

int main()
{
    auto stream = audio::ifstream("hello.wav");
    auto samples = std::vector<float>(stream.info().num_samples());
    stream >> samples;
    // use samples
}

Components

Dependencies

Platforms

ni-media requires a c++14 compliant compiler and is currently supported and tested on these platforms:

Building

First, build and install boost filesystem, iostream, system and program-option to path/to/dependencies. Optionally install any codecs that you want to use, for example flac and ogg-vorbis. Now configure ni-media with CMake (version 3.16.0 or higher is required)

cmake -G YOUR-PROJECT-GENERATOR -DCMAKE_PREFIX_PATH=path/to/dependencies/ path/to/ni-media

Specific codecs can be enabled / disabled by passing additional CMake options.

We can now build ni-media:

cmake --build . 

Testing

googletest is required for testing and needs to be installed to path/to/dependencies. The unit tests can be enabled with CMake option NIMEDIA_TESTS.

cmake -G YOUR-PROJECT-GENERATOR -DCMAKE_PREFIX_PATH=path/to/dependencies/ -DNIMEDIA_TESTS=ON path/to/ni-media

Before running the tests some reference test files need to be downloaded using git-lfs:

git lfs pull -X ""

To execute the tests run:

cmake --build . --target test

Contributions

We very much appreciate your contribution! If you want to contribute please get in touch with the maintainers:

Please run clang-format with the provided .clang-format file and if possible add some tests when opening a pull request.