Better manage latency in jack backend. WARNING: users should rely on -q to adapt buffering to jack configuration

This commit is contained in:
Benoit Quiniou 2018-05-11 14:11:06 +02:00
parent bb71807b5d
commit e4cdf587f1
5 changed files with 25 additions and 13 deletions

View File

@ -7,7 +7,7 @@
#include <string.h>
#include "common/logger.h"
#define NB_BUFFERS 7
#define NB_BUFFERS 2
struct jack_backend_t
{
@ -139,14 +139,17 @@ int jack_open(audio_backend_handle_t handle, char const* output_name, enum audio
}
}
jack_buffer_size = jack_get_buffer_size(jack_backend->jack_client);
// well, we should calculate something with bit_fmt ratio to 32bit...
jack_buffer_size = jack_get_buffer_size(jack_backend->jack_client) * jack_backend->nb_channels * VBanBitResolutionSize[config->bit_fmt];
buffer_size = ((buffer_size > jack_buffer_size) ? buffer_size : jack_buffer_size) * NB_BUFFERS;
jack_backend->nb_channels = config->nb_channels;
jack_backend->bit_fmt= config->bit_fmt;
jack_backend->ring_buffer = jack_ringbuffer_create(buffer_size);
char* const zeros = calloc(1, buffer_size / NB_BUFFERS);
jack_ringbuffer_write(jack_backend->ring_buffer, zeros, buffer_size / NB_BUFFERS);
free(zeros);
ret = jack_set_process_callback(jack_backend->jack_client, jack_process_cb, jack_backend);
if (ret)
{
@ -179,6 +182,8 @@ int jack_close(audio_backend_handle_t handle)
return 0;
}
jack_backend->active = 0;
ret = jack_deactivate(jack_backend->jack_client);
if (ret)
{
@ -221,6 +226,12 @@ int jack_write(audio_backend_handle_t handle, char const* data, size_t size)
return -ENODEV;
}
if (jack_backend->active == 0)
{
logger_log(LOG_DEBUG, "%s: server not active yet", __func__);
return size;
}
if (jack_ringbuffer_write_space(jack_backend->ring_buffer) < size)
{
logger_log(LOG_WARNING, "%s: short write", __func__);

View File

@ -181,7 +181,7 @@ int packet_init_header(char* buffer, struct stream_config_t const* stream_config
hdr->format_nbc = stream_config->nb_channels - 1;
hdr->format_SR = vban_sr_from_value(stream_config->sample_rate);
hdr->format_bit = stream_config->bit_fmt;
strncpy(hdr->streamname, streamname, VBAN_STREAM_NAME_SIZE);
strncpy(hdr->streamname, streamname, VBAN_STREAM_NAME_SIZE-1);
hdr->nuFrame = 0;
return 0;

View File

@ -18,7 +18,7 @@
#ifndef __VERSION_H__
#define __VERSION_H__
#define VBAN_VERSION "2.0.4"
#define VBAN_VERSION "2.0.5"
#endif /*__VERSION_H__*/

View File

@ -107,7 +107,7 @@ int get_options(struct config_t* config, int argc, char* const* argv)
switch (c)
{
case 'i':
strncpy(config->socket.ip_address, optarg, SOCKET_IP_ADDRESS_SIZE);
strncpy(config->socket.ip_address, optarg, SOCKET_IP_ADDRESS_SIZE-1);
break;
case 'p':
@ -115,15 +115,15 @@ int get_options(struct config_t* config, int argc, char* const* argv)
break;
case 's':
strncpy(config->stream_name, optarg, VBAN_STREAM_NAME_SIZE);
strncpy(config->stream_name, optarg, VBAN_STREAM_NAME_SIZE-1);
break;
case 'b':
strncpy(config->audio.backend_name, optarg, AUDIO_BACKEND_NAME_SIZE);
strncpy(config->audio.backend_name, optarg, AUDIO_BACKEND_NAME_SIZE-1);
break;
case 'd':
strncpy(config->audio.device_name, optarg, AUDIO_DEVICE_NAME_SIZE);
strncpy(config->audio.device_name, optarg, AUDIO_DEVICE_NAME_SIZE-1);
break;
case 'r':

View File

@ -137,7 +137,7 @@ int get_options(struct config_t* config, int argc, char* const* argv)
switch (c)
{
case 'i':
strncpy(config->socket.ip_address, optarg, SOCKET_IP_ADDRESS_SIZE);
strncpy(config->socket.ip_address, optarg, SOCKET_IP_ADDRESS_SIZE -1);
break;
case 'p':
@ -145,11 +145,12 @@ int get_options(struct config_t* config, int argc, char* const* argv)
break;
case 's':
strncpy(config->stream_name, optarg, VBAN_STREAM_NAME_SIZE);
strncpy(config->stream_name, optarg, VBAN_STREAM_NAME_SIZE -1);
break;
case 'b':
strncpy(config->audio.backend_name, optarg, AUDIO_BACKEND_NAME_SIZE);
strncpy(config->audio.backend_name, optarg, AUDIO_BACKEND_NAME_SIZE-1);
break;
case 'q':
quality = atoi(optarg);
@ -161,7 +162,7 @@ int get_options(struct config_t* config, int argc, char* const* argv)
case 'o':
case 'd':
strncpy(config->audio.device_name, optarg, AUDIO_DEVICE_NAME_SIZE);
strncpy(config->audio.device_name, optarg, AUDIO_DEVICE_NAME_SIZE-1);
break;
case 'l':