Better manage latency in jack backend. WARNING: users should rely on -q to adapt buffering to jack configuration
This commit is contained in:
parent
bb71807b5d
commit
e4cdf587f1
|
@ -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__);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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__*/
|
||||
|
||||
|
|
|
@ -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':
|
||||
|
|
|
@ -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':
|
||||
|
|
Loading…
Reference in New Issue