diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2022-09-06 03:25:24 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2022-09-06 03:25:24 -0400 |
commit | 654e225093db165e0c38a658103025dd7233bc71 (patch) | |
tree | 3043a612a0a14bd79b0e7df158d26a5dbf6ab2a9 /src/discord/voiceclient.cpp | |
parent | e93b8715f9e42d25c0930becc22561f23a25a709 (diff) | |
download | abaddon-portaudio-654e225093db165e0c38a658103025dd7233bc71.tar.gz abaddon-portaudio-654e225093db165e0c38a658103025dd7233bc71.zip |
try to fix shutdown with select
Diffstat (limited to 'src/discord/voiceclient.cpp')
-rw-r--r-- | src/discord/voiceclient.cpp | 22 |
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 }); + } } } } |