-Change: Replace custom ringbuffer code with JACK's ringbuffer interface, as written by people who know better than me :)
git-svn-id: http://svn.fuzzle.org/mloop/trunk@34 ba049829-c6ef-42ef-81ac-908dd8d2e907master
parent
437d6c2e2b
commit
236f8fadce
|
@ -4,27 +4,28 @@
|
||||||
#include <jack/midiport.h>
|
#include <jack/midiport.h>
|
||||||
#include "ringbuffer.h"
|
#include "ringbuffer.h"
|
||||||
|
|
||||||
bool RingBuffer::PushEvent(jack_midi_event_t &ev)
|
bool RingBuffer::PushEvent(const jack_midi_event_t &ev)
|
||||||
{
|
{
|
||||||
if (Free() <= sizeof ev.time + sizeof ev.size + ev.size) return false;
|
size_t f = jack_ringbuffer_write_space(m_buffer);
|
||||||
|
if (f <= sizeof ev.time + sizeof ev.size + ev.size) return false;
|
||||||
|
|
||||||
Write((uint8_t *)&ev.time, sizeof ev.time);
|
jack_ringbuffer_write(m_buffer, (const char *)&ev.size, sizeof ev.size);
|
||||||
Write((uint8_t *)&ev.size, sizeof ev.size);
|
jack_ringbuffer_write(m_buffer, (const char *)&ev.time, sizeof ev.time);
|
||||||
Write((uint8_t* )ev.buffer, ev.size);
|
jack_ringbuffer_write(m_buffer, (const char *)ev.buffer, ev.size);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RingBuffer::PopEvent(jack_midi_event_t &ev)
|
bool RingBuffer::PopEvent(jack_midi_event_t &ev)
|
||||||
{
|
{
|
||||||
if (Size() >= sizeof ev.time + sizeof ev.size) {
|
size_t f = jack_ringbuffer_read_space(m_buffer);
|
||||||
uint8_t *peek;
|
if (f >= sizeof ev.time + sizeof ev.size) {
|
||||||
peek = Peek((uint8_t *)&ev.time, sizeof ev.time, m_read);
|
jack_ringbuffer_peek(m_buffer, (char *)&ev.size, sizeof ev.size);
|
||||||
peek = Peek((uint8_t *)&ev.size, sizeof ev.size, peek);
|
if (f >= sizeof ev.time + sizeof ev.size + ev.size) {
|
||||||
if (Size() >= sizeof ev.time + sizeof ev.size + ev.size) {
|
|
||||||
ev.buffer = (jack_midi_data_t *)malloc(ev.size);
|
ev.buffer = (jack_midi_data_t *)malloc(ev.size);
|
||||||
m_read = peek;
|
jack_ringbuffer_read(m_buffer, (char *)&ev.size, sizeof ev.size);
|
||||||
Read((uint8_t *)ev.buffer, ev.size);
|
jack_ringbuffer_read(m_buffer, (char *)&ev.time, sizeof ev.time);
|
||||||
|
jack_ringbuffer_read(m_buffer, (char *)ev.buffer, ev.size);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,70 +3,24 @@
|
||||||
#ifndef RINGBUFFER_H
|
#ifndef RINGBUFFER_H
|
||||||
#define RINGBUFFER_H
|
#define RINGBUFFER_H
|
||||||
|
|
||||||
|
#include <jack/ringbuffer.h>
|
||||||
|
|
||||||
class RingBuffer {
|
class RingBuffer {
|
||||||
private:
|
private:
|
||||||
uint8_t *m_buffer;
|
jack_ringbuffer_t *m_buffer;
|
||||||
uint8_t *m_end;
|
|
||||||
uint8_t *m_write;
|
|
||||||
uint8_t *m_read;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RingBuffer(size_t length)
|
RingBuffer(size_t length)
|
||||||
{
|
{
|
||||||
m_buffer = (uint8_t *)malloc(length);
|
m_buffer = jack_ringbuffer_create(length);
|
||||||
m_end = m_buffer + length;
|
|
||||||
m_write = m_buffer;
|
|
||||||
m_read = m_buffer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
~RingBuffer()
|
~RingBuffer()
|
||||||
{
|
{
|
||||||
free(m_buffer);
|
jack_ringbuffer_free(m_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Write(const uint8_t *buffer, size_t length)
|
bool PushEvent(const jack_midi_event_t &event);
|
||||||
{
|
|
||||||
while (length--) {
|
|
||||||
if (m_write == m_end) m_write = m_buffer;
|
|
||||||
*m_write++ = *buffer++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Read(uint8_t *buffer, size_t length)
|
|
||||||
{
|
|
||||||
while (length--) {
|
|
||||||
if (m_read == m_end) m_read = m_buffer;
|
|
||||||
*buffer++ = *m_read++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *Peek(uint8_t *buffer, size_t length, uint8_t *peek)
|
|
||||||
{
|
|
||||||
while (length--) {
|
|
||||||
if (peek == m_end) peek = m_buffer;
|
|
||||||
*buffer++ = *peek++;
|
|
||||||
}
|
|
||||||
return peek;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Size() const
|
|
||||||
{
|
|
||||||
if (m_write >= m_read) return m_write - m_read;
|
|
||||||
return (m_end - m_read) + (m_write - m_buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Free() const
|
|
||||||
{
|
|
||||||
return (m_end - m_buffer) - Size();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Reset()
|
|
||||||
{
|
|
||||||
m_write = m_buffer;
|
|
||||||
m_read = m_buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PushEvent(jack_midi_event_t &event);
|
|
||||||
bool PopEvent(jack_midi_event_t &event);
|
bool PopEvent(jack_midi_event_t &event);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue