From d35e5145492c511639b7446fe106bdbdb7183dde Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 9 Jun 2023 12:26:39 +0200 Subject: [PATCH] module-netjack2: samples are transmitted in little endian So swap them on big endian. --- src/modules/module-netjack2/peer.c | 41 +++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/modules/module-netjack2/peer.c b/src/modules/module-netjack2/peer.c index cdc2fd597..d1a34c49c 100644 --- a/src/modules/module-netjack2/peer.c +++ b/src/modules/module-netjack2/peer.c @@ -1,22 +1,51 @@ +#include + struct volume { bool mute; uint32_t n_volumes; float volumes[SPA_AUDIO_MAX_CHANNELS]; }; -static inline void do_volume(float *dst, const float *src, struct volume *vol, uint32_t ch, uint32_t n_samples) +static inline float bswap_f32(float f) +{ + union { + float f; + uint32_t u; + } v; + v.f = f; + v.u = bswap_32(v.u); + return v.f; +} + +static inline void do_volume(float *dst, const float *src, struct volume *vol, uint32_t ch, uint32_t n_samples, bool recv) { float v = vol->mute ? 0.0f : vol->volumes[ch]; + uint32_t i; if (v == 0.0f || src == NULL) memset(dst, 0, n_samples * sizeof(float)); - else if (v == 1.0f) + else if (v == 1.0f) { +#if __BYTE_ORDER == __BIG_ENDIAN + for (i = 0; i < n_samples; i++) + dst[i] = bswap_f32(src[i]); +#else memcpy(dst, src, n_samples * sizeof(float)); - else { - uint32_t i; +#endif + + } else { +#if __BYTE_ORDER == __BIG_ENDIAN + if (recv) { + for (i = 0; i < n_samples; i++) + dst[i] = bswap_f32(src[i]) * v; + } else { + for (i = 0; i < n_samples; i++) + dst[i] = bswap_f32(src[i] * v); + } +#else for (i = 0; i < n_samples; i++) dst[i] = src[i] * v; +#endif } } @@ -288,7 +317,7 @@ static int netjack2_send_audio(struct netjack2_peer *peer, uint32_t nframes, ap[0] = htonl(info[j].id); src = SPA_PTROFF(info[j].data, i * sub_period_size * sizeof(float), float); - do_volume((float*)&ap[1], src, peer->send_volume, info[j].id, sub_period_size); + do_volume((float*)&ap[1], src, peer->send_volume, info[j].id, sub_period_size, false); ap = SPA_PTROFF(ap, sub_period_bytes, int32_t); } @@ -469,7 +498,7 @@ static int netjack2_recv_audio(struct netjack2_peer *peer, struct nj2_packet_hea float *dst = SPA_PTROFF(data, sub_cycle * sub_period_size * sizeof(float), float); - do_volume(dst, (float*)&ap[1], peer->recv_volume, active_port, sub_period_size); + do_volume(dst, (float*)&ap[1], peer->recv_volume, active_port, sub_period_size, true); info[active_port].filled = peer->sync.is_last; } }