aboutsummaryrefslogtreecommitdiffstats
path: root/src/radio/radio.c
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2024-03-10 13:45:08 +0100
committerAndreas Eversberg <jolly@eversberg.eu>2024-03-30 23:28:05 +0100
commita20637825ab384195064174293a2e3a3af3c47c3 (patch)
treec1416a7ffb652d0ac332b8fabeaa00f95eb3d897 /src/radio/radio.c
parente7efcee289bf2df88c57d487f29be4ec23a45594 (diff)
Audio rework, new jitter buffer
Jitter buffer is now based on packets, not on samples. The frames are dejittered in received form. After reading from jitter buffer, they are decoded in correct order. If a frame is missing, it is concealed by repeating audio.
Diffstat (limited to 'src/radio/radio.c')
-rw-r--r--src/radio/radio.c45
1 files changed, 32 insertions, 13 deletions
diff --git a/src/radio/radio.c b/src/radio/radio.c
index 25da26b..5e59432 100644
--- a/src/radio/radio.c
+++ b/src/radio/radio.c
@@ -106,8 +106,8 @@ int radio_init(radio_t *radio, int buffer_size, int samplerate, double frequency
LOGP(DRADIO, LOGL_ERROR, "Failed to open sound device!\n");
goto error;
}
- jitter_create(&radio->tx_dejitter[0], "left", radio->tx_audio_samplerate, sizeof(sample_t), 0.050, 0.500, JITTER_FLAG_NONE);
- jitter_create(&radio->tx_dejitter[1], "right", radio->tx_audio_samplerate, sizeof(sample_t), 0.050, 0.500, JITTER_FLAG_NONE);
+ jitter_create(&radio->tx_dejitter[0], "left", radio->tx_audio_samplerate, 0.050, 0.500, JITTER_FLAG_NONE);
+ jitter_create(&radio->tx_dejitter[1], "right", radio->tx_audio_samplerate, 0.050, 0.500, JITTER_FLAG_NONE);
radio->tx_audio_mode = AUDIO_MODE_AUDIODEV;
#else
rc = -ENOTSUP;
@@ -173,8 +173,8 @@ int radio_init(radio_t *radio, int buffer_size, int samplerate, double frequency
LOGP(DRADIO, LOGL_ERROR, "Failed to open sound device!\n");
goto error;
}
- jitter_create(&radio->rx_dejitter[0], "left", radio->rx_audio_samplerate, sizeof(sample_t), 0.050, 0.500, JITTER_FLAG_NONE);
- jitter_create(&radio->rx_dejitter[1], "right", radio->rx_audio_samplerate, sizeof(sample_t), 0.050, 0.500, JITTER_FLAG_NONE);
+ jitter_create(&radio->rx_dejitter[0], "left", radio->rx_audio_samplerate, 0.050, 0.500, JITTER_FLAG_NONE);
+ jitter_create(&radio->rx_dejitter[1], "right", radio->rx_audio_samplerate, 0.050, 0.500, JITTER_FLAG_NONE);
radio->rx_audio_mode |= AUDIO_MODE_AUDIODEV;
#else
rc = -ENOTSUP;
@@ -442,6 +442,7 @@ int radio_tx(radio_t *radio, float *baseband, int signal_num)
sample_t *audio_samples[2];
sample_t *signal_samples[3];
uint8_t *signal_power;
+ jitter_frame_t *jf;
if (signal_num > radio->buffer_size) {
LOGP(DRADIO, LOGL_ERROR, "signal_num > buffer_size, please fix!.\n");
@@ -494,11 +495,19 @@ int radio_tx(radio_t *radio, float *baseband, int signal_num)
else
return 0;
}
- jitter_save(&radio->tx_dejitter[0], audio_samples[0], rc, 0, 0, 0 ,0);
- jitter_load(&radio->tx_dejitter[0], audio_samples[0], audio_num);
+ jf = jitter_frame_alloc(NULL, NULL, (uint8_t *)audio_samples[0], rc * sizeof(*(audio_samples[0])), 0, radio->tx_sequence[0], radio->tx_timestamp[0], 123);
+ if (jf)
+ jitter_save(&radio->tx_dejitter[0], jf);
+ radio->tx_sequence[0] += 1;
+ radio->tx_timestamp[0] += rc;
+ jitter_load_samples(&radio->tx_dejitter[0], (uint8_t *)audio_samples[0], audio_num, sizeof(*(audio_samples[0])), NULL, NULL);
if (radio->tx_audio_channels == 2) {
- jitter_save(&radio->tx_dejitter[1], audio_samples[1], rc, 0, 0, 0 ,0);
- jitter_load(&radio->tx_dejitter[1], audio_samples[1], audio_num);
+ jf = jitter_frame_alloc(NULL, NULL, (uint8_t *)audio_samples[1], rc * sizeof(*(audio_samples[1])), 0, radio->tx_sequence[1], radio->tx_timestamp[1], 123);
+ if (jf)
+ jitter_save(&radio->tx_dejitter[1], jf);
+ radio->tx_sequence[1] += 1;
+ radio->tx_timestamp[1] += rc;
+ jitter_load_samples(&radio->tx_dejitter[1], (uint8_t *)audio_samples[1], audio_num, sizeof(*(audio_samples[1])), NULL, NULL);
}
break;
#endif
@@ -616,6 +625,7 @@ int radio_rx(radio_t *radio, float *baseband, int signal_num)
int audio_num;
sample_t *samples[3];
double p;
+ jitter_frame_t *jf;
if (signal_num > radio->buffer_size) {
LOGP(DRADIO, LOGL_ERROR, "signal_num > buffer_size, please fix!.\n");
@@ -728,13 +738,22 @@ int radio_rx(radio_t *radio, float *baseband, int signal_num)
wave_write(&radio->wave_rx_rec, samples, audio_num);
#ifdef HAVE_ALSA
if ((radio->rx_audio_mode & AUDIO_MODE_AUDIODEV)) {
- jitter_save(&radio->rx_dejitter[0], samples[0], audio_num, 0, 0, 0 ,0);
- if (radio->rx_audio_channels == 2)
- jitter_save(&radio->rx_dejitter[1], samples[1], audio_num, 0, 0, 0 ,0);
+ jf = jitter_frame_alloc(NULL, NULL, (uint8_t *)samples[0], audio_num * sizeof(*(samples[0])), 0, radio->rx_sequence[0], radio->rx_timestamp[0], 123);
+ if (jf)
+ jitter_save(&radio->rx_dejitter[0], jf);
+ radio->rx_sequence[0] += 1;
+ radio->rx_timestamp[0] += audio_num;
+ if (radio->rx_audio_channels == 2) {
+ jf = jitter_frame_alloc(NULL, NULL, (uint8_t *)samples[1], audio_num * sizeof(*(samples[1])), 0, radio->rx_sequence[1], radio->rx_timestamp[1], 123);
+ if (jf)
+ jitter_save(&radio->rx_dejitter[1], jf);
+ radio->rx_sequence[1] += 1;
+ radio->rx_timestamp[1] += audio_num;
+ }
audio_num = sound_get_tosend(radio->rx_sound, radio->signal_buffer_size);
- jitter_load(&radio->rx_dejitter[0], samples[0], audio_num);
+ jitter_load_samples(&radio->rx_dejitter[0], (uint8_t *)samples[0], audio_num, sizeof(*samples), NULL, NULL);
if (radio->rx_audio_channels == 2)
- jitter_load(&radio->rx_dejitter[1], samples[1], audio_num);
+ jitter_load_samples(&radio->rx_dejitter[1], (uint8_t *)samples[1], audio_num, sizeof(*samples), NULL, NULL);
audio_num = sound_write(radio->rx_sound, samples, NULL, audio_num, NULL, NULL, radio->rx_audio_channels);
if (audio_num < 0) {
LOGP(DRADIO, LOGL_ERROR, "Failed to write to sound device (rc = %d)!\n", audio_num);