summaryrefslogtreecommitdiff
path: root/src/discord
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2022-09-06 03:25:24 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2022-09-06 03:25:24 -0400
commit654e225093db165e0c38a658103025dd7233bc71 (patch)
tree3043a612a0a14bd79b0e7df158d26a5dbf6ab2a9 /src/discord
parente93b8715f9e42d25c0930becc22561f23a25a709 (diff)
downloadabaddon-portaudio-654e225093db165e0c38a658103025dd7233bc71.tar.gz
abaddon-portaudio-654e225093db165e0c38a658103025dd7233bc71.zip
try to fix shutdown with select
Diffstat (limited to 'src/discord')
-rw-r--r--src/discord/voiceclient.cpp22
1 files changed, 14 insertions, 8 deletions
diff --git a/src/discord/voiceclient.cpp b/src/discord/voiceclient.cpp
index 3f38eea..b899638 100644
--- a/src/discord/voiceclient.cpp
+++ b/src/discord/voiceclient.cpp
@@ -92,22 +92,28 @@ std::vector<uint8_t> UDPSocket::Receive() {
void UDPSocket::Stop() {
m_running = false;
- #ifdef _WIN32
- shutdown(m_socket, SD_BOTH);
- #else
- shutdown(m_socket, SHUT_RDWR);
- #endif
if (m_thread.joinable()) m_thread.join();
}
void UDPSocket::ReadThread() {
+ timeval tv;
while (m_running) {
static std::array<uint8_t, 4096> buf;
sockaddr_in from;
socklen_t addrlen = sizeof(from);
- int n = recvfrom(m_socket, reinterpret_cast<char *>(buf.data()), sizeof(buf), 0, reinterpret_cast<sockaddr *>(&from), &addrlen);
- if (n > 0 && S_ADDR(from) == S_ADDR(m_server) && from.sin_port == m_server.sin_port) {
- m_signal_data.emit({ buf.begin(), buf.begin() + n });
+
+ tv.tv_sec = 0;
+ tv.tv_usec = 1000000;
+
+ fd_set read_fds;
+ FD_ZERO(&read_fds);
+ FD_SET(m_socket, &read_fds);
+
+ if (select(m_socket + 1, &read_fds, nullptr, nullptr, &tv) > 0) {
+ int n = recvfrom(m_socket, reinterpret_cast<char *>(buf.data()), sizeof(buf), 0, reinterpret_cast<sockaddr *>(&from), &addrlen);
+ if (n > 0 && S_ADDR(from) == S_ADDR(m_server) && from.sin_port == m_server.sin_port) {
+ m_signal_data.emit({ buf.begin(), buf.begin() + n });
+ }
}
}
}