diff --git a/libs/ardour/ardour/audio_diskstream.h b/libs/ardour/ardour/audio_diskstream.h index 12ad418a75..bbf218b4de 100644 --- a/libs/ardour/ardour/audio_diskstream.h +++ b/libs/ardour/ardour/audio_diskstream.h @@ -205,17 +205,17 @@ class AudioDiskstream : public Diskstream Sample *current_capture_buffer; Sample *current_playback_buffer; - RingBufferNPT *playback_buf; - RingBufferNPT *capture_buf; + PBD::RingBufferNPT *playback_buf; + PBD::RingBufferNPT *capture_buf; Sample* scrub_buffer; Sample* scrub_forward_buffer; Sample* scrub_reverse_buffer; - RingBufferNPT::rw_vector playback_vector; - RingBufferNPT::rw_vector capture_vector; + PBD::RingBufferNPT::rw_vector playback_vector; + PBD::RingBufferNPT::rw_vector capture_vector; - RingBufferNPT * capture_transition_buf; + PBD::RingBufferNPT * capture_transition_buf; // the following are used in the butler thread only framecnt_t curr_capture_cnt; diff --git a/libs/ardour/ardour/buffer_manager.h b/libs/ardour/ardour/buffer_manager.h index f86d92ac23..362e716958 100644 --- a/libs/ardour/ardour/buffer_manager.h +++ b/libs/ardour/ardour/buffer_manager.h @@ -26,7 +26,7 @@ class BufferManager private: static Glib::StaticMutex rb_mutex; - typedef RingBufferNPT ThreadBufferFIFO; + typedef PBD::RingBufferNPT ThreadBufferFIFO; typedef std::list ThreadBufferList; static ThreadBufferFIFO* thread_buffers; diff --git a/libs/ardour/ardour/midi_ring_buffer.h b/libs/ardour/ardour/midi_ring_buffer.h index a809226a30..c9bd4db16e 100644 --- a/libs/ardour/ardour/midi_ring_buffer.h +++ b/libs/ardour/ardour/midi_ring_buffer.h @@ -51,7 +51,7 @@ public: inline bool read_contents(uint32_t size, uint8_t* buf); size_t read(MidiBuffer& dst, framepos_t start, framepos_t end, framecnt_t offset=0); - void dump(std::ostream& dst); + // void dump(std::ostream& dst); /** Set the channel filtering mode. * @param mask If mode is FilterChannels, each bit represents a midi channel: @@ -92,13 +92,19 @@ template inline bool MidiRingBuffer::read_prefix(T* time, Evoral::EventType* type, uint32_t* size) { - bool success = Evoral::EventRingBuffer::full_read(sizeof(T), (uint8_t*)time); - if (success) - success = Evoral::EventRingBuffer::full_read(sizeof(Evoral::EventType), (uint8_t*)type); - if (success) - success = Evoral::EventRingBuffer::full_read(sizeof(uint32_t), (uint8_t*)size); + if (PBD::RingBufferNPT::read((uint8_t*)time, sizeof(T)) != sizeof (T)) { + return false; + } - return success; + if (PBD::RingBufferNPT::read((uint8_t*)type, sizeof(Evoral::EventType)) != sizeof (Evoral::EventType)) { + return false; + } + + if (PBD::RingBufferNPT::read((uint8_t*)size, sizeof(uint32_t)) != sizeof (uint32_t)) { + return false; + } + + return true; } @@ -109,7 +115,7 @@ template inline bool MidiRingBuffer::read_contents(uint32_t size, uint8_t* buf) { - return Evoral::EventRingBuffer::full_read(size, buf); + return PBD::RingBufferNPT::read(buf, size) == size; } diff --git a/libs/ardour/midi_ring_buffer.cc b/libs/ardour/midi_ring_buffer.cc index a10ad0b199..a69b353995 100644 --- a/libs/ardour/midi_ring_buffer.cc +++ b/libs/ardour/midi_ring_buffer.cc @@ -76,7 +76,7 @@ MidiRingBuffer::read(MidiBuffer& dst, framepos_t start, framepos_t end, frame while (this->read_space() >= sizeof(T) + sizeof(Evoral::EventType) + sizeof(uint32_t)) { - this->full_peek(sizeof(T), (uint8_t*)&ev_time); + this->peek ((uint8_t*) &ev_time, sizeof (T)); if (ev_time + loop_offset >= end) { DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("MRB event @ %1 past end @ %2\n", ev_time, end)); @@ -107,7 +107,7 @@ MidiRingBuffer::read(MidiBuffer& dst, framepos_t start, framepos_t end, frame ev_time += loop_offset; uint8_t status; - success = this->full_peek(sizeof(uint8_t), &status); + success = this->peek (&status, sizeof(uint8_t)); assert(success); // If this failed, buffer is corrupt, all hope is lost // Ignore event if it doesn't match channel filter @@ -115,7 +115,7 @@ MidiRingBuffer::read(MidiBuffer& dst, framepos_t start, framepos_t end, frame const uint8_t channel = status & 0x0F; if (!(get_channel_mask() & (1L << channel))) { // cerr << "MRB skipping event due to channel mask" << endl; - this->skip(ev_size); // Advance read pointer to next event + this->increment_read_ptr (ev_size); // Advance read pointer to next event continue; } } @@ -129,7 +129,7 @@ MidiRingBuffer::read(MidiBuffer& dst, framepos_t start, framepos_t end, frame uint8_t* write_loc = dst.reserve(ev_time, ev_size); if (write_loc == NULL) { cerr << "MRB: Unable to reserve space in buffer, event skipped"; - this->skip (ev_size); // Advance read pointer to next event + this->increment_read_ptr (ev_size); // Advance read pointer to next event continue; } @@ -163,6 +163,8 @@ MidiRingBuffer::read(MidiBuffer& dst, framepos_t start, framepos_t end, frame return count; } + +#if 0 template void MidiRingBuffer::dump(ostream& str) @@ -240,7 +242,7 @@ MidiRingBuffer::dump(ostream& str) delete [] data; } } - +#endif template class MidiRingBuffer; diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc index 5ad5c2b745..e8dfab24bf 100644 --- a/libs/ardour/smf_source.cc +++ b/libs/ardour/smf_source.cc @@ -241,7 +241,7 @@ SMFSource::write_unlocked (MidiRingBuffer& source, framepos_t positi Evoral::MIDIEvent ev; while (true) { - bool ret = source.peek_time(&time); + bool ret = source.peek ((uint8_t*)&time, sizeof (time)); if (!ret || time > _last_write_end + duration) { break; } diff --git a/libs/evoral/evoral/EventRingBuffer.hpp b/libs/evoral/evoral/EventRingBuffer.hpp index b31c1c1b53..9f5588632a 100644 --- a/libs/evoral/evoral/EventRingBuffer.hpp +++ b/libs/evoral/evoral/EventRingBuffer.hpp @@ -18,61 +18,97 @@ #ifndef EVORAL_EVENT_RING_BUFFER_HPP #define EVORAL_EVENT_RING_BUFFER_HPP -#include "evoral/RingBuffer.hpp" #include "evoral/EventSink.hpp" #include "evoral/types.hpp" #include + +#include "pbd/ringbufferNPT.h" + using namespace std; namespace Evoral { - /** A RingBuffer of events (generic time-stamped binary "blobs"). * * This packs a timestamp, size, and size bytes of data flat into the buffer. * Useful for MIDI events, OSC messages, etc. + * + * Note: the uint8_t template argument to RingBufferNPT<> indicates "byte + * oriented data", not anything particular linked to MIDI or any other + * possible interpretation of uint8_t. */ template -class EventRingBuffer : public Evoral::RingBuffer, public Evoral::EventSink