mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	jack: support midi buffers
This commit is contained in:
		
							parent
							
								
									9902886ba5
								
							
						
					
					
						commit
						796c91440e
					
				
					 1 changed files with 36 additions and 5 deletions
				
			
		| 
						 | 
					@ -128,6 +128,16 @@ struct mem {
 | 
				
			||||||
	void *ptr;
 | 
						void *ptr;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct midi_buffer {
 | 
				
			||||||
 | 
					#define MIDI_BUFFER_MAGIC 0x900df00d
 | 
				
			||||||
 | 
						uint32_t magic;
 | 
				
			||||||
 | 
						int32_t buffer_size;
 | 
				
			||||||
 | 
						uint32_t nframes;
 | 
				
			||||||
 | 
						int32_t write_pos;
 | 
				
			||||||
 | 
						uint32_t event_count;
 | 
				
			||||||
 | 
						uint32_t lost_events;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct buffer {
 | 
					struct buffer {
 | 
				
			||||||
	struct spa_list link;
 | 
						struct spa_list link;
 | 
				
			||||||
#define BUFFER_FLAG_OUT		(1<<0)
 | 
					#define BUFFER_FLAG_OUT		(1<<0)
 | 
				
			||||||
| 
						 | 
					@ -918,6 +928,19 @@ static void client_node_port_set_param(void *object,
 | 
				
			||||||
	pw_client_node_proxy_done(c->node_proxy, seq, 0);
 | 
						pw_client_node_proxy_done(c->node_proxy, seq, 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void init_buffer(struct port *p, struct buffer *b)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (p->object->port.type_id == 1) {
 | 
				
			||||||
 | 
							struct midi_buffer *mb = b->datas[0].data;
 | 
				
			||||||
 | 
							mb->magic = MIDI_BUFFER_MAGIC;
 | 
				
			||||||
 | 
							mb->buffer_size = b->datas[0].maxsize;
 | 
				
			||||||
 | 
							mb->nframes = b->datas[0].maxsize / sizeof(float);
 | 
				
			||||||
 | 
							mb->write_pos = 0;
 | 
				
			||||||
 | 
							mb->event_count = 0;
 | 
				
			||||||
 | 
							mb->lost_events = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void client_node_port_use_buffers(void *object,
 | 
					static void client_node_port_use_buffers(void *object,
 | 
				
			||||||
                                  uint32_t seq,
 | 
					                                  uint32_t seq,
 | 
				
			||||||
                                  enum spa_direction direction,
 | 
					                                  enum spa_direction direction,
 | 
				
			||||||
| 
						 | 
					@ -1016,12 +1039,14 @@ static void client_node_port_use_buffers(void *object,
 | 
				
			||||||
				d->fd = bm->fd;
 | 
									d->fd = bm->fd;
 | 
				
			||||||
				bm->ref++;
 | 
									bm->ref++;
 | 
				
			||||||
				b->mem[b->n_mem++] = bm->id;
 | 
									b->mem[b->n_mem++] = bm->id;
 | 
				
			||||||
				pw_log_debug(NAME" %p: data %d %u -> fd %d", c, j, bm->id, bm->fd);
 | 
									pw_log_debug(NAME" %p: data %d %u -> fd %d %d",
 | 
				
			||||||
 | 
											c, j, bm->id, bm->fd, d->maxsize);
 | 
				
			||||||
			} else if (d->type == t->data.MemPtr) {
 | 
								} else if (d->type == t->data.MemPtr) {
 | 
				
			||||||
				d->data = SPA_MEMBER(b->ptr,
 | 
									d->data = SPA_MEMBER(b->ptr,
 | 
				
			||||||
						b->map.start + SPA_PTR_TO_INT(d->data), void);
 | 
											b->map.start + SPA_PTR_TO_INT(d->data), void);
 | 
				
			||||||
				d->fd = -1;
 | 
									d->fd = -1;
 | 
				
			||||||
				pw_log_debug(NAME" %p: data %d %u -> mem %p", c, j, b->id, d->data);
 | 
									pw_log_debug(NAME" %p: data %d %u -> mem %p %d",
 | 
				
			||||||
 | 
											c, j, b->id, d->data, d->maxsize);
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				pw_log_warn("unknown buffer data type %d", d->type);
 | 
									pw_log_warn("unknown buffer data type %d", d->type);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -1029,9 +1054,13 @@ static void client_node_port_use_buffers(void *object,
 | 
				
			||||||
				pw_log_warn(NAME" %p: Failed to mlock memory %p %u: %m", c,
 | 
									pw_log_warn(NAME" %p: Failed to mlock memory %p %u: %m", c,
 | 
				
			||||||
						d->data, d->maxsize);
 | 
											d->data, d->maxsize);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		SPA_FLAG_SET(b->flags, BUFFER_FLAG_OUT);
 | 
							SPA_FLAG_SET(b->flags, BUFFER_FLAG_OUT);
 | 
				
			||||||
		if (direction == SPA_DIRECTION_OUTPUT)
 | 
							if (direction == SPA_DIRECTION_OUTPUT) {
 | 
				
			||||||
 | 
								init_buffer(p, b);
 | 
				
			||||||
			reuse_buffer(c, mix, b->id);
 | 
								reuse_buffer(c, mix, b->id);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	pw_log_debug("have %d buffers", n_buffers);
 | 
						pw_log_debug("have %d buffers", n_buffers);
 | 
				
			||||||
	mix->n_buffers = n_buffers;
 | 
						mix->n_buffers = n_buffers;
 | 
				
			||||||
| 
						 | 
					@ -1940,7 +1969,8 @@ void * jack_port_get_buffer (jack_port_t *port, jack_nframes_t frames)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->direction == SPA_DIRECTION_INPUT) {
 | 
						if (p->direction == SPA_DIRECTION_INPUT) {
 | 
				
			||||||
		spa_list_for_each(mix, &p->mix, port_link) {
 | 
							spa_list_for_each(mix, &p->mix, port_link) {
 | 
				
			||||||
			pw_log_trace("port %p: mix %d.%d get buffer", p, p->id, mix->id);
 | 
								pw_log_trace("port %p: mix %d.%d get buffer %d",
 | 
				
			||||||
 | 
										p, p->id, mix->id, frames);
 | 
				
			||||||
			io = mix->io;
 | 
								io = mix->io;
 | 
				
			||||||
			if (io == NULL || io->buffer_id >= mix->n_buffers)
 | 
								if (io == NULL || io->buffer_id >= mix->n_buffers)
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
| 
						 | 
					@ -1954,7 +1984,8 @@ void * jack_port_get_buffer (jack_port_t *port, jack_nframes_t frames)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		spa_list_for_each(mix, &p->mix, port_link) {
 | 
							spa_list_for_each(mix, &p->mix, port_link) {
 | 
				
			||||||
			pw_log_trace("port %p: mix %d.%d get buffer", p, p->id, mix->id);
 | 
								pw_log_trace("port %p: mix %d.%d get buffer %d",
 | 
				
			||||||
 | 
										p, p->id, mix->id, frames);
 | 
				
			||||||
			io = mix->io;
 | 
								io = mix->io;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (mix->n_buffers == 0 || io == NULL)
 | 
								if (mix->n_buffers == 0 || io == NULL)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue