-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-908dd8d2e907master
parent
6b8833dfc0
commit
7e598788b0
|
@ -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;
|
||||
}
|
||||
|
|
21
src/loop.cpp
21
src/loop.cpp
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue