summaryrefslogtreecommitdiff
path: root/src/windows/voice/voicewindow.hpp
blob: 64b14a9cccdb4535ad2fa31a096bb0d146ce3858 (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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#pragma once
#include "discord/voicestate.hpp"
#ifdef WITH_VOICE
// clang-format off

#include "components/volumemeter.hpp"
#include "discord/snowflake.hpp"
#include <gtkmm/box.h>
#include <gtkmm/checkbutton.h>
#include <gtkmm/comboboxtext.h>
#include <gtkmm/listbox.h>
#include <gtkmm/menubar.h>
#include <gtkmm/progressbar.h>
#include <gtkmm/scale.h>
#include <gtkmm/scrolledwindow.h>
#include <gtkmm/window.h>
#include <unordered_set>
// clang-format on

class VoiceWindow : public Gtk::Window {
public:
    VoiceWindow(Snowflake channel_id);

private:
    void SetUsers(const std::unordered_set<Snowflake> &user_ids);

    Gtk::ListBoxRow *CreateSpeakerRow(Snowflake id);
    Gtk::ListBoxRow *CreateAudienceRow(Snowflake id);

    void OnUserConnect(Snowflake user_id, Snowflake to_channel_id);
    void OnUserDisconnect(Snowflake user_id, Snowflake from_channel_id);
    void OnSpeakerStateChanged(Snowflake channel_id, Snowflake user_id, bool is_speaker);
    void OnVoiceStateUpdate(Snowflake user_id, Snowflake channel_id, VoiceStateFlags flags);

    void OnMuteChanged();
    void OnDeafenChanged();

    void TryDeleteRow(Snowflake id);
    bool UpdateVoiceMeters();
    void UpdateVADParamValue();
    void UpdateStageCommand();

    Gtk::Box m_main;
    Gtk::Box m_controls;

    Gtk::CheckButton m_mute;
    Gtk::CheckButton m_deafen;

    Gtk::ScrolledWindow m_scroll;
    Gtk::VBox m_listing;
    Gtk::ListBox m_speakers_list;
    Gtk::ListBox m_audience_list;

    // Shows volume for gate VAD method
    // Shows probability for RNNoise VAD method
    VolumeMeter m_vad_value;
    // Volume threshold for gate VAD method
    // VAD probability threshold for RNNoise VAD method
    Gtk::Scale m_vad_param;
    Gtk::Scale m_capture_gain;

    Gtk::CheckButton m_noise_suppression;
    Gtk::CheckButton m_mix_mono;

    Gtk::HBox m_buttons;
    Gtk::Button m_disconnect;
    Gtk::Button m_stage_command;

    Gtk::VBox m_stage_invite_box;
    Gtk::Label m_stage_invite_lbl;
    Gtk::HBox m_stage_invite_btns;
    Gtk::Button m_stage_accept;
    Gtk::Button m_stage_decline;

    bool m_has_requested_to_speak = false;

    Gtk::ComboBoxText m_vad_combo;
    Gtk::ComboBox m_playback_combo;
    Gtk::ComboBox m_capture_combo;

    Snowflake m_channel_id;
    bool m_is_stage;

    std::unordered_map<Snowflake, Gtk::ListBoxRow *> m_rows;

    Gtk::MenuBar m_menu_bar;
    Gtk::MenuItem m_menu_view;
    Gtk::Menu m_menu_view_sub;
    Gtk::MenuItem m_menu_view_settings;

    Gtk::Label m_TMP_stagelabel;
    Gtk::Label m_speakers_label;
    Gtk::Label m_audience_label;

public:
    using type_signal_mute = sigc::signal<void(bool)>;
    using type_signal_deafen = sigc::signal<void(bool)>;
    using type_signal_mute_user_cs = sigc::signal<void(Snowflake, bool)>;
    using type_signal_user_volume_changed = sigc::signal<void(Snowflake, double)>;

    type_signal_mute signal_mute();
    type_signal_deafen signal_deafen();
    type_signal_mute_user_cs signal_mute_user_cs();
    type_signal_user_volume_changed signal_user_volume_changed();

private:
    type_signal_mute m_signal_mute;
    type_signal_deafen m_signal_deafen;
    type_signal_mute_user_cs m_signal_mute_user_cs;
    type_signal_user_volume_changed m_signal_user_volume_changed;
};
#endif