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.
This commit is contained in:
Andreas Eversberg
2024-03-10 13:45:08 +01:00
parent e7efcee289
commit a20637825a
40 changed files with 865 additions and 572 deletions

View File

@@ -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);