/*
* This file is part of Hylia.
*
* Hylia is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* Hylia is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Hylia. If not, see .
*/
#include "hylia.h"
#if defined(__clang_major__) && __clang_major__ >= 4
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wunused-local-typedef"
#endif
#include "AudioEngine.hpp"
#if defined(__clang_major__) && __clang_major__ >= 4
# pragma clang diagnostic pop
#endif
#include "ableton/link/HostTimeFilter.hpp"
#include
class HyliaTransport {
public:
HyliaTransport()
: link(120.0),
engine(link),
outputLatency(0),
sampleTime(0)
{
}
void setEnabled(const bool enabled)
{
if (enabled)
sampleTime = 0;
link.enable(enabled);
}
void setQuantum(const double quantum)
{
engine.setQuantum(quantum);
}
void setTempo(const double tempo)
{
engine.setTempo(tempo);
}
void setOutputLatency(const uint32_t latency) noexcept
{
outputLatency = latency;
}
void setStartStopSyncEnabled(const bool enabled)
{
engine.setStartStopSyncEnabled(enabled);
}
void startPlaying()
{
engine.startPlaying();
}
void stopPlaying()
{
engine.stopPlaying();
}
void process(const uint32_t frames, LinkTimeInfo* const info)
{
const std::chrono::microseconds hostTime = hostTimeFilter.sampleTimeToHostTime(sampleTime)
+ std::chrono::microseconds(outputLatency);
engine.timelineCallback(hostTime, info);
sampleTime += frames;
}
private:
ableton::Link link;
ableton::link::AudioEngine engine;
ableton::link::HostTimeFilter hostTimeFilter;
uint32_t outputLatency, sampleTime;
};
hylia_t* hylia_create(void)
{
HyliaTransport* t;
try {
t = new HyliaTransport();
} catch (...) {
return nullptr;
}
return (hylia_t*)t;
}
void hylia_enable(hylia_t* link, bool on)
{
((HyliaTransport*)link)->setEnabled(on);
}
void hylia_set_beats_per_bar(hylia_t* link, double beatsPerBar)
{
((HyliaTransport*)link)->setQuantum(beatsPerBar);
}
void hylia_set_beats_per_minute(hylia_t* link, double beatsPerMinute)
{
((HyliaTransport*)link)->setTempo(beatsPerMinute);
}
void hylia_set_output_latency(hylia_t* link, uint32_t latency)
{
((HyliaTransport*)link)->setOutputLatency(latency);
}
void hylia_set_start_stop_sync_enabled(hylia_t* link, bool enabled)
{
((HyliaTransport*)link)->setStartStopSyncEnabled(enabled);
}
void hylia_start_playing(hylia_t* link)
{
((HyliaTransport*)link)->startPlaying();
}
void hylia_stop_playing(hylia_t* link)
{
((HyliaTransport*)link)->stopPlaying();
}
void hylia_process(hylia_t* link, uint32_t frames, hylia_time_info_t* info)
{
((HyliaTransport*)link)->process(frames, (LinkTimeInfo*)info);
}
void hylia_cleanup(hylia_t* link)
{
delete (HyliaTransport*)link;
}
#include "AudioEngine.cpp"