Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
sysex_chunk_assembler.hpp
Go to the documentation of this file.
1#pragma once
2
12
13#include <cstddef>
14#include <cstdint>
15#include <vector>
16
17namespace pulp::midi {
18
20 public:
23 static constexpr std::size_t kMaxMessageBytes = 1u << 20;
24
27 bool append(const std::uint8_t* data, std::size_t count) {
28 if (count == 0)
29 return false;
30 if (complete_) { // previous message was never taken; discard it
31 buffer_.clear();
32 complete_ = false;
33 }
34 for (std::size_t i = 0; i < count; ++i) {
35 const std::uint8_t b = data[i];
36 if (b >= 0xF8)
37 continue; // real-time bytes are not part of the message
38 if (b == 0xF0) {
39 // A new start discards anything unterminated before it.
40 buffer_.clear();
41 dropping_ = false;
42 buffer_.push_back(b);
43 continue;
44 }
45 if (buffer_.empty() && !dropping_)
46 continue; // stray bytes outside a message
47 if (b == 0xF7) {
48 if (dropping_) {
49 dropping_ = false;
50 continue;
51 }
52 buffer_.push_back(b);
53 complete_ = true;
54 // The driver ends a buffer at F7, so nothing follows it here.
55 return true;
56 }
57 if (b >= 0x80) { // another status byte aborts the message
58 buffer_.clear();
59 dropping_ = false;
60 continue;
61 }
62 if (dropping_)
63 continue;
64 if (buffer_.size() >= kMaxMessageBytes) {
65 buffer_.clear();
66 dropping_ = true;
67 continue;
68 }
69 buffer_.push_back(b);
70 }
71 return false;
72 }
73
74 const std::vector<std::uint8_t>& message() const {
75 return buffer_;
76 }
77
79 std::vector<std::uint8_t> take() {
80 std::vector<std::uint8_t> out;
81 out.swap(buffer_);
82 complete_ = false;
83 return out;
84 }
85
87 bool in_progress() const {
88 return !buffer_.empty() && !complete_;
89 }
90
91 void reset() {
92 buffer_.clear();
93 dropping_ = false;
94 complete_ = false;
95 }
96
97 private:
98 std::vector<std::uint8_t> buffer_;
99 bool dropping_ = false;
100 bool complete_ = false;
101};
102
103} // namespace pulp::midi
Definition sysex_chunk_assembler.hpp:19
const std::vector< std::uint8_t > & message() const
Definition sysex_chunk_assembler.hpp:74
bool in_progress() const
True while an F0 has been seen without its F7.
Definition sysex_chunk_assembler.hpp:87
static constexpr std::size_t kMaxMessageBytes
Longest message kept.
Definition sysex_chunk_assembler.hpp:23
void reset()
Definition sysex_chunk_assembler.hpp:91
bool append(const std::uint8_t *data, std::size_t count)
Append one returned buffer.
Definition sysex_chunk_assembler.hpp:27
std::vector< std::uint8_t > take()
Take the completed message and reset for the next one.
Definition sysex_chunk_assembler.hpp:79
Definition custom_node_events.hpp:26