13
0

Compare commits

...

16 Commits

Author SHA1 Message Date
765a8b3303 Merge branch 'ardour' 2024-06-21 15:47:23 -06:00
df7fe4fb91 MIDI tracer: don't update ports if audio engine is not running when ports_changed() is called 2024-06-21 15:46:59 -06:00
bbcaf617c4 async MIDI ports run output trace parser scanner if there is one 2024-06-21 15:46:59 -06:00
af9472ecb6 fix naming of MIDI scene changes
Or at least make the arithmetic precedence clearer
2024-06-21 15:46:59 -06:00
d7f9b659f2 slightly improve mgmt of shared_ptr<MIDISceneChange> 2024-06-21 15:46:59 -06:00
f54fd286ee MIDI scene changes should use bank 0 if no bank msg has been seen 2024-06-21 15:46:59 -06:00
10cd3c85cd when delivering a MIDI scene change, ensure trace parser sees the data 2024-06-21 15:46:59 -06:00
0e7a5235e1 MIDI tracer: don't update ports if audio engine is not running when ports_changed() is called 2024-06-21 15:46:22 -06:00
b91e9fbe64 async MIDI ports run output trace parser scanner if there is one 2024-06-21 15:46:22 -06:00
cdab8f950f fix naming of MIDI scene changes
Or at least make the arithmetic precedence clearer
2024-06-21 15:46:22 -06:00
509108f23e slightly improve mgmt of shared_ptr<MIDISceneChange> 2024-06-21 15:46:22 -06:00
3e5dfe0466 MIDI scene changes should use bank 0 if no bank msg has been seen 2024-06-21 15:46:22 -06:00
c74735ba07 when delivering a MIDI scene change, ensure trace parser sees the data 2024-06-21 15:46:22 -06:00
2a9d60a5c7 provide access to the trace parser (if any) for a MidiPort 2024-06-21 15:46:22 -06:00
44d01f5951
Update coverage frame while timming regions #9725 2024-06-21 17:36:28 +02:00
24f574772e
Hide coverage frame when dragging layered region #9725 2024-06-21 17:25:57 +02:00
10 changed files with 60 additions and 17 deletions

View File

@ -1920,7 +1920,7 @@ AudioRegionView::show_xfades ()
void
AudioRegionView::drag_start ()
{
TimeAxisViewItem::drag_start ();
RegionView::drag_start ();
//we used to hide xfades here. I don't see the point with the new model, but we can re-implement if needed
}

View File

@ -2795,11 +2795,12 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
rv->trim_front_starting ();
}
rv->drag_start ();
AudioRegionView* const arv = dynamic_cast<AudioRegionView*> (rv);
if (arv) {
arv->temporarily_hide_envelope ();
arv->drag_start ();
}
std::shared_ptr<Playlist> pl = rv->region ()->playlist ();
@ -2875,10 +2876,13 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
}
}
bool changed = false;
switch (_operation) {
case StartTrim:
for (list<DraggingView>::iterator i = _views.begin (); i != _views.end (); ++i) {
bool changed = i->view->trim_front (timepos_t (i->initial_position) + dt, non_overlap_trim);
changed = i->view->trim_front (timepos_t (i->initial_position) + dt, non_overlap_trim);
if (changed && _preserve_fade_anchor) {
AudioRegionView* arv = dynamic_cast<AudioRegionView*> (i->view);
@ -2899,7 +2903,7 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
case EndTrim:
for (list<DraggingView>::iterator i = _views.begin (); i != _views.end (); ++i) {
bool changed = i->view->trim_end (timepos_t (i->initial_end) + dt, non_overlap_trim);
changed = i->view->trim_end (timepos_t (i->initial_end) + dt, non_overlap_trim);
if (changed && _preserve_fade_anchor) {
AudioRegionView* arv = dynamic_cast<AudioRegionView*> (i->view);
@ -2917,6 +2921,13 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
break;
}
if (changed) {
for (list<DraggingView>::const_iterator i = _views.begin (); i != _views.end (); ++i) {
StreamView* sv = i->view->get_time_axis_view ().view ();
sv->update_coverage_frame ();
}
}
switch (_operation) {
case StartTrim:
show_verbose_cursor_time (rv->region ()->position ());

View File

@ -166,6 +166,10 @@ MidiTracer::ports_changed ()
_midi_port_list->clear ();
if (!AudioEngine::instance()->running()) {
return;
}
PortManager::PortList pl;
AudioEngine::instance()->get_ports (DataType::MIDI, pl);

View File

@ -963,17 +963,22 @@ RegionView::set_height (double h)
}
}
void
RegionView::clear_coverage_frame ()
{
for (auto& i : _coverage_frame) {
delete i;
}
_coverage_frame.clear ();
}
/** Remove old coverage frame and make new ones, if we're in a LayerDisplay mode
* which uses them. */
void
RegionView::update_coverage_frame (LayerDisplay d)
{
/* remove old coverage frame */
for (auto& i : _coverage_frame) {
delete i;
}
_coverage_frame.clear ();
clear_coverage_frame ();
if (d != Stacked) {
/* don't do coverage frame unless we're in stacked mode */

View File

@ -238,6 +238,8 @@ private:
void update_cue_markers ();
void clear_coverage_frame ();
struct ViewCueMarker {
ArdourMarker* view_marker;
ARDOUR::CueMarker model_marker;

View File

@ -126,6 +126,7 @@ public:
void check_record_layers (std::shared_ptr<ARDOUR::Region>, ARDOUR::samplepos_t);
virtual void playlist_layered (std::weak_ptr<ARDOUR::Track>);
void update_coverage_frame ();
sigc::signal<void, RegionView*> RegionViewAdded;
sigc::signal<void> RegionViewRemoved;
@ -193,9 +194,6 @@ protected:
*/
samplepos_t _new_rec_layer_time;
void setup_new_rec_layer_time (std::shared_ptr<ARDOUR::Region>);
private:
void update_coverage_frame ();
};
#endif /* __ardour_streamview_h__ */

View File

@ -60,6 +60,7 @@ class LIBARDOUR_API MidiPort : public Port {
MidiBuffer& get_midi_buffer (pframes_t nframes);
void set_trace (std::weak_ptr<MIDI::Parser> trace_parser);
std::shared_ptr<MIDI::Parser> trace_parser() const;
typedef boost::function<bool(MidiBuffer&,MidiBuffer&)> MidiFilter;
void set_inbound_filter (MidiFilter);

View File

@ -231,9 +231,14 @@ AsyncMIDIPort::write (const MIDI::byte * msg, size_t msglen, MIDI::timestamp_t t
* delivered
*/
std::shared_ptr<MIDI::Parser> tp (trace_parser());
_parser->set_timestamp (AudioEngine::instance()->sample_time() + timestamp);
for (size_t n = 0; n < msglen; ++n) {
_parser->scanner (msg[n]);
if (tp) {
tp->scanner (msg[n]);
}
}
Glib::Threads::Mutex::Lock lm (output_fifo_lock);

View File

@ -395,6 +395,12 @@ MidiPort::set_trace (std::weak_ptr<MIDI::Parser> p)
_trace_parser = p;
}
std::shared_ptr<MIDI::Parser>
MidiPort::trace_parser() const
{
return _trace_parser.lock();
}
void
MidiPort::set_input_active (bool yn)
{

View File

@ -102,14 +102,23 @@ MIDISceneChanger::rt_deliver (MidiBuffer& mbuf, samplepos_t when, std::shared_pt
uint8_t buf[4];
size_t cnt;
std::shared_ptr<AsyncMIDIPort> aport = std::dynamic_pointer_cast<AsyncMIDIPort>(output_port);
MIDI::Parser* parser (aport ? aport->parser() : output_port->trace_parser().get());
MIDIOutputActivity (); /* EMIT SIGNAL */
if ((cnt = msc->get_bank_msb_message (buf, sizeof (buf))) > 0) {
mbuf.push_back (when, Evoral::MIDI_EVENT, cnt, buf);
for (size_t n = 0; parser && n < cnt; ++n) {
parser->scanner (buf[n]);
}
if ((cnt = msc->get_bank_lsb_message (buf, sizeof (buf))) > 0) {
mbuf.push_back (when, Evoral::MIDI_EVENT, cnt, buf);
for (size_t n = 0; parser && n < cnt; ++n) {
parser->scanner (buf[n]);
}
}
last_delivered_bank = msc->bank();
@ -117,7 +126,9 @@ MIDISceneChanger::rt_deliver (MidiBuffer& mbuf, samplepos_t when, std::shared_pt
if ((cnt = msc->get_program_message (buf, sizeof (buf))) > 0) {
mbuf.push_back (when, Evoral::MIDI_EVENT, cnt, buf);
for (size_t n = 0; parser && n < cnt; ++n) {
parser->scanner (buf[n]);
}
last_delivered_program = msc->program();
}
}
@ -324,12 +335,12 @@ MIDISceneChanger::program_change_input (MIDI::Parser& parser, MIDI::byte program
new_mark = true;
}
int bank = -1;
int bank = 0;
if (have_seen_bank_changes) {
bank = std::dynamic_pointer_cast<AsyncMIDIPort>(input_port)->channel (channel)->bank();
}
MIDISceneChange* msc =new MIDISceneChange (channel, bank, program & 0x7f);
std::shared_ptr<MIDISceneChange> msc (new MIDISceneChange (channel, bank, program & 0x7f));
/* check for identical scene change so we can re-use color, if any */
@ -344,8 +355,8 @@ MIDISceneChanger::program_change_input (MIDI::Parser& parser, MIDI::byte program
}
}
loc->set_scene_change (std::shared_ptr<MIDISceneChange> (msc));
loc->set_name( string_compose(_("scene [%1]"), 1+bank*128+(program & 0x7f)));
loc->set_scene_change (msc);
loc->set_name (string_compose(_("scene [%1]"), 1 + ((bank*128)+(program & 0x7f))));
/* this will generate a "changed" signal to be emitted by locations,
and we will call ::gather() to update our list of MIDI events.