/ni-media

NI Media is a C++ library for reading and writing audio streams.

Primary LanguageC++MIT LicenseMIT

NI MEDIA Travis Build Status Appveyor Build Status 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:

  • a clear separation of concerns (modular instead of fat classes)
  • support for ranges and iterators

Idiomatic:

  • based on std.streams.
  • integrates well with STL algorithms and boost

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

  • audiostream: the main library for reading from / writing to audio streams.
  • pcm: a small library to convert pcm data from / to arithmetic types.

Dependencies

  • boost ( algorithm, endian, filesystem, format, icl, iostream, local, program-option, regex, system)
  • flac & ogg, for flac support (CMake option NIMEDIA_ENABLE_FLAC_DECODING)
  • vorbis & ogg, for ogg vorbis support (CMake option NIMEDIA_ENABLE_OGG_DECODING)
  • googletest for building the tests (CMake option NIMEDIA_TESTS)

Platforms

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

  • Windows ( requires Visual Studio 2015 Update 3 or higher )
  • Mac OS X ( requires Xcode / Clang 7.3 or higher )
  • iOS ( requires Xcode / Clang 7.3 or higher )
  • Linux ( requires GCC 5.0 or higher, Clang 7.3 or higher should also work )

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.12.4 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.