Skip to content

Commit

Permalink
Merge branch 'master' into stages
Browse files Browse the repository at this point in the history
  • Loading branch information
ouwou committed Apr 14, 2024
2 parents 5652134 + 5e382b1 commit 02fd49b
Show file tree
Hide file tree
Showing 15 changed files with 62 additions and 193 deletions.
6 changes: 0 additions & 6 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,6 @@ if (WIN32)
add_compile_definitions(NOMINMAX)
endif ()

include(TestBigEndian)
test_big_endian(IS_BIG_ENDIAN)
if (IS_BIG_ENDIAN)
add_compile_definitions(ABADDON_IS_BIG_ENDIAN)
endif ()

configure_file(${PROJECT_SOURCE_DIR}/src/config.h.in ${PROJECT_BINARY_DIR}/config.h)

file(GLOB_RECURSE ABADDON_SOURCES
Expand Down
22 changes: 15 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ the result of fundamental issues with Discord's thread implementation.
#### Linux:

1. Install dependencies
* On Ubuntu 22.04 (Jammy) and newer:
* On Ubuntu 22.04 (Jammy)/Debian 12 (bookworm) and newer:
```Shell
$ sudo apt install g++ cmake libgtkmm-3.0-dev libcurl4-gnutls-dev libsqlite3-dev libssl-dev nlohmann-json3-dev libhandy-1-dev libsecret-1-dev libopus-dev libsodium-dev libspdlog-dev
```
Expand Down Expand Up @@ -173,6 +173,9 @@ spam filter's wrath:
### Styling
<details>
<summary>Show all styles</summary>
#### CSS selectors
| Selector | Description |
Expand Down Expand Up @@ -257,6 +260,8 @@ Used in profile popup:
| `.profile-badges` | Container for badges |
| `.profile-badge` | |

</details>

### Settings

Settings are configured (for now) by editing `abaddon.ini`.
Expand All @@ -270,6 +275,9 @@ The format is similar to the standard Windows ini format **except**:
This listing is organized by section.
For example, memory_db would be set by adding `memory_db = true` under the line `[discord]`
<details>
<summary>Show all settings</summary>
#### discord
| Setting | Type | Default | Description |
Expand Down Expand Up @@ -330,12 +338,10 @@ For example, memory_db would be set by adding `memory_db = true` under the line
#### voice
| Setting | Type | Default | Description |
|--------------------------|--------|------------------------------------|----------------------------------------------------------------------------------------------------------------------------|
| `vad` | string | rnnoise if enabled, gate otherwise | Method used for voice activity detection. Changeable in UI |
| `backends` | string | empty | Change backend priority when initializing miniaudio: `wasapi;dsound;winmm;coreaudio;sndio;audio4;oss;pulseaudio;alsa;jack` |
| `jitter_latency_desired` | int | 50 | Desired/Minimum latency for jitter buffer (in milliseconds) |
| `jitter_latency_maximum` | int | 200 | Maximum latency for jitter buffer before frames are discarded (in milliseconds) |
| Setting | Type | Default | Description |
|------------|--------|------------------------------------|----------------------------------------------------------------------------------------------------------------------------|
| `vad` | string | rnnoise if enabled, gate otherwise | Method used for voice activity detection. Changeable in UI |
| `backends` | string | empty | Change backend priority when initializing miniaudio: `wasapi;dsound;winmm;coreaudio;sndio;audio4;oss;pulseaudio;alsa;jack` |
#### windows
Expand All @@ -349,3 +355,5 @@ For example, memory_db would be set by adding `memory_db = true` under the line
|------------------|------------------------------------------------------------------------------|
| `ABADDON_NO_FC` | (Windows only) don't use custom font config |
| `ABADDON_CONFIG` | change path of configuration file to use. relative to cwd or can be absolute |

</details>
Binary file added res/fonts/Twemoji-15.0.3.ttf
Binary file not shown.
Binary file removed res/fonts/TwitterColorEmoji.ttf
Binary file not shown.
5 changes: 4 additions & 1 deletion res/fonts/conf.d/10-scale-bitmap-fonts.conf
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@
<bool>false</bool>
</test>
<edit name="pixelsizefixupfactor" mode="assign">
<double>0.15</double>
<divide>
<name target="pattern">pixelsize</name>
<name target="font" >pixelsize</name>
</divide>
</edit>
</match>
<!--
Expand Down
2 changes: 1 addition & 1 deletion res/fonts/conf.d/55-emoji-prepend.conf
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<fontconfig>
<match>
<edit name="family" mode="prepend" binding="weak">
<string>Twitter Color Emoji</string>
<string>Twemoji 128</string>
</edit>
</match>
</fontconfig>
Binary file renamed res/res/emojis.bin → res/res/emojis.db
Binary file not shown.
2 changes: 1 addition & 1 deletion src/abaddon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ void macOSThemeChangedCallback(CFNotificationCenterRef center, void *observer, C
Abaddon::Abaddon()
: m_settings(Platform::FindConfigFile())
, m_discord(GetSettings().UseMemoryDB) // stupid but easy
, m_emojis(GetResPath("/emojis.bin"))
, m_emojis(GetResPath("/emojis.db"))
#ifdef WITH_VOICE
, m_audio(GetSettings().Backends)
#endif
Expand Down
82 changes: 0 additions & 82 deletions src/audio/jitterbuffer.hpp

This file was deleted.

22 changes: 6 additions & 16 deletions src/audio/manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ const uint8_t *StripRTPExtensionHeader(const uint8_t *buf, int num_bytes, size_t
return buf;
}

// frameCount is configured to be 480 samples per channel
void data_callback(ma_device *pDevice, void *pOutput, const void *pInput, ma_uint32 frameCount) {
AudioManager *mgr = reinterpret_cast<AudioManager *>(pDevice->pUserData);
if (mgr == nullptr) return;
Expand All @@ -38,14 +37,12 @@ void data_callback(ma_device *pDevice, void *pOutput, const void *pInput, ma_uin
if (const auto vol_it = mgr->m_volume_ssrc.find(ssrc); vol_it != mgr->m_volume_ssrc.end()) {
volume = vol_it->second;
}

static std::array<int16_t, 480 * 2> buf;

if (!pair.first.PopSamples(buf.data(), 480 * 2)) continue;

for (size_t i = 0; i < 480 * 2; i++) {
auto &buf = pair.first;
const size_t n = std::min(static_cast<size_t>(buf.size()), static_cast<size_t>(frameCount * 2ULL));
for (size_t i = 0; i < n; i++) {
pOutputF32[i] += volume * buf[i] / 32768.F;
}
buf.erase(buf.begin(), buf.begin() + n);
}
}

Expand Down Expand Up @@ -205,14 +202,7 @@ void AudioManager::AddSSRC(uint32_t ssrc) {
int error;
if (m_sources.find(ssrc) == m_sources.end()) {
auto *decoder = opus_decoder_create(48000, 2, &error);
auto &s = Abaddon::Get().GetSettings();
m_sources.insert(std::make_pair(ssrc, std::make_pair(
JitterBuffer<int16_t>(
s.JitterDesiredLatency,
s.JitterMaximumLatency,
2,
48000),
decoder)));
m_sources.insert(std::make_pair(ssrc, std::make_pair(std::deque<int16_t> {}, decoder)));
}
}

Expand Down Expand Up @@ -252,7 +242,7 @@ void AudioManager::FeedMeOpus(uint32_t ssrc, const std::vector<uint8_t> &data) {
} else {
UpdateReceiveVolume(ssrc, pcm.data(), decoded);
auto &buf = it->second.first;
buf.PushSamples(pcm.data(), decoded * 2);
buf.insert(buf.end(), pcm.begin(), pcm.begin() + decoded * 2);
}
}
}
Expand Down
3 changes: 1 addition & 2 deletions src/audio/manager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
#endif

#include "devices.hpp"
#include "jitterbuffer.hpp"
// clang-format on

class AudioManager {
Expand Down Expand Up @@ -137,7 +136,7 @@ class AudioManager {
mutable std::mutex m_rnn_mutex;
#endif

std::unordered_map<uint32_t, std::pair<JitterBuffer<int16_t>, OpusDecoder *>> m_sources;
std::unordered_map<uint32_t, std::pair<std::deque<int16_t>, OpusDecoder *>> m_sources;

OpusEncoder *m_encoder;

Expand Down
96 changes: 27 additions & 69 deletions src/emojis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,90 +5,48 @@

#include <gdkmm/pixbufloader.h>

#ifdef ABADDON_IS_BIG_ENDIAN
/* Allows processing emojis.bin correctly on big-endian systems. */
int emojis_int32_correct_endian(int little_endian_in) {
/* this does the same thing as __bswap_32() but can be done without
non-standard headers. */
return ((little_endian_in >> 24) & 0xff) | // move byte 3 to byte 0
((little_endian_in << 8) & 0xff0000) | // move byte 1 to byte 2
((little_endian_in >> 8) & 0xff00) | // move byte 2 to byte 1
((little_endian_in << 24) & 0xff000000); // byte 0 to byte 3
}
#else
int emojis_int32_correct_endian(int little_endian_in) {
return little_endian_in;
}
#endif

EmojiResource::EmojiResource(std::string filepath)
: m_filepath(std::move(filepath)) {}

bool EmojiResource::Load() {
m_fp = std::fopen(m_filepath.c_str(), "rb");
if (m_fp == nullptr) return false;

int index_offset;
std::fread(&index_offset, 4, 1, m_fp);
index_offset = emojis_int32_correct_endian(index_offset);
std::fseek(m_fp, index_offset, SEEK_SET);

int emojis_count;
std::fread(&emojis_count, 4, 1, m_fp);
emojis_count = emojis_int32_correct_endian(emojis_count);
for (int i = 0; i < emojis_count; i++) {
std::vector<std::string> shortcodes;

int shortcodes_count;
std::fread(&shortcodes_count, 4, 1, m_fp);
shortcodes_count = emojis_int32_correct_endian(shortcodes_count);
for (int j = 0; j < shortcodes_count; j++) {
int shortcode_length;
std::fread(&shortcode_length, 4, 1, m_fp);
shortcode_length = emojis_int32_correct_endian(shortcode_length);
std::string shortcode(shortcode_length, '\0');
std::fread(shortcode.data(), shortcode_length, 1, m_fp);
shortcodes.push_back(std::move(shortcode));
}

int surrogates_count;
std::fread(&surrogates_count, 4, 1, m_fp);
surrogates_count = emojis_int32_correct_endian(surrogates_count);
std::string surrogates(surrogates_count, '\0');
std::fread(surrogates.data(), surrogates_count, 1, m_fp);
m_patterns.emplace_back(surrogates);
EmojiResource::~EmojiResource() {
sqlite3_finalize(m_get_emoji_stmt);
sqlite3_close(m_db);
}

int data_size, data_offset;
std::fread(&data_size, 4, 1, m_fp);
data_size = emojis_int32_correct_endian(data_size);
std::fread(&data_offset, 4, 1, m_fp);
data_offset = emojis_int32_correct_endian(data_offset);
m_index[surrogates] = { data_offset, data_size };
bool EmojiResource::Load() {
if (sqlite3_open(m_filepath.c_str(), &m_db) != SQLITE_OK) return false;

for (const auto &shortcode : shortcodes)
m_shortcode_index[shortcode] = surrogates;
if (sqlite3_prepare_v2(m_db, "SELECT data FROM emoji_data WHERE emoji = ?", -1, &m_get_emoji_stmt, nullptr) != SQLITE_OK) return false;

m_pattern_shortcode_index[surrogates] = std::move(shortcodes);
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(m_db, "SELECT * FROM emoji_shortcodes", -1, &stmt, nullptr) != SQLITE_OK) return false;
while (sqlite3_step(stmt) == SQLITE_ROW) {
std::string shortcode = reinterpret_cast<const char *>(sqlite3_column_text(stmt, 0));
std::string emoji = reinterpret_cast<const char *>(sqlite3_column_text(stmt, 1));
m_shortcode_index[shortcode] = emoji;
m_pattern_shortcode_index[emoji].push_back(shortcode);
}
sqlite3_finalize(stmt);

std::sort(m_patterns.begin(), m_patterns.end(), [](const Glib::ustring &a, const Glib::ustring &b) {
return a.size() > b.size();
});

return true;
}

Glib::RefPtr<Gdk::Pixbuf> EmojiResource::GetPixBuf(const Glib::ustring &pattern) {
const auto it = m_index.find(pattern);
if (it == m_index.end()) return {};
const int pos = it->second.first;
const int len = it->second.second;
std::fseek(m_fp, pos, SEEK_SET);
std::vector<uint8_t> data(len);
std::fread(data.data(), len, 1, m_fp);
auto loader = Gdk::PixbufLoader::create();
loader->write(static_cast<const guint8 *>(data.data()), data.size());
loader->close();
return loader->get_pixbuf();
if (sqlite3_reset(m_get_emoji_stmt) != SQLITE_OK) return {};
if (sqlite3_bind_text(m_get_emoji_stmt, 1, pattern.c_str(), -1, nullptr) != SQLITE_OK) return {};
if (sqlite3_step(m_get_emoji_stmt) != SQLITE_ROW) return {};
if (const void *blob = sqlite3_column_blob(m_get_emoji_stmt, 0)) {
const int bytes = sqlite3_column_bytes(m_get_emoji_stmt, 0);
auto loader = Gdk::PixbufLoader::create();
loader->write(static_cast<const guint8 *>(blob), bytes);
loader->close();
return loader->get_pixbuf();
}
return {};
}

void EmojiResource::ReplaceEmojis(Glib::RefPtr<Gtk::TextBuffer> buf, int size) {
Expand Down
Loading

0 comments on commit 02fd49b

Please sign in to comment.