// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm

#include "orahProcessor.hpp"
#include "audio/converter.hpp"
#include "libvideostitch/logging.hpp"

namespace VideoStitch {
namespace Audio {
static const std::string o2bTag = "o2b";

OrahProcessor::OrahProcessor() : AudioObject("orah2b", AudioFunction::PROCESSOR) {
  orah4i2b_ = Orah4i::Orah4iToB::create();
}

OrahProcessor::~OrahProcessor() {}

void OrahProcessor::step(AudioBlock &out, const AudioBlock &in) {
  audioSample_t *inInterleaved = new audioSample_t[in.numSamples() * getNbChannelsFromChannelLayout(in.getLayout())];
  audioSample_t *outInterleaved = new audioSample_t[in.numSamples() * getNbChannelsFromChannelLayout(in.getLayout())];
  convertAudioBlockToInterleavedSamples(in, inInterleaved);
  orah4i2b_->process(inInterleaved, outInterleaved);
  convertInterleavedSamplesToAudioBlock(outInterleaved, (int)in.numSamples(), AMBISONICS_WXYZ, out);
  out.setTimestamp(in.getTimestamp());
  delete[] inInterleaved;
  delete[] outInterleaved;
}

void OrahProcessor::step(AudioBlock &inout) { step(inout, inout); }

}  // namespace Audio
}  // namespace VideoStitch