Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
VoiceChatAudioRuntime.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "AudioRuntime.hpp"
4#include "Gsm610Codec.hpp"
5#include "VoiceChatPacket.hpp"
6
7#include <SDL3/SDL_audio.h>
8
9#include <cstdint>
10#include <expected>
11#include <memory>
12#include <span>
13#include <string>
14#include <unordered_map>
15#include <vector>
16
17namespace monopoly::voicechat
18{
20 {
21 public:
22 enum class Codec : std::uint8_t
23 {
24 Pcm,
25 Gsm610
26 };
27
28 struct Settings
29 {
31 float silenceThreshold{0.05F};
32 std::uint32_t volume{100};
33 std::uint32_t dimensions{};
34 std::uint32_t heraldDelayTicks{20};
35 std::uint32_t postSilenceDelayTicks{120};
36 std::uint32_t maxSilentTicks{360};
38 };
39
40 explicit AudioRuntime(audio::Runtime& audio) noexcept;
42
43 AudioRuntime(const AudioRuntime&) = delete;
45
46 [[nodiscard]] std::expected<void, std::string> startCapture(
47 Settings settings = {});
48 void stopCapture() noexcept;
49 [[nodiscard]] std::expected<void, std::string> pumpCapture(
50 std::uint64_t tick);
52
53 [[nodiscard]] bool handleEvent(
54 const packet::Event& event, std::uint32_t sourceId);
56
58 {
59 return true;
60 }
61
62 private:
63 enum class PostSilenceState : std::uint8_t
64 {
65 Silence,
66 Collecting,
67 Streaming
68 };
69
70 struct Receiver;
71
72 [[nodiscard]] std::expected<void, std::string> sendStartPacket();
73 [[nodiscard]] std::expected<void, std::string> sendData(
74 std::span<const std::uint8_t> bytes, bool afterSilence);
75 [[nodiscard]] std::expected<void, std::string> openReceiver(
76 const packet::Event& event, std::uint32_t sourceId);
77 [[nodiscard]] bool feedReceiver(
78 Receiver& receiver, std::span<const std::uint8_t> bytes,
79 bool cutToCurrentData);
80 void appendHerald(std::vector<std::uint8_t>& bytes) const;
81 [[nodiscard]] bool containsNoise(
82 std::span<const std::uint8_t> bytes) const noexcept;
83
84 audio::Runtime& audio_;
85 SDL_AudioStream* captureStream_{};
86 Settings settings_{};
87 PostSilenceState postSilenceState_{PostSilenceState::Silence};
88 std::uint64_t firstNoiseTick_{};
89 std::uint64_t lastNoiseTick_{};
90 std::vector<std::uint8_t> postSilenceStorage_;
91 std::unique_ptr<gsm610::Encoder> captureEncoder_;
92 std::unordered_map<std::uint32_t, std::unique_ptr<Receiver>> receivers_;
93 };
94}
std::vector< std::byte > bytes
unsigned index
static constexpr bool gsm610Supported() noexcept
AudioRuntime(const AudioRuntime &)=delete
AudioRuntime & operator=(const AudioRuntime &)=delete
std::expected< void, std::string > pumpCapture(std::uint64_t tick)
std::expected< void, std::string > startCapture(Settings settings={})
bool handleEvent(const packet::Event &event, std::uint32_t sourceId)