2#include "trkn/tracktion.hh"
22 te::LevelMeasurer::Client meter_client_;
27 float dbspl0 = -100.0f;
28 float dbspl1 = -100.0f;
31 asetrack_ (asetrack), track_state_ (asetrack_.track_->state),
32 telemetry_block_ (SERVER->telemem_allocate (sizeof (
Telemetry))),
33 telemetry (*new (telemetry_block_.block_start)
Telemetry{})
36 if (
auto t = asetrack_.track_.get()) {
38 if (
auto lmp = at->getLevelMeterPlugin()) {
39 measurer_ = &lmp->measurer;
40 measurer_->addClient (meter_client_);
42 if (
auto vol = at->getVolumePlugin()) {
43 volume_plugin_state_ = vol->state;
49 ~TrackStateListener()
override
51 if (volume_plugin_state_.
isValid())
54 measurer_->removeClient (meter_client_);
56 SERVER->telemem_release (telemetry_block_);
62 return { -100.0f, -100.0f };
70 if (tree == track_state_) {
71 if (property == tracktion::engine::IDs::name)
73 if (property == tracktion::engine::IDs::mute)
75 if (property == tracktion::engine::IDs::solo)
78 if (tree == volume_plugin_state_) {
79 if (property == tracktion::engine::IDs::volume)
81 if (property == tracktion::engine::IDs::pan)
84 asetrack_.update_telemetry();
89 if (parent == track_state_ && te::Clip::isClipState (child))
95 if (parent == track_state_ && te::Clip::isClipState (child))
99 void valueTreeChildOrderChanged (
juce::ValueTree&,
int,
int)
override {}
104trkn_track_type (tracktion::Track &track)
110 if (track.isTempoTrack())
112 if (track.isMarkerTrack())
114 if (track.isChordTrack())
116 if (track.isArrangerTrack())
118 if (track.isMasterTrack())
124TrackImpl::from_trkn (tracktion::Track &t)
126 TrackImpl *track = find_ase_obj<TrackImpl> (t);
128 return shared_ptr_cast<TrackImpl> (track);
129 TrackImplP trackp = TrackImpl::make_shared (t);
133TrackImpl::TrackImpl (tracktion::Track &track) :
135 track_ (&track), te_type_ (trkn_track_type (track))
142TrackImpl::TrackImpl (ProjectImpl &project,
bool masterflag) :
145 gadget_flags (masterflag ? MASTER_TRACK : 0);
148TrackImpl::~TrackImpl()
151 state_listener_ =
nullptr;
156TrackImpl::name()
const
158 if (
auto trackp = track_.get())
159 return trackp->getName().toStdString();
166 if (
auto trackp = track_.get())
171TrackImpl::project ()
const
177TrackImpl::fallback_name()
const
181 if (
auto project_ = project()) {
182 ssize_t i = project_->track_index (*
this);
185 return DeviceImpl::fallback_name();
210 midichannel =
CLAMP (midichannel, 0, 16);
212 midi_channel_ = midichannel;
219 if (
auto t = track_.get())
220 return t->isMuted (
false);
227 if (
auto t = track_.get())
234 if (
auto t = track_.get())
235 return t->isSolo (
false);
242 if (
auto t = track_.get())
249 if (
auto t = track_.get())
250 return t->isMasterTrack();
257 if (
auto t = track_.get())
259 if (
auto vol = at->getVolumePlugin())
260 return vol->getVolumeDb();
267 if (
auto t = track_.get())
269 if (
auto vol = at->getVolumePlugin())
270 vol->setVolumeDb (db);
276 if (
auto t = track_.get())
278 if (
auto vol = at->getVolumePlugin())
279 return vol->getPan();
286 if (
auto t = track_.get())
288 if (
auto vol = at->getVolumePlugin())
296 if (
auto t = track_.get())
298 for (
auto *clip : ct->getClips())
300 if (
auto clipimpl = ClipImpl::from_trkn (*clip))
301 clips.push_back (clipimpl);
306TrackImpl::clip_index (
const ClipImpl &clip)
const
308 if (
auto t = track_.get())
310 auto &clips = ct->getClips();
311 for (
int i = 0; i < clips.size(); i++)
312 if (clips[i] == clip.clip_.get())
319TrackImpl::clip_succession (
const ClipImpl &clip)
const
321 ssize_t idx = clip_index (clip);
324 if (
auto t = track_.get())
326 auto &clips = ct->getClips();
327 if (idx + 1 < clips.size())
340TrackImpl::create_monitor (
int32 ochannel)
350 auto &t = state_listener_->telemetry;
351 v.push_back (telemetry_field (
"dbspl0", &t.dbspl0));
352 v.push_back (telemetry_field (
"dbspl1", &t.dbspl1));
357TrackImpl::update_telemetry()
360 auto &t = state_listener_->telemetry;
361 auto [left, right] = state_listener_->get_levels();
376 auto *track = track_.get();
379 track_->edit.deleteTrack (track);
382 state_listener_ =
nullptr;
388TrackImpl::ClipScout::ClipScout() noexcept
404 if (previous >= 0 && previous < indices_.size()) {
406 return indices_[last_];
422 indices_ = other.indices_;
428 if (
auto t = track_.get()) {
429 if (
auto at =
dynamic_cast<tracktion::AudioTrack *
> (t)) {
430 const tracktion::TimeRange range (tracktion::TimePosition::fromSeconds (start), tracktion::TimeDuration::fromSeconds (length));
431 auto clip = at->insertMIDIClip (
juce::String (name), range,
nullptr);
433 return ClipImpl::from_trkn (*clip);
435 warning (
"insertMIDIClip returned null");
438 warning (
"dynamic_cast<AudioTrack*> failed for track type: %s", trkn_track_type (*t).
c_str());
441 warning (
"track_.get() returned null");
448 if (
auto t = track_.get()) {
449 if (
auto ct =
dynamic_cast<tracktion::ClipTrack *
> (t)) {
450 const tracktion::TimeRange range (tracktion::TimePosition::fromSeconds (start), tracktion::TimeDuration::fromSeconds (length));
451 auto clip = ct->insertNewClip (tracktion::TrackItem::Type::wave,
juce::String (name), range,
nullptr);
453 return ClipImpl::from_trkn (*clip);
455 warning (
"insertNewClip returned null");
458 warning (
"dynamic_cast<ClipTrack*> failed for track type: %s", trkn_track_type (*t).
c_str());
461 warning (
"track_.get() returned null");
bool is_active() override
Check whether this is the active synthesis engine project.
void _deactivate() override
Stop processing the corresponding AudioProcessor.
void _activate() override
Add AudioProcessor to the Engine and start processing.
void emit_notify(const String &detail) override
Emit notify:detail, multiple notifications maybe coalesced if a CoalesceNotifies instance exists.
GadgetImpl * _parent() const override
Retrieve parent container.
void remove_self() override
Remove self from parent container.
Mimick tracktion::engine::SafeSelectable<> for tracktion::Selectable descendants.
MIDI clip playback succession generator.
int advance(int previous)
Determine clip succession.
void reset()
Reset state (history), preserves succession order.
void setup(const std::vector< int > &indices)
Setup clip succession order.
void update(const ClipScout &other)
Assign new succession order, preserves history.
Ase::Track implementation.
double volume() const override
Get track volume in dB.
double pan() const override
Get track pan (-1.0 to 1.0).
ClipS launcher_clips() override
Retrieve the list of clips that can be directly played.
bool is_muted() const override
Check if track is muted.
void _activate() override
Add AudioProcessor to the Engine and start processing.
void serialize(WritNode &xs) override
Serialize members and childern.
void set_muted(bool muted) override
Set track muted state.
void _deactivate() override
Stop processing the corresponding AudioProcessor.
ClipP create_audio_clip(const String &name, double start, double length) override
Create a new audio clip on this track.
bool is_master() const override
Flag set on the main output track.
DeviceP access_device() override
Retrieve Device handle for this track.
DeviceInfo device_info() override
Describe this Device type.
TelemetryFieldS telemetry() const override
Create signal monitor for an output channel.
ClipP create_midi_clip(const String &name, double start, double length) override
Create a new MIDI clip on this track.
bool is_solo() const override
Check if track is soloed.
int32 midi_channel() const override
Midi channel assigned to this track, 0 uses internal per-track channel.
void set_solo(bool solo) override
Set track solo state.
void remove_self() override
Remove self from parent container.
One entry in a Writ serialization document.
bool isValid() const noexcept
void addListener(Listener *listener)
void removeListener(Listener *listener)
#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 CLAMP(v, mi, ma)
Yield v clamped to [mi … ma].
The Anklang C++ API namespace.
std::string string_format(const char *format, const Args &...args) __attribute__((__format__(__printf__
Format a string similar to sprintf(3) with support for std::string and std::ostringstream convertible...
int32_t int32
A 32-bit signed integer.
void register_ase_obj(VirtualBase *ase_impl, tracktion::Selectable &selectable)
Helper: register AseImpl with a tracktion Selectable via ase_obj_.
AseType * find_ase_obj(tracktion::Selectable &selectable)
Helper: lookup AseType from tracktion Selectable via ase_obj_.
std::string String
Convenience alias for std::string.
void unregister_ase_obj(VirtualBase *ase_impl, tracktion::Selectable *selectable)
Helper: unregister AseImpl from a tracktion Selectable (selectable may be nullptr)
RangeType< TimePosition > TimeRange
Reference for an allocated memory block.