-Change: Store loop-relative timestamp in midi event queue instead of period and period-relative timestamps.

git-svn-id: http://svn.fuzzle.org/mloop/trunk@21 ba049829-c6ef-42ef-81ac-908dd8d2e907
master
petern 2009-07-22 19:11:57 +00:00
parent 6b8833dfc0
commit 7e598788b0
3 changed files with 13 additions and 21 deletions

View File

@ -103,7 +103,7 @@ int Jack::ProcessCallback(jack_nframes_t nframes)
* or empty.
*/
if (m_loop_buffer->Free() > sizeof ev.time + sizeof ev.size + ev.size) {
m_loop_buffer->Write((uint8_t *)&m_recording_time, sizeof m_recording_time);
ev.time += m_recording_time;
m_loop_buffer->Write((uint8_t *)&ev.time, sizeof ev.time);
m_loop_buffer->Write((uint8_t *)&ev.size, sizeof ev.size);
m_loop_buffer->Write((uint8_t *)ev.buffer, ev.size);
@ -174,7 +174,6 @@ void Jack::EraseLoop(int loop)
bool Jack::Run()
{
static jack_nframes_t recording_time;
static jack_midi_event_t ev;
static bool first = true;
if (first) {
@ -183,8 +182,7 @@ bool Jack::Run()
}
if (ev.time == UINT_MAX) {
if (m_loop_buffer->Size() >= sizeof recording_time + sizeof ev.time + sizeof ev.size) {
m_loop_buffer->Read((uint8_t *)&recording_time, sizeof recording_time);
if (m_loop_buffer->Size() >= sizeof ev.time + sizeof ev.size) {
m_loop_buffer->Read((uint8_t *)&ev.time, sizeof ev.time);
m_loop_buffer->Read((uint8_t *)&ev.size, sizeof ev.size);
}
@ -195,7 +193,7 @@ bool Jack::Run()
}
if (m_recording) {
m_loops[m_recording_loop].AddEvent(recording_time, &ev);
m_loops[m_recording_loop].AddEvent(&ev);
}
ev.time = UINT_MAX;
}

View File

@ -33,10 +33,8 @@ void Loop::PlayFrame(void *port_buffer, jack_nframes_t frame)
}
for (; m_iterator != m_events.end(); ++m_iterator) {
jack_midi_event_t &event = (*m_iterator).first;
jack_nframes_t position = (*m_iterator).second;
if (event.time + position > m_position) break;
jack_midi_event_t &event = *m_iterator;
if (event.time > m_position) break;
jack_midi_event_write(port_buffer, frame, event.buffer, event.size);
}
@ -52,12 +50,9 @@ void Loop::PlayFrame(void *port_buffer, jack_nframes_t frame)
}
}
void Loop::AddEvent(jack_nframes_t position, jack_midi_event_t *event)
void Loop::AddEvent(jack_midi_event_t *event)
{
Event e;
e.first = *event;
e.second = position;
m_events.push_back(e);
m_events.push_back(*event);
}
void Loop::SetLength(jack_nframes_t length)
@ -109,7 +104,7 @@ void Loop::StartFromNoteCache(NoteCache &cache)
event.buffer = buffer;
event.size = 3;
AddEvent(0, &event);
AddEvent(&event);
}
}
}
@ -128,11 +123,11 @@ void Loop::EndFromNoteCache(NoteCache &cache)
buffer[2] = 0;
jack_midi_event_t event;
event.time = 0;
event.time = m_length - 1;
event.buffer = buffer;
event.size = 3;
AddEvent(m_length - 1, &event);
AddEvent(&event);
}
}
}
@ -146,7 +141,7 @@ void Loop::Empty()
m_position = 0;
for (m_iterator = m_events.begin(); m_iterator != m_events.end(); ++m_iterator) {
jack_midi_event_t &event = (*m_iterator).first;
jack_midi_event_t &event = *m_iterator;
free(event.buffer);
}

View File

@ -17,8 +17,7 @@ enum LoopState {
LS_RECORDING,
};
typedef std::pair<jack_midi_event_t, jack_nframes_t> Event;
typedef std::list<Event> EventList;
typedef std::list<jack_midi_event_t> EventList;
class Loop {
private:
@ -36,7 +35,7 @@ public:
~Loop();
void PlayFrame(void *port_buffer, jack_nframes_t frame);
void AddEvent(jack_nframes_t position, jack_midi_event_t *event);
void AddEvent(jack_midi_event_t *event);
void SetState(LoopState state)
{