summaryrefslogtreecommitdiff
path: root/src/audio/stream_message.cpp
blob: a7b8901ab6e5b8e2a1aecafa87e8565f03b18273 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
 * Copyright 2023 jacqueline <me@jacqueline.id.au>
 *
 * SPDX-License-Identifier: GPL-3.0-only
 */

#include "stream_message.hpp"

#include <cstdint>

#include "cbor.h"
#include "span.hpp"

namespace audio {

const int kEncoderFlags = 0;
const int kDecoderFlags = 0;

auto WriteTypeOnlyMessage(MessageType type, cpp::span<std::byte> data)
    -> cpp::result<size_t, CborError> {
  CborEncoder root;
  CborEncoder container;
  uint8_t* cast_data = reinterpret_cast<uint8_t*>(data.data());

  cbor_encoder_init(&root, cast_data, data.size(), kEncoderFlags);
  cbor_encode_uint(&container, type);

  return cbor_encoder_get_buffer_size(&root, cast_data);
}

auto ReadMessageType(cpp::span<std::byte> msg) -> MessageType {
  CborParser parser;
  CborValue root;
  CborValue container;

  cbor_parser_init(reinterpret_cast<uint8_t*>(msg.data()), msg.size(),
                   kDecoderFlags, &parser, &root);

  uint64_t header = 0;
  if (cbor_value_is_container(&root)) {
    cbor_value_enter_container(&root, &container);
    cbor_value_get_uint64(&container, &header);
  } else {
    cbor_value_get_uint64(&root, &header);
  }

  return static_cast<MessageType>(header);
}

auto GetAdditionalData(cpp::span<std::byte> msg) -> cpp::span<std::byte> {
  CborParser parser;
  CborValue root;
  uint8_t* cast_data = reinterpret_cast<uint8_t*>(msg.data());

  cbor_parser_init(cast_data, msg.size(), kDecoderFlags, &parser, &root);

  while (!cbor_value_at_end(&root)) {
    cbor_value_advance(&root);
  }

  const uint8_t* remaining = cbor_value_get_next_byte(&root);
  size_t header_size = remaining - cast_data;

  return cpp::span<std::byte>(msg.data() + header_size,
                              msg.size() - header_size);
}

}  // namespace audio