-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.
|
* 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;
|
||||||
}
|
}
|
||||||
|
|
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) {
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue