-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. * or empty.
*/ */
if (m_loop_buffer->Free() > sizeof ev.time + sizeof ev.size + ev.size) { 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.time, sizeof ev.time);
m_loop_buffer->Write((uint8_t *)&ev.size, sizeof ev.size); m_loop_buffer->Write((uint8_t *)&ev.size, sizeof ev.size);
m_loop_buffer->Write((uint8_t *)ev.buffer, ev.size); m_loop_buffer->Write((uint8_t *)ev.buffer, ev.size);
@ -174,7 +174,6 @@ void Jack::EraseLoop(int loop)
bool Jack::Run() bool Jack::Run()
{ {
static jack_nframes_t recording_time;
static jack_midi_event_t ev; static jack_midi_event_t ev;
static bool first = true; static bool first = true;
if (first) { if (first) {
@ -183,8 +182,7 @@ bool Jack::Run()
} }
if (ev.time == UINT_MAX) { if (ev.time == UINT_MAX) {
if (m_loop_buffer->Size() >= sizeof recording_time + sizeof ev.time + sizeof ev.size) { if (m_loop_buffer->Size() >= sizeof ev.time + sizeof ev.size) {
m_loop_buffer->Read((uint8_t *)&recording_time, sizeof recording_time);
m_loop_buffer->Read((uint8_t *)&ev.time, sizeof ev.time); m_loop_buffer->Read((uint8_t *)&ev.time, sizeof ev.time);
m_loop_buffer->Read((uint8_t *)&ev.size, sizeof ev.size); m_loop_buffer->Read((uint8_t *)&ev.size, sizeof ev.size);
} }
@ -195,7 +193,7 @@ bool Jack::Run()
} }
if (m_recording) { if (m_recording) {
m_loops[m_recording_loop].AddEvent(recording_time, &ev); m_loops[m_recording_loop].AddEvent(&ev);
} }
ev.time = UINT_MAX; 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) { for (; m_iterator != m_events.end(); ++m_iterator) {
jack_midi_event_t &event = *m_iterator;
jack_midi_event_t &event = (*m_iterator).first; if (event.time > m_position) break;
jack_nframes_t position = (*m_iterator).second;
if (event.time + position > m_position) break;
jack_midi_event_write(port_buffer, frame, event.buffer, event.size); 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; m_events.push_back(*event);
e.first = *event;
e.second = position;
m_events.push_back(e);
} }
void Loop::SetLength(jack_nframes_t length) void Loop::SetLength(jack_nframes_t length)
@ -109,7 +104,7 @@ void Loop::StartFromNoteCache(NoteCache &cache)
event.buffer = buffer; event.buffer = buffer;
event.size = 3; event.size = 3;
AddEvent(0, &event); AddEvent(&event);
} }
} }
} }
@ -128,11 +123,11 @@ void Loop::EndFromNoteCache(NoteCache &cache)
buffer[2] = 0; buffer[2] = 0;
jack_midi_event_t event; jack_midi_event_t event;
event.time = 0; event.time = m_length - 1;
event.buffer = buffer; event.buffer = buffer;
event.size = 3; event.size = 3;
AddEvent(m_length - 1, &event); AddEvent(&event);
} }
} }
} }
@ -146,7 +141,7 @@ void Loop::Empty()
m_position = 0; m_position = 0;
for (m_iterator = m_events.begin(); m_iterator != m_events.end(); ++m_iterator) { 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); free(event.buffer);
} }

View File

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