#pragma once
#include <ableton/link_audio/AudioBuffer.hpp>
#include <ableton/link_audio/Buffer.hpp>
#include <ableton/link_audio/Id.hpp>
#include <ableton/link_audio/PCMCodec.hpp>
#include <ableton/link_audio/Resizer.hpp>
#include <ableton/util/Injected.hpp>
#include <array>
#include <memory>
#include <stdexcept>
namespace ableton
{
namespace link_audio
{
template <typename Sender, typename SampleFormat>
struct Encoder
{
static constexpr uint32_t kMaxAudioBytes =
576 - v1::kHeaderSize - AudioBuffer::kNonAudioBytes;
static_assert(kMaxAudioBytes <= v1::kMaxPayloadSize);
Encoder(util::Injected<Sender> sender, Id channelId)
: mProcessor(
util::injectVal(PCMEncoder<SampleFormat, Sender>(std::move(sender), channelId)))
{
}
void operator()(const Buffer<SampleFormat>& input)
{
mProcessor(input.mSamples.data(),
input.mNumFrames,
input.mNumChannels,
input.mSampleRate,
input.mBeginBeats,
input.mTempo,
input.mSessionId);
}
private:
Resizer<SampleFormat, PCMEncoder<SampleFormat, Sender>, kMaxAudioBytes> mProcessor;
};
} }