1
0
mirror of http://www.pogo.org.uk/~mark/trx.git synced 2025-07-03 22:02:04 +02:00

Compare commits

...

8 Commits
0.3 ... master

Author SHA1 Message Date
Mark Hills
0c5ab0dfc1 Do not use the ambiguous sched_setscheduler()
POSIX specifies this is per-process, and GNU implemented it on the
thread. Musl realises the problem with this and so doesn't implement
it at all, forcing this more specific alternative to be used.
2023-05-12 16:31:03 +01:00
Mark Hills
5c844e6996 Use the default logging level
This is a #define to bctoolbox which means we have to link ourselves
to that library. Whereas oRTP defines its own link. It turns out the
default logging level is appropriate, so use that.

This also removes one of the compatibility problems caused by
different versions of oRTP which had different definitions of this
function.
2020-11-28 11:03:34 +00:00
Mark Hills
69b6537303 The year is now 2020 2020-01-04 11:31:45 +00:00
Mark Hills
85fe843d61 oRTP segfaults in RECVONLY mode
Reported-by: Paul Le Couteur <paullecouteur@gmail.com>
2020-01-04 11:30:29 +00:00
Mark Hills
66b4707a24 Use DSCP to help with wifi links 2018-01-23 16:21:51 +00:00
Mark Hills
e375ceef5a Use fixed point 2018-01-23 16:20:21 +00:00
Mark Hills
0b53299941 Implicitly look for a new stream on resume 2018-01-23 16:19:46 +00:00
Mark Hills
f35eb4efe2 Change to 0.26.0 liboRTP API 2018-01-23 16:18:46 +00:00
8 changed files with 39 additions and 27 deletions

2
README
View File

@ -1,6 +1,6 @@
trx: Realtime audio over IP
(C) Copyright 2012 Mark Hills <mark@xwax.org>
(C) Copyright 2020 Mark Hills <mark@xwax.org>
See the COPYING file for licensing terms.

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2012 Mark Hills <mark@xwax.org>
* Copyright (C) 2020 Mark Hills <mark@xwax.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -53,7 +53,7 @@ int set_alsa_hw(snd_pcm_t *pcm,
r = snd_pcm_hw_params_set_access(pcm, hw, SND_PCM_ACCESS_RW_INTERLEAVED);
CHK("snd_pcm_hw_params_set_access", r);
r = snd_pcm_hw_params_set_format(pcm, hw, SND_PCM_FORMAT_FLOAT);
r = snd_pcm_hw_params_set_format(pcm, hw, SND_PCM_FORMAT_S16);
CHK("snd_pcm_hw_params_set_format", r);
r = snd_pcm_hw_params_set_rate(pcm, hw, rate, 0);

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2012 Mark Hills <mark@xwax.org>
* Copyright (C) 2020 Mark Hills <mark@xwax.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License

View File

@ -1,6 +1,6 @@
#ifndef NOTICE_H
#define NOTICE_H
#define COPYRIGHT "trx (C) Copyright 2014 Mark Hills <mark@xwax.org>"
#define COPYRIGHT "trx (C) Copyright 2020 Mark Hills <mark@xwax.org>"
#endif

21
rx.c
View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2012 Mark Hills <mark@xwax.org>
* Copyright (C) 2020 Mark Hills <mark@xwax.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -32,7 +32,7 @@
static unsigned int verbose = DEFAULT_VERBOSE;
static void timestamp_jump(RtpSession *session, ...)
static void timestamp_jump(RtpSession *session, void *a, void *b, void *c)
{
if (verbose > 1)
fputc('|', stderr);
@ -60,6 +60,15 @@ static RtpSession* create_rtp_recv(const char *addr_desc, const int port,
abort();
}
/*
* oRTP in RECVONLY mode attempts to send RTCP packets and
* segfaults (v4.3.0 tested)
*
* https://stackoverflow.com/questions/43591690/receiving-rtcp-issues-within-ortp-library
*/
rtp_session_enable_rtcp(session, FALSE);
return session;
}
@ -70,15 +79,15 @@ static int play_one_frame(void *packet,
const unsigned int channels)
{
int r;
float *pcm;
int16_t *pcm;
snd_pcm_sframes_t f, samples = 1920;
pcm = alloca(sizeof(float) * samples * channels);
pcm = alloca(sizeof(*pcm) * samples * channels);
if (packet == NULL) {
r = opus_decode_float(decoder, NULL, 0, pcm, samples, 1);
r = opus_decode(decoder, NULL, 0, pcm, samples, 1);
} else {
r = opus_decode_float(decoder, packet, len, pcm, samples, 0);
r = opus_decode(decoder, packet, len, pcm, samples, 0);
}
if (r < 0) {
fprintf(stderr, "opus_decode: %s\n", opus_strerror(r));

19
sched.c
View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2012 Mark Hills <mark@xwax.org>
* Copyright (C) 2020 Mark Hills <mark@xwax.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -17,6 +17,8 @@
*
*/
#include <errno.h>
#include <pthread.h>
#include <sched.h>
#include <stdio.h>
#include <unistd.h>
@ -28,23 +30,20 @@
int go_realtime(void)
{
int max_pri;
struct sched_param sp;
if (sched_getparam(0, &sp)) {
perror("sched_getparam");
return -1;
}
const struct sched_param sp = {
.sched_priority = REALTIME_PRIORITY,
};
max_pri = sched_get_priority_max(SCHED_FIFO);
sp.sched_priority = REALTIME_PRIORITY;
if (sp.sched_priority > max_pri) {
fprintf(stderr, "Invalid priority (maximum %d)\n", max_pri);
return -1;
}
if (sched_setscheduler(0, SCHED_FIFO, &sp)) {
perror("sched_setscheduler");
errno = pthread_setschedparam(pthread_self(), SCHED_FIFO, &sp);
if (errno) {
perror("pthread_setschedparam");
return -1;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2012 Mark Hills <mark@xwax.org>
* Copyright (C) 2020 Mark Hills <mark@xwax.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License

14
tx.c
View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2012 Mark Hills <mark@xwax.org>
* Copyright (C) 2020 Mark Hills <mark@xwax.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -48,6 +48,8 @@ static RtpSession* create_rtp_send(const char *addr_desc, const int port)
abort();
if (rtp_session_set_multicast_ttl(session, 16) != 0)
abort();
if (rtp_session_set_dscp(session, 40) != 0)
abort();
return session;
}
@ -60,17 +62,20 @@ static int send_one_frame(snd_pcm_t *snd,
const unsigned int ts_per_frame,
RtpSession *session)
{
float *pcm;
int16_t *pcm;
void *packet;
ssize_t z;
snd_pcm_sframes_t f;
static unsigned int ts = 0;
pcm = alloca(sizeof(float) * samples * channels);
pcm = alloca(sizeof(*pcm) * samples * channels);
packet = alloca(bytes_per_frame);
f = snd_pcm_readi(snd, pcm, samples);
if (f < 0) {
if (f == -ESTRPIPE)
ts = 0;
f = snd_pcm_recover(snd, f, 0);
if (f < 0) {
aerror("snd_pcm_readi", f);
@ -88,7 +93,7 @@ static int send_one_frame(snd_pcm_t *snd,
return 0;
}
z = opus_encode_float(encoder, pcm, samples, packet, bytes_per_frame);
z = opus_encode(encoder, pcm, samples, packet, bytes_per_frame);
if (z < 0) {
fprintf(stderr, "opus_encode_float: %s\n", opus_strerror(z));
return -1;
@ -240,7 +245,6 @@ int main(int argc, char *argv[])
ortp_init();
ortp_scheduler_init();
ortp_set_log_level_mask(ORTP_WARNING|ORTP_ERROR);
session = create_rtp_send(addr, port);
assert(session != NULL);