Skip to content

Commit d4e216e

Browse files
committed
aplay/mixer: participant add/rm print fixes
- do not print it in constructor/dtor - the participant may be moved - copy the stored address in copy constructor - use get_sockaddr_str + change its prototype - do not use thread_local vars but user provided buffer - also take (const sockaddr *) in the get_sockaddr_str and get_sockaddr_addr_* functions (participants iterated by const iterator returning const participant reference)
1 parent a68f76c commit d4e216e

File tree

5 files changed

+48
-35
lines changed

5 files changed

+48
-35
lines changed

src/audio/playback/mixer.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@
6565
#include "transmit.h"
6666
#include "types.h" // for tx_media_type
6767
#include "utils/audio_buffer.h"
68-
#include "utils/macros.h" // for STR_LEN
6968
#include "utils/net.h" // for get_sockaddr_addr_str
7069
#include "utils/thread.h"
7170

@@ -128,7 +127,7 @@ static void mixer_dummy_rtp_callback(struct rtp *session [[gnu::unused]], rtp_ev
128127
struct am_participant {
129128
am_participant(struct socket_udp_local *l, struct sockaddr_storage *ss,
130129
string const &audio_codec)
131-
: remote_addr(*ss)
130+
: m_remote_addr(*ss)
132131
{
133132
assert(l != nullptr && ss != nullptr);
134133
m_buffer = audio_buffer_init(SAMPLE_RATE, BPS, CHANNELS, get_commandline_param("low-latency-audio") ? 50 : 5);
@@ -147,12 +146,6 @@ struct am_participant {
147146
LOG(LOG_LEVEL_ERROR) << "Audio coder init failed!\n";
148147
throw 1;
149148
}
150-
151-
char buf[STR_LEN];
152-
MSG(NOTICE, "added participant: %s:%u\n",
153-
get_sockaddr_addr_str((struct sockaddr *) ss, buf,
154-
sizeof buf),
155-
get_sockaddr_addr_port((struct sockaddr *) ss));
156149
}
157150
~am_participant() {
158151
if (m_tx_session) {
@@ -167,18 +160,14 @@ struct am_participant {
167160
if (m_audio_coder) {
168161
audio_codec_done(m_audio_coder);
169162
}
170-
char buf[STR_LEN];
171-
MSG(NOTICE, "removed participant: %s:%u\n",
172-
get_sockaddr_addr_str((struct sockaddr *) &remote_addr, buf,
173-
sizeof buf),
174-
get_sockaddr_addr_port((struct sockaddr *) &remote_addr));
175163
}
176164
am_participant& operator=(am_participant&& other) {
177165
m_audio_coder = std::move(other.m_audio_coder);
178166
m_buffer = std::move(other.m_buffer);
179167
m_network_device = std::move(other.m_network_device);
180168
m_tx_session = std::move(other.m_tx_session);
181169
last_seen = std::move(other.last_seen);
170+
m_remote_addr = std::move(other.m_remote_addr);
182171
other.m_audio_coder = nullptr;
183172
other.m_buffer = nullptr;
184173
other.m_tx_session = nullptr;
@@ -188,7 +177,7 @@ struct am_participant {
188177
am_participant(am_participant && other) {
189178
*this = std::move(other);
190179
}
191-
struct sockaddr_storage remote_addr;
180+
struct sockaddr_storage m_remote_addr;
192181
struct audio_codec_state *m_audio_coder;
193182
struct audio_buffer *m_buffer;
194183
struct rtp *m_network_device;
@@ -331,6 +320,12 @@ void state_audio_mixer::worker()
331320
for (auto it = participants.cbegin(); it != participants.cend(); )
332321
{
333322
if (duration_cast<seconds>(now - it->second.last_seen).count() > PARTICIPANT_TIMEOUT_S) {
323+
char buf[ADDR_STR_BUF_LEN];
324+
MSG(NOTICE, "removed participant: %s\n",
325+
get_sockaddr_str(
326+
(const struct sockaddr *) &it->second
327+
.m_remote_addr,
328+
buf, sizeof buf));
334329
it = participants.erase(it);
335330
} else {
336331
++it;
@@ -441,6 +436,11 @@ static void audio_play_mixer_put_frame(void *state, const struct audio_frame *fr
441436
auto ss = *(struct sockaddr_storage *) frame->network_source;
442437

443438
if (s->participants.find(ss) == s->participants.end()) {
439+
char buf[ADDR_STR_BUF_LEN];
440+
MSG(NOTICE, "added participant: %s\n",
441+
get_sockaddr_str(
442+
(struct sockaddr *) &ss, buf,
443+
sizeof buf));
444444
s->participants.emplace(ss, am_participant{s->recv_socket, &ss, s->audio_codec});
445445
}
446446

src/hd-rum-translator/hd-rum-translator.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -918,7 +918,10 @@ class Participant_manager{
918918

919919
log_msg(LOG_LEVEL_NOTICE, "New participant\n");
920920
std::string msg = "create-port ";
921-
msg += get_sockaddr_str(reinterpret_cast<sockaddr *>(&sin));
921+
char buf[ADDR_STR_BUF_LEN];
922+
msg +=
923+
get_sockaddr_str(reinterpret_cast<sockaddr *>(&sin),
924+
buf, sizeof buf);
922925
if(!compression.empty()){
923926
msg += " ";
924927
msg += compression;

src/rtp/rtp.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1573,7 +1573,9 @@ static void rtp_process_data(struct rtp *session, uint32_t curr_rtp_ts,
15731573
if (!rtp_has_receiver(session)) {
15741574
session->opt->send_back = FALSE; // avoid multiple checks if already sending
15751575
struct sockaddr *sa = (struct sockaddr *)(void *)((char *) packet + RTP_MAX_PACKET_LEN);
1576-
log_msg(LOG_LEVEL_NOTICE, "[RTP] Redirecting stream to a client %s.\n", get_sockaddr_str(sa));
1576+
MSG(NOTICE, "Redirecting stream to a client %s.\n",
1577+
get_sockaddr_str(sa, (char[ADDR_STR_BUF_LEN]){ 0 },
1578+
ADDR_STR_BUF_LEN));
15771579
udp_set_receiver(session->rtp_socket, sa, sa->sa_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6));
15781580
}
15791581

src/utils/net.c

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -411,12 +411,14 @@ bool is_ipv6_supported(void)
411411
return true;
412412
}
413413

414-
unsigned get_sockaddr_addr_port(struct sockaddr *sa){
414+
unsigned get_sockaddr_addr_port(const struct sockaddr *sa){
415415
unsigned port = 0;
416416
if (sa->sa_family == AF_INET6) {
417-
port = ntohs(((struct sockaddr_in6 *)(void *) sa)->sin6_port);
417+
port = ntohs(((const struct sockaddr_in6 *) (const void *) sa)
418+
->sin6_port);
418419
} else if (sa->sa_family == AF_INET) {
419-
port = ntohs(((struct sockaddr_in *)(void *) sa)->sin_port);
420+
port = ntohs(
421+
((const struct sockaddr_in *) (const void *) sa)->sin_port);
420422
} else {
421423
return UINT_MAX;
422424
}
@@ -428,15 +430,17 @@ unsigned get_sockaddr_addr_port(struct sockaddr *sa){
428430
* @returns the input buffer (buf)
429431
*/
430432
char *
431-
get_sockaddr_addr_str(struct sockaddr *sa, char *buf, size_t n)
433+
get_sockaddr_addr_str(const struct sockaddr *sa, char *buf, size_t n)
432434
{
433435
assert(n >= IN6_MAX_ASCII_LEN + 3 /* []: */ + 1 /* \0 */);
434436
const void *src = NULL;
435437
if (sa->sa_family == AF_INET6) {
436438
snprintf(buf, n, "[");
437-
src = &((struct sockaddr_in6 *)(void *) sa)->sin6_addr;
439+
src = &((const struct sockaddr_in6 *) (const void *) sa)
440+
->sin6_addr;
438441
} else if (sa->sa_family == AF_INET) {
439-
src = &((struct sockaddr_in *)(void *) sa)->sin_addr;
442+
src =
443+
&((const struct sockaddr_in *) (const void *) sa)->sin_addr;
440444
} else {
441445
snprintf(buf, n, "(unknown)");
442446
return buf;
@@ -453,20 +457,20 @@ get_sockaddr_addr_str(struct sockaddr *sa, char *buf, size_t n)
453457
return buf;
454458
}
455459

456-
const char *get_sockaddr_str(struct sockaddr *sa)
460+
/**
461+
* @returns the input buffer (buf)
462+
*/
463+
char *
464+
get_sockaddr_str(const struct sockaddr *sa, char *buf, size_t n)
457465
{
458-
enum { ADDR_LEN = IN6_MAX_ASCII_LEN + 3 /* []: */ + 5 /* port */ + 1 /* \0 */ };
459-
_Thread_local static char addr[ADDR_LEN] = "";
460-
addr[0] = '\0';
461-
462-
get_sockaddr_addr_str(sa, addr, sizeof(addr));
466+
get_sockaddr_addr_str(sa, buf, n);
463467

464468
unsigned port = get_sockaddr_addr_port(sa);
465469
if(port == UINT_MAX)
466-
return addr;
467-
snprintf(addr + strlen(addr), ADDR_LEN - strlen(addr), ":%u", port);
470+
return buf;
471+
snprintf(buf + strlen(buf), n - strlen(buf), ":%u", port);
468472

469-
return addr;
473+
return buf;
470474
}
471475

472476
const char *ug_gai_strerror(int errcode)

src/utils/net.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,11 @@
4747
#include <stdint.h>
4848
#endif // __cplusplus
4949

50-
#define IN6_MAX_ASCII_LEN 39 // 32 nibbles + 7 colons
50+
enum {
51+
IN6_MAX_ASCII_LEN = 39, // 32 nibbles + 7 colons
52+
ADDR_STR_BUF_LEN =
53+
IN6_MAX_ASCII_LEN + 3 /* []: */ + 5 /* port */ + 1 /* \0 */,
54+
};
5155
// RFC 6666 prefix 100::/64, suffix 'UltrGrS'
5256
#define IN6_BLACKHOLE_SERVER_MODE_STR "100::556C:7472:4772:6453"
5357

@@ -66,9 +70,9 @@ bool is_host_private(const char *hostname);
6670
uint16_t socket_get_recv_port(int fd);
6771
bool get_local_addresses(struct sockaddr_storage *addrs, size_t *len, int ip_version);
6872
bool is_ipv6_supported(void);
69-
char *get_sockaddr_addr_str(struct sockaddr *sa, char *buf, size_t n);
70-
unsigned get_sockaddr_addr_port(struct sockaddr *sa);
71-
const char *get_sockaddr_str(struct sockaddr *sa);
73+
char *get_sockaddr_addr_str(const struct sockaddr *sa, char *buf, size_t n);
74+
unsigned get_sockaddr_addr_port(const struct sockaddr *sa);
75+
char *get_sockaddr_str(const struct sockaddr *sa, char *buf, size_t n);
7276
const char *ug_gai_strerror(int errcode);
7377

7478
#ifdef _WIN32

0 commit comments

Comments
 (0)