#pragma once
#define _USE_MATH_DEFINES
#include <atomic>
#include <iostream>
#include <math.h>
#include <mutex>
#include <vector>
#include "AudioPlatform.hpp"
#include "LinkAudioRenderer.hpp"
namespace ableton
{
namespace linkaudio
{
template <typename Link>
class AudioEngine
{
public:
AudioEngine(Link& link);
void startPlaying();
void stopPlaying();
bool isPlaying() const;
double beatTime() const;
void setTempo(double tempo);
double quantum() const;
void setQuantum(double quantum);
bool isStartStopSyncEnabled() const;
void setStartStopSyncEnabled(bool enabled);
struct EngineData
{
double requestedTempo;
bool requestStart;
bool requestStop;
double quantum;
bool startStopSyncOn;
};
void setNumFrames(std::size_t size);
void setSampleRate(double sampleRate);
EngineData pullEngineData();
void renderMetronomeIntoBuffer(typename Link::SessionState sessionState,
double quantum,
std::chrono::microseconds beginHostTime,
std::size_t numSamples);
void audioCallback(std::chrono::microseconds hostTime, std::size_t numSamples);
Link& mLink;
double mSampleRate;
std::atomic<std::chrono::microseconds> mOutputLatency;
std::array<std::vector<double>, 2> mBuffers;
EngineData mSharedEngineData;
EngineData mLockfreeEngineData;
std::chrono::microseconds mTimeAtLastClick;
bool mIsPlaying;
std::mutex mEngineDataGuard;
LinkAudioRenderer<Link> mLinkAudioRenderer;
};
} }
#include "AudioEngine.ipp"