13
0

* adjusted formatting a bit to style guide

* fixed: velocity value left on canvas
* fixed: end-of-track problem still showed up sometimes
* enabled heaps of debugging output in order to debug MidiModel corruption 


git-svn-id: svn://localhost/ardour2/branches/3.0@3329 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Hans Baier 2008-05-09 11:28:14 +00:00
parent f651190162
commit 8d44391f4b
11 changed files with 109 additions and 56 deletions

View File

@ -45,8 +45,11 @@ CanvasNoteEvent::CanvasNoteEvent(MidiRegionView& region, Item* item,
CanvasNoteEvent::~CanvasNoteEvent() CanvasNoteEvent::~CanvasNoteEvent()
{ {
if (_text) cerr << "CanvasNoteEvent::~CanvasNoteEvent() " << int(_note->note()) << " velo " << int(_note->velocity()) << endl;
if (_text) {
_text->hide();
delete _text; delete _text;
}
if (_channel_selector_widget) if (_channel_selector_widget)
delete _channel_selector_widget; delete _channel_selector_widget;
@ -56,13 +59,17 @@ void
CanvasNoteEvent::move_event(double dx, double dy) CanvasNoteEvent::move_event(double dx, double dy)
{ {
_item->move(dx, dy); _item->move(dx, dy);
if (_text) if (_text) {
_text->hide();
_text->move(dx, dy); _text->move(dx, dy);
_text->show();
}
} }
void void
CanvasNoteEvent::show_velocity(void) CanvasNoteEvent::show_velocity(void)
{ {
hide_velocity();
_text = new Text(*(_item->property_parent())); _text = new Text(*(_item->property_parent()));
_text->property_x() = (x1() + x2()) /2; _text->property_x() = (x1() + x2()) /2;
_text->property_y() = (y1() + y2()) /2; _text->property_y() = (y1() + y2()) /2;
@ -79,8 +86,11 @@ CanvasNoteEvent::show_velocity(void)
void void
CanvasNoteEvent::hide_velocity(void) CanvasNoteEvent::hide_velocity(void)
{ {
delete _text; if(_text) {
_text = NULL; _text->hide();
delete _text;
}
_text = 0;
} }
void void
@ -91,8 +101,8 @@ CanvasNoteEvent::on_channel_selection_change(uint16_t selection)
set_fill_color(ARDOUR_UI::config()->canvasvar_MidiNoteFillInactiveChannel.get()); set_fill_color(ARDOUR_UI::config()->canvasvar_MidiNoteFillInactiveChannel.get());
set_outline_color(ARDOUR_UI::config()->canvasvar_MidiNoteOutlineInactiveChannel.get()); set_outline_color(ARDOUR_UI::config()->canvasvar_MidiNoteOutlineInactiveChannel.get());
} else { } else {
set_fill_color(note_fill_color(_note->velocity())); // set the color according to the notes selection state
set_outline_color(note_outline_color(_note->velocity())); selected(_selected);
} }
// this forces the item to update..... maybe slow... // this forces the item to update..... maybe slow...
_item->hide(); _item->hide();

View File

@ -36,8 +36,8 @@ public:
double x2() { return property_x2(); } double x2() { return property_x2(); }
double y2() { return property_y2(); } double y2() { return property_y2(); }
void set_outline_color(uint32_t c) { property_outline_color_rgba() = c; } void set_outline_color(uint32_t c) { property_outline_color_rgba() = c; hide(); show(); }
void set_fill_color(uint32_t c) { property_fill_color_rgba() = c; } void set_fill_color(uint32_t c) { property_fill_color_rgba() = c; hide(); show(); }
bool on_event(GdkEvent* ev); bool on_event(GdkEvent* ev);

View File

@ -65,6 +65,7 @@ SingleMidiChannelSelector::button_toggled(ToggleButton *button, uint8_t channel)
_last_active_button->set_active(false); _last_active_button->set_active(false);
_active_channel = channel; _active_channel = channel;
_last_active_button = button; _last_active_button = button;
channel_selected.emit(channel);
} }
} else { } else {
// if not, the user pressed the already active button // if not, the user pressed the already active button

View File

@ -34,8 +34,8 @@ public:
protected: protected:
virtual void button_toggled(Gtk::ToggleButton *button, uint8_t button_nr); virtual void button_toggled(Gtk::ToggleButton *button, uint8_t button_nr);
Gtk::ToggleButton *_last_active_button; Gtk::ToggleButton* _last_active_button;
uint8_t _active_channel; uint8_t _active_channel;
}; };
class MidiMultipleChannelSelector : public MidiChannelSelector class MidiMultipleChannelSelector : public MidiChannelSelector

View File

@ -456,24 +456,22 @@ MidiRegionView::redisplay_model()
if (_model) { if (_model) {
clear_events(); clear_events();
begin_write();
_model->read_lock(); _model->read_lock();
MidiModel::Notes notes = _model->notes(); MidiModel::Notes notes = _model->notes();
cerr << endl << "Model contains " << notes.size() << " Notes:" << endl; cerr << endl << "Model contains " << notes.size() << " Notes:" << endl;
for(MidiModel::Notes::iterator i = notes.begin(); i != notes.end(); ++i) { for(MidiModel::Notes::iterator i = notes.begin(); i != notes.end(); ++i) {
Note note = *(*i).get(); cerr << "MODEL: Note time: " << (*i)->time()
cerr << "MODEL: Note time: " << note.time() << " duration: " << note.duration() << " pitch: " << int((*i)->note())
<< " end-time: " << note.end_time() << " duration: " << (*i)->duration()
<< " velocity: " << int(note.velocity()) << " end-time: " << (*i)->end_time()
<< " velocity: " << int((*i)->velocity())
//<< " Note-on: " << note.on_event(). //<< " Note-on: " << note.on_event().
//<< " Note-off: " << note.off_event() //<< " Note-off: " << note.off_event()
<< endl; << endl;
} }
for (size_t i=0; i < _model->n_notes(); ++i) { for (size_t i = 0; i < _model->n_notes(); ++i) {
add_note(_model->note_at(i)); add_note(_model->note_at(i));
} }
@ -495,8 +493,6 @@ MidiRegionView::redisplay_model()
} }
} }
end_write();
// Is this necessary ?????????? // Is this necessary ??????????
/*for (Automatable::Controls::const_iterator i = _model->controls().begin(); /*for (Automatable::Controls::const_iterator i = _model->controls().begin();
i != _model->controls().end(); ++i) { i != _model->controls().end(); ++i) {
@ -841,9 +837,11 @@ MidiRegionView::delete_selection()
{ {
assert(_delta_command); assert(_delta_command);
for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
if ((*i)->selected()) if ((*i)->selected()) {
_delta_command->remove((*i)->note()); _delta_command->remove((*i)->note());
}
}
_selection.clear(); _selection.clear();
} }
@ -851,9 +849,11 @@ MidiRegionView::delete_selection()
void void
MidiRegionView::clear_selection_except(ArdourCanvas::CanvasNoteEvent* ev) MidiRegionView::clear_selection_except(ArdourCanvas::CanvasNoteEvent* ev)
{ {
for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
if ((*i)->selected() && (*i) != ev) if ((*i)->selected() && (*i) != ev) {
(*i)->selected(false); (*i)->selected(false);
}
}
_selection.clear(); _selection.clear();
} }
@ -861,40 +861,47 @@ MidiRegionView::clear_selection_except(ArdourCanvas::CanvasNoteEvent* ev)
void void
MidiRegionView::unique_select(ArdourCanvas::CanvasNoteEvent* ev) MidiRegionView::unique_select(ArdourCanvas::CanvasNoteEvent* ev)
{ {
for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
if ((*i) != ev) if ((*i) != ev) {
(*i)->selected(false); (*i)->selected(false);
}
}
_selection.clear(); _selection.clear();
_selection.insert(ev); _selection.insert(ev);
if ( ! ev->selected()) if ( ! ev->selected()) {
ev->selected(true); ev->selected(true);
}
} }
void void
MidiRegionView::note_selected(ArdourCanvas::CanvasNoteEvent* ev, bool add) MidiRegionView::note_selected(ArdourCanvas::CanvasNoteEvent* ev, bool add)
{ {
if ( ! add) if ( ! add) {
clear_selection_except(ev); clear_selection_except(ev);
}
_selection.insert(ev); _selection.insert(ev);
if ( ! ev->selected()) if ( ! ev->selected()) {
ev->selected(true); ev->selected(true);
}
} }
void void
MidiRegionView::note_deselected(ArdourCanvas::CanvasNoteEvent* ev, bool add) MidiRegionView::note_deselected(ArdourCanvas::CanvasNoteEvent* ev, bool add)
{ {
if ( ! add) if ( ! add) {
clear_selection_except(ev); clear_selection_except(ev);
}
_selection.erase(ev); _selection.erase(ev);
if (ev->selected()) if (ev->selected()) {
ev->selected(false); ev->selected(false);
}
} }

View File

@ -368,8 +368,9 @@ MidiRingBuffer::read(MidiBuffer& dst, nframes_t start, nframes_t end, nframes_t
break; break;
bool success = MidiRingBufferBase<Byte>::full_read(sizeof(double), (Byte*)&ev.time()); bool success = MidiRingBufferBase<Byte>::full_read(sizeof(double), (Byte*)&ev.time());
if (success) if (success) {
success = MidiRingBufferBase<Byte>::full_read(sizeof(size_t), (Byte*)&ev.size()); success = MidiRingBufferBase<Byte>::full_read(sizeof(size_t), (Byte*)&ev.size());
}
if (!success) { if (!success) {
std::cerr << "MRB: READ ERROR (time/size)" << std::endl; std::cerr << "MRB: READ ERROR (time/size)" << std::endl;
@ -377,8 +378,9 @@ MidiRingBuffer::read(MidiBuffer& dst, nframes_t start, nframes_t end, nframes_t
} }
Byte first_event_byte; Byte first_event_byte;
if(success) if(success) {
success = full_peek(sizeof(Byte), &first_event_byte); success = full_peek(sizeof(Byte), &first_event_byte);
}
// could this ever happen??? // could this ever happen???
if (!success) { if (!success) {

View File

@ -36,6 +36,7 @@ class Note {
public: public:
Note(uint8_t chan=0, double time=0, double dur=0, uint8_t note=0, uint8_t vel=0x40); Note(uint8_t chan=0, double time=0, double dur=0, uint8_t note=0, uint8_t vel=0x40);
Note(const Note& copy); Note(const Note& copy);
~Note();
const Note& operator=(const Note& copy); const Note& operator=(const Note& copy);

View File

@ -143,14 +143,16 @@ MidiModel::const_iterator::const_iterator(const MidiModel& model, double t)
MidiModel::const_iterator::~const_iterator() MidiModel::const_iterator::~const_iterator()
{ {
if (_locked) if (_locked) {
_model->read_unlock(); _model->read_unlock();
}
} }
const MidiModel::const_iterator& MidiModel::const_iterator::operator++() const MidiModel::const_iterator& MidiModel::const_iterator::operator++()
{ {
if (_is_end) if (_is_end) {
throw std::logic_error("Attempt to iterate past end of MidiModel"); throw std::logic_error("Attempt to iterate past end of MidiModel");
}
/*cerr << "const_iterator::operator++: _event type:" << hex << "0x" << int(_event.type()) /*cerr << "const_iterator::operator++: _event type:" << hex << "0x" << int(_event.type())
<< " buffer: 0x" << int(_event.buffer()[0]) << " 0x" << int(_event.buffer()[1]) << " buffer: 0x" << int(_event.buffer()[0]) << " 0x" << int(_event.buffer()[1])
@ -264,7 +266,7 @@ MidiModel::const_iterator& MidiModel::const_iterator::operator=(const const_iter
size_t index = other._control_iter - other._control_iters.begin(); size_t index = other._control_iter - other._control_iters.begin();
_control_iter = _control_iters.begin() + index; _control_iter = _control_iters.begin() + index;
assert( ! _event.owns_buffer()); assert( !_event.owns_buffer() );
return *this; return *this;
} }
@ -312,13 +314,13 @@ size_t MidiModel::read(MidiRingBuffer& dst, nframes_t start, nframes_t nframes,
dst.write(_read_iter->time() + stamp_offset - negative_stamp_offset, dst.write(_read_iter->time() + stamp_offset - negative_stamp_offset,
_read_iter->size(), _read_iter->buffer()); _read_iter->size(), _read_iter->buffer());
/*
cerr << this << " MidiModel::read event @ " << _read_iter->time() cerr << this << " MidiModel::read event @ " << _read_iter->time()
<< " type: " << hex << int(_read_iter->type()) << dec << " type: " << hex << int(_read_iter->type()) << dec
<< " note: " << int(_read_iter->note()) //<< " note: " << int(_read_iter->note())
<< " velocity: " << int(_read_iter->velocity()) //<< " velocity: " << int(_read_iter->velocity())
<< endl; << endl;
*/
++_read_iter; ++_read_iter;
++read_events; ++read_events;
@ -334,8 +336,9 @@ bool MidiModel::control_to_midi_event(MIDI::Event& ev,
switch (iter.automation_list->parameter().type()) { switch (iter.automation_list->parameter().type()) {
case MidiCCAutomation: case MidiCCAutomation:
if (ev.size() < 3) if (ev.size() < 3) {
ev.set_buffer((Byte*)malloc(3), true); ev.set_buffer((Byte*)malloc(3), true);
}
assert(iter.automation_list); assert(iter.automation_list);
assert(iter.automation_list->parameter().channel() < 16); assert(iter.automation_list->parameter().channel() < 16);
@ -349,8 +352,9 @@ bool MidiModel::control_to_midi_event(MIDI::Event& ev,
return true; return true;
case MidiPgmChangeAutomation: case MidiPgmChangeAutomation:
if (ev.size() < 3) if (ev.size() < 3) {
ev.set_buffer((Byte*)malloc(3), true); ev.set_buffer((Byte*)malloc(3), true);
}
assert(iter.automation_list); assert(iter.automation_list);
assert(iter.automation_list->parameter().channel() < 16); assert(iter.automation_list->parameter().channel() < 16);
@ -364,8 +368,9 @@ bool MidiModel::control_to_midi_event(MIDI::Event& ev,
return true; return true;
case MidiPitchBenderAutomation: case MidiPitchBenderAutomation:
if (ev.size() < 3) if (ev.size() < 3) {
ev.set_buffer((Byte*)malloc(3), true); ev.set_buffer((Byte*)malloc(3), true);
}
assert(iter.automation_list); assert(iter.automation_list);
assert(iter.automation_list->parameter().channel() < 16); assert(iter.automation_list->parameter().channel() < 16);
@ -379,8 +384,9 @@ bool MidiModel::control_to_midi_event(MIDI::Event& ev,
return true; return true;
case MidiChannelAftertouchAutomation: case MidiChannelAftertouchAutomation:
if (ev.size() < 3) if (ev.size() < 3) {
ev.set_buffer((Byte*)malloc(3), true); ev.set_buffer((Byte*)malloc(3), true);
}
assert(iter.automation_list); assert(iter.automation_list);
assert(iter.automation_list->parameter().channel() < 16); assert(iter.automation_list->parameter().channel() < 16);
@ -528,7 +534,8 @@ void MidiModel::append_note_on_unlocked(uint8_t chan, double time,
assert(_writing); assert(_writing);
_edited = true; _edited = true;
_notes.push_back(boost::shared_ptr<Note>(new Note(chan, time, 0, note_num, velocity))); boost::shared_ptr<Note> new_note(new Note(chan, time, 0, note_num, velocity));
_notes.push_back(new_note);
if (_note_mode == Sustained) { if (_note_mode == Sustained) {
//cerr << "MM Sustained: Appending active note on " << (unsigned)(uint8_t)note_num << endl; //cerr << "MM Sustained: Appending active note on " << (unsigned)(uint8_t)note_num << endl;
_write_notes[chan].push_back(_notes.size() - 1); _write_notes[chan].push_back(_notes.size() - 1);
@ -896,8 +903,9 @@ bool MidiModel::write_to(boost::shared_ptr<MidiSource> source)
const NoteMode old_note_mode = _note_mode; const NoteMode old_note_mode = _note_mode;
_note_mode = Sustained; _note_mode = Sustained;
for (const_iterator i = begin(); i != end(); ++i) for (const_iterator i = begin(); i != end(); ++i) {
source->append_event_unlocked(Frames, *i); source->append_event_unlocked(Frames, *i);
}
_note_mode = old_note_mode; _note_mode = old_note_mode;

View File

@ -19,6 +19,7 @@
*/ */
#include <ardour/note.h> #include <ardour/note.h>
#include <iostream>
namespace ARDOUR { namespace ARDOUR {
@ -40,7 +41,8 @@ Note::Note(uint8_t chan, double t, double d, uint8_t n, uint8_t v)
assert(duration() == d); assert(duration() == d);
assert(note() == n); assert(note() == n);
assert(velocity() == v); assert(velocity() == v);
assert(_on_event.channel() == _off_event.channel()); assert(_on_event.channel() == _off_event.channel());
assert(channel() == chan);
} }
@ -69,6 +71,16 @@ Note::Note(const Note& copy)
assert(channel() == copy.channel()); assert(channel() == copy.channel());
} }
Note::~Note()
{
std::cerr << "Note::~Note() Note time: " << time()
<< " pitch: " << int(note())
<< " duration: " << duration()
<< " end-time: " << end_time()
<< " velocity: " << int(velocity())
<< std::endl;
}
const Note& const Note&
Note::operator=(const Note& copy) Note::operator=(const Note& copy)

View File

@ -194,8 +194,15 @@ SMFSource::seek_to_footer_position()
// lets check if there is a track end marker at the end of the data // lets check if there is a track end marker at the end of the data
fseek(_fd, -4, SEEK_END); fseek(_fd, -4, SEEK_END);
//cerr << "SMFSource::seek_to_footer_position: At position: " << ftell(_fd);
size_t read_bytes = fread(buffer, sizeof(uint8_t), 4, _fd); size_t read_bytes = fread(buffer, sizeof(uint8_t), 4, _fd);
//cerr << "SMFSource::seek_to_footer_position: read size: " << read_bytes << endl; /*cerr << " read size: " << read_bytes << " buffer: ";
for (size_t i=0; i < read_bytes; ++i) {
printf("%x ", buffer[i]);
}
printf("\n");
*/
if( (read_bytes == 4) && if( (read_bytes == 4) &&
buffer[0] == 0x00 && buffer[0] == 0x00 &&
buffer[1] == 0xFF && buffer[1] == 0xFF &&
@ -244,6 +251,7 @@ SMFSource::flush_footer()
//cerr << path() << " SMF Flushing footer\n"; //cerr << path() << " SMF Flushing footer\n";
seek_to_footer_position(); seek_to_footer_position();
write_footer(); write_footer();
seek_to_footer_position();
return 0; return 0;
} }
@ -491,8 +499,8 @@ SMFSource::write_unlocked (MidiRingBuffer& src, nframes_t cnt)
void void
SMFSource::append_event_unlocked(EventTimeUnit unit, const MIDI::Event& ev) SMFSource::append_event_unlocked(EventTimeUnit unit, const MIDI::Event& ev)
{ {
/*printf("SMFSource: %s - append_event_unlocked chan = %u, time = %lf, size = %u, data = ", printf("SMFSource: %s - append_event_unlocked chan = %u, time = %lf, size = %u, data = ",
name().c_str(), (unsigned)ev.channel(), ev.time(), ev.size()); */ name().c_str(), (unsigned)ev.channel(), ev.time(), ev.size());
for (size_t i=0; i < ev.size(); ++i) { for (size_t i=0; i < ev.size(); ++i) {
printf("%X ", ev.buffer()[i]); printf("%X ", ev.buffer()[i]);
} }

View File

@ -53,10 +53,11 @@ struct Event {
{ {
if (owns_buffer) { if (owns_buffer) {
_buffer = (uint8_t*)malloc(_size); _buffer = (uint8_t*)malloc(_size);
if (b) if (b) {
memcpy(_buffer, b, _size); memcpy(_buffer, b, _size);
else } else {
memset(_buffer, 0, _size); memset(_buffer, 0, _size);
}
} }
} }
@ -74,24 +75,27 @@ struct Event {
{ {
if (owns_buffer) { if (owns_buffer) {
_buffer = (uint8_t*)malloc(_size); _buffer = (uint8_t*)malloc(_size);
if (copy._buffer) if (copy._buffer) {
memcpy(_buffer, copy._buffer, _size); memcpy(_buffer, copy._buffer, _size);
else } else {
memset(_buffer, 0, _size); memset(_buffer, 0, _size);
}
} }
} }
~Event() { ~Event() {
if (_owns_buffer) if (_owns_buffer) {
free(_buffer); free(_buffer);
}
} }
inline const Event& operator=(const Event& copy) { inline const Event& operator=(const Event& copy) {
_time = copy._time; _time = copy._time;
if (_owns_buffer) { if (_owns_buffer) {
if (copy._buffer) { if (copy._buffer) {
if (!_buffer || _size < copy._size) if (!_buffer || _size < copy._size) {
_buffer = (uint8_t*)::realloc(_buffer, copy._size); _buffer = (uint8_t*)::realloc(_buffer, copy._size);
}
memcpy(_buffer, copy._buffer, copy._size); memcpy(_buffer, copy._buffer, copy._size);
} else { } else {
free(_buffer); free(_buffer);