summaryrefslogtreecommitdiffstats
path: root/src/server/Buffer.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/Buffer.hpp')
-rw-r--r--src/server/Buffer.hpp40
1 files changed, 20 insertions, 20 deletions
diff --git a/src/server/Buffer.hpp b/src/server/Buffer.hpp
index ada8a43d..11037dd1 100644
--- a/src/server/Buffer.hpp
+++ b/src/server/Buffer.hpp
@@ -45,7 +45,9 @@ public:
Buffer(BufferFactory& bufs,
LV2_URID type,
LV2_URID value_type,
- uint32_t capacity);
+ uint32_t capacity,
+ bool external = false,
+ void* buf = NULL);
void clear();
void resize(uint32_t size);
@@ -73,18 +75,12 @@ public:
return _type == _factory.uris().atom_Sequence;
}
- inline bool empty() const {
- return (_atom->type != _type ||
- (_type == _factory.uris().atom_Sequence &&
- _atom->size <= sizeof(LV2_Atom_Sequence_Body)));
- }
-
- /// Audio buffers only
+ /// Audio or float buffers only
inline const Sample* samples() const {
if (is_control()) {
- return (const Sample*)LV2_ATOM_BODY_CONST(atom());
+ return (const Sample*)LV2_ATOM_BODY_CONST(get<LV2_Atom_Float>());
} else if (is_audio()) {
- return (const Sample*)LV2_ATOM_CONTENTS_CONST(LV2_Atom_Vector, atom());
+ return (const Sample*)_buf;
}
return NULL;
}
@@ -92,9 +88,9 @@ public:
/// Audio buffers only
inline Sample* samples() {
if (is_control()) {
- return (Sample*)LV2_ATOM_BODY(atom());
+ return (Sample*)LV2_ATOM_BODY(get<LV2_Atom_Float>());
} else if (is_audio()) {
- return (Sample*)LV2_ATOM_CONTENTS(LV2_Atom_Vector, atom());
+ return (Sample*)_buf;
}
return NULL;
}
@@ -104,7 +100,7 @@ public:
if (is_control()) {
return 1;
} else if (is_audio()) {
- return (_capacity - sizeof(LV2_Atom_Vector)) / sizeof(Sample);
+ return (_capacity / sizeof(Sample));
}
return 0;
}
@@ -152,8 +148,9 @@ public:
{
if (add) {
add_block(val, start, end);
+ } else {
+ set_block(val, start, end);
}
- set_block(val, start, end);
}
/// Audio buffers only
@@ -184,11 +181,13 @@ public:
/// Set/add to audio buffer from the Sequence of Float in `src`
void render_sequence(const Context& context, const Buffer* src, bool add);
- LV2_Atom* atom() { return _atom; }
- const LV2_Atom* atom() const { return _atom; }
-
void set_capacity(uint32_t capacity) { _capacity = capacity; }
+ void set_buffer(void* buf) { assert(_external); _buf = buf; }
+
+ template<typename T> const T* get() const { return reinterpret_cast<const T*>(_buf); }
+ template<typename T> T* get() { return reinterpret_cast<T*>(_buf); }
+
inline void ref() { ++_refs; }
inline void deref() {
@@ -199,7 +198,7 @@ public:
protected:
BufferFactory& _factory;
- LV2_Atom* _atom;
+ void* _buf;
LV2_URID _type;
LV2_URID _value_type;
uint32_t _capacity;
@@ -213,8 +212,9 @@ protected:
private:
void recycle();
- Buffer* _next; ///< Intrusive linked list for BufferFactory
- std::atomic<unsigned> _refs; ///< Intrusive reference count
+ Buffer* _next; ///< Intrusive linked list for BufferFactory
+ std::atomic<unsigned> _refs; ///< Intrusive reference count
+ bool _external; ///< Buffer is externally allocated
};
} // namespace Server