mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
jack: remove fixed buffer size limit
Use the quantum_limit as the max buffer frames and allocate the ports with the right samples at the end.
This commit is contained in:
parent
8a9117567c
commit
6eb17393bf
1 changed files with 26 additions and 16 deletions
|
|
@ -52,8 +52,6 @@
|
|||
#define MONITOR_EXT " Monitor"
|
||||
|
||||
#define MAX_MIX 1024
|
||||
#define MAX_BUFFER_FRAMES 8192
|
||||
|
||||
#define MAX_CLIENT_PORTS 768
|
||||
|
||||
#define MAX_ALIGN 16
|
||||
|
|
@ -255,10 +253,10 @@ struct port {
|
|||
unsigned int empty_out:1;
|
||||
unsigned int zeroed:1;
|
||||
|
||||
float *emptyptr;
|
||||
float empty[MAX_BUFFER_FRAMES + MAX_ALIGN];
|
||||
|
||||
void *(*get_buffer) (struct port *p, jack_nframes_t frames);
|
||||
|
||||
float *emptyptr;
|
||||
float empty[];
|
||||
};
|
||||
|
||||
struct link {
|
||||
|
|
@ -434,6 +432,8 @@ struct client {
|
|||
uint32_t max_ports;
|
||||
unsigned int fill_aliases:1;
|
||||
|
||||
uint32_t max_frames;
|
||||
|
||||
jack_position_t jack_position;
|
||||
jack_transport_state_t jack_state;
|
||||
};
|
||||
|
|
@ -658,7 +658,7 @@ static struct port * alloc_port(struct client *c, enum spa_direction direction)
|
|||
{
|
||||
struct port *p;
|
||||
struct object *o;
|
||||
uint32_t i;
|
||||
uint32_t i, port_size;
|
||||
|
||||
if (c->n_ports >= c->max_ports) {
|
||||
errno = ENOSPC;
|
||||
|
|
@ -666,11 +666,15 @@ static struct port * alloc_port(struct client *c, enum spa_direction direction)
|
|||
}
|
||||
|
||||
if (spa_list_is_empty(&c->free_ports)) {
|
||||
p = calloc(OBJECT_CHUNK, sizeof(struct port));
|
||||
port_size = sizeof(struct port) + (c->max_frames * sizeof(float)) + MAX_ALIGN;
|
||||
|
||||
p = calloc(OBJECT_CHUNK, port_size);
|
||||
if (p == NULL)
|
||||
return NULL;
|
||||
for (i = 0; i < OBJECT_CHUNK; i++)
|
||||
spa_list_append(&c->free_ports, &p[i].link);
|
||||
for (i = 0; i < OBJECT_CHUNK; i++) {
|
||||
struct port *t = SPA_PTROFF(p, port_size * i, struct port);
|
||||
spa_list_append(&c->free_ports, &t->link);
|
||||
}
|
||||
}
|
||||
p = spa_list_first(&c->free_ports, struct port, link);
|
||||
spa_list_remove(&p->link);
|
||||
|
|
@ -1481,6 +1485,7 @@ static inline void *get_buffer_output(struct port *p, uint32_t frames, uint32_t
|
|||
|
||||
static inline void process_empty(struct port *p, uint32_t frames)
|
||||
{
|
||||
struct client *c = p->client;
|
||||
void *ptr, *src = p->emptyptr;
|
||||
struct port *tied = p->tied;
|
||||
|
||||
|
|
@ -1498,10 +1503,10 @@ static inline void process_empty(struct port *p, uint32_t frames)
|
|||
case TYPE_ID_MIDI:
|
||||
{
|
||||
struct buffer *b;
|
||||
ptr = get_buffer_output(p, MAX_BUFFER_FRAMES, 1, &b);
|
||||
ptr = get_buffer_output(p, c->max_frames, 1, &b);
|
||||
if (SPA_LIKELY(ptr != NULL))
|
||||
b->datas[0].chunk->size = convert_from_midi(src,
|
||||
ptr, MAX_BUFFER_FRAMES * sizeof(float));
|
||||
ptr, c->max_frames * sizeof(float));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
@ -2216,7 +2221,7 @@ static int param_buffers(struct client *c, struct port *p,
|
|||
SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int(2, 1, MAX_BUFFERS),
|
||||
SPA_PARAM_BUFFERS_blocks, SPA_POD_Int(1),
|
||||
SPA_PARAM_BUFFERS_size, SPA_POD_CHOICE_STEP_Int(
|
||||
MAX_BUFFER_FRAMES * sizeof(float),
|
||||
c->max_frames * sizeof(float),
|
||||
sizeof(float),
|
||||
INT32_MAX,
|
||||
sizeof(float)),
|
||||
|
|
@ -2517,6 +2522,7 @@ static int client_node_port_set_param(void *data,
|
|||
|
||||
static inline void *init_buffer(struct port *p)
|
||||
{
|
||||
struct client *c = p->client;
|
||||
void *data = p->emptyptr;
|
||||
if (p->zeroed)
|
||||
return data;
|
||||
|
|
@ -2524,14 +2530,14 @@ static inline void *init_buffer(struct port *p)
|
|||
if (p->object->port.type_id == TYPE_ID_MIDI) {
|
||||
struct midi_buffer *mb = data;
|
||||
mb->magic = MIDI_BUFFER_MAGIC;
|
||||
mb->buffer_size = MAX_BUFFER_FRAMES * sizeof(float);
|
||||
mb->nframes = MAX_BUFFER_FRAMES;
|
||||
mb->buffer_size = c->max_frames * sizeof(float);
|
||||
mb->nframes = c->max_frames;
|
||||
mb->write_pos = 0;
|
||||
mb->event_count = 0;
|
||||
mb->lost_events = 0;
|
||||
pw_log_debug("port %p: init midi buffer size:%d", p, mb->buffer_size);
|
||||
} else
|
||||
memset(data, 0, MAX_BUFFER_FRAMES * sizeof(float));
|
||||
memset(data, 0, c->max_frames * sizeof(float));
|
||||
|
||||
p->zeroed = true;
|
||||
return data;
|
||||
|
|
@ -3742,6 +3748,8 @@ jack_client_t * jack_client_open (const char *client_name,
|
|||
if (client->context.context == NULL)
|
||||
goto no_props;
|
||||
|
||||
client->max_frames = client->context.context->settings.clock_quantum_limit;
|
||||
|
||||
client->notify_source = pw_loop_add_event(client->context.l,
|
||||
on_notify_event, client);
|
||||
client->notify_buffer = calloc(1, NOTIFY_BUFFER_SIZE + sizeof(struct notify));
|
||||
|
|
@ -5835,13 +5843,15 @@ int jack_port_type_size(void)
|
|||
SPA_EXPORT
|
||||
size_t jack_port_type_get_buffer_size (jack_client_t *client, const char *port_type)
|
||||
{
|
||||
struct client *c = (struct client *) client;
|
||||
|
||||
return_val_if_fail(client != NULL, 0);
|
||||
return_val_if_fail(port_type != NULL, 0);
|
||||
|
||||
if (spa_streq(JACK_DEFAULT_AUDIO_TYPE, port_type))
|
||||
return jack_get_buffer_size(client) * sizeof(float);
|
||||
else if (spa_streq(JACK_DEFAULT_MIDI_TYPE, port_type))
|
||||
return MAX_BUFFER_FRAMES * sizeof(float);
|
||||
return c->max_frames * sizeof(float);
|
||||
else if (spa_streq(JACK_DEFAULT_VIDEO_TYPE, port_type))
|
||||
return 320 * 240 * 4 * sizeof(float);
|
||||
else
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue