2#include "trkn/tracktion.hh"
18 diag (
"TRACKTION: %s", msg.toStdString());
25 warning (
"TRACKTION: error: %s", errmsg.toStdString());
30 bool autoInitialiseDeviceManager ()
override {
return !nodevs; }
52 auto &deviceManager =
engine->getDeviceManager();
54 if (
engine->getEngineBehaviour().autoInitialiseDeviceManager())
55 deviceManager.rescanMidiDeviceList();
63 getApplicationName()
override
68 getApplicationVersion()
override
73static TrknApp *trkn_app =
nullptr;
79 ProjectImpl::force_shutdown_all();
80 main_loop->iterate_pending();
81 trkn_app->shutdownApp();
88 diag (
"JUCE: %s", msg.toStdString());
106 if (!trkn_app->initialiseApp()) {
107 trkn_app->shutdownApp();
112 engine_behaviour->nodevs = nodevs;
113 trkn_app->start_engine (std::move (engine_behaviour));
115 main_loop->iterate_pending();
122 return trkn_app ? trkn_app->engine.
get() :
nullptr;
131 transport.addChangeListener (
this);
132 transport.addListener (
this);
133 Ase::printerr (
"TransportListener attached.\n");
137 transport.removeListener (
this);
138 transport.removeChangeListener (
this);
139 Ase::printerr (
"TransportListener detached.\n");
144 if (source == &transport) {
145 transport_changed (
"change");
148 void autoSaveNow ()
override {}
149 void setAllLevelMetersActive (
bool become_inactive)
override {}
150 void setVideoPosition (tracktion::TimePosition pos,
bool force_jump)
override {}
152 void recordingStopped (tracktion::SyncPoint sync_point,
bool discard_recordings)
override {}
153 void recordingAboutToStart (tracktion::InputDeviceInstance &device, tracktion::EditItemID target)
override {}
154 void recordingAboutToStop (tracktion::InputDeviceInstance &device, tracktion::EditItemID target)
override {}
155 void recordingFinished (tracktion::InputDeviceInstance &device, tracktion::EditItemID target,
158 playbackContextChanged ()
override
160 tracktion::EditPlaybackContext *context = transport.getCurrentPlaybackContext();
161 Ase::printerr (
"PlaybackContextChanged: context=%p graph=%d playing=%d position=%.3fsecs\n", context,
162 context ? context->isPlaybackGraphAllocated() : 0,
163 context ? context->isPlaying() : 0,
164 context ? context->getPosition().inSeconds() : 0);
167 startVideo ()
override
169 transport_changed (
"start-video");
170 if (ppt == LoopID::INVALID)
174 stopVideo ()
override
176 transport_changed (
"stop-video");
177 main_loop->cancel (&ppt);
182 auto position = transport.getPosition();
183 Ase::printerr (
"Transport: playing=%d position=%.3fsecs (%s)\n",
184 transport.isPlaying(), position.inSeconds(), what.
c_str());
189 transport_changed (
"position");
192 tracktion::TransportControl &transport;
193 LoopID ppt = LoopID::INVALID;
200namespace EngineHelpers
202tracktion::AudioTrack*
203getOrInsertAudioTrackAt (tracktion::Edit &edit,
int index)
205 edit.ensureNumberOfAudioTracks (index + 1);
206 return tracktion::getAudioTracks (edit)[index];
209removeAllClips (tracktion::AudioTrack &track)
211 auto clips = track.getClips();
213 for (
int i = clips.size(); --i >= 0;)
214 clips.getUnchecked (i)->removeFromParent();
216tracktion::WaveAudioClip::Ptr
217loadAudioFileAsClip (tracktion::Edit &edit,
const juce::File &file)
220 if (
auto track = getOrInsertAudioTrackAt (edit, 0)) {
221 removeAllClips (*track);
224 tracktion::AudioFile audioFile (edit.engine, file);
226 if (audioFile.isValid())
228 { { {}, tracktion::TimeDuration::fromSeconds (audioFile.getLength()) }, {} },
false))
234template<
typename ClipType>
typename ClipType::Ptr
235loopAroundClip (ClipType &clip)
238 auto &transport = clip.edit.getTransport();
239 transport.setLoopRange (clip.getEditTimeRange());
240 transport.looping =
true;
241 transport.setPosition (0s);
String getFileNameWithoutExtension() const
static void JUCE_CALLTYPE setCurrentLogger(Logger *newLogger) noexcept
#define assert_return(expr,...)
Return from the current function if expr is unmet and issue an assertion warning.
#define return_unless(cond,...)
Return silently if cond does not evaluate to true with return value ...
#define assert_return_unreached(...)
Return from the current function and issue an assertion warning.
The Anklang C++ API namespace.
bool trkn_init(int argc, char *argv[], bool nodevs)
Setup tracktion and tracktion::engine.
String application_name()
Retrieve the localized program name intended for user display.
const char * ase_version()
Provide a string containing the package version.