mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	module-vban: create streams per stream_name
Always listen on the receive socket. Find the stream with the given stream_name of the packet and create it if it doesn't exist. Also take the sample-rate, channels and format from the packet parameters instead of the config. Fixes #4400
This commit is contained in:
		
							parent
							
								
									567b484386
								
							
						
					
					
						commit
						1a5514e5cf
					
				
					 6 changed files with 284 additions and 153 deletions
				
			
		| 
						 | 
				
			
			@ -92,12 +92,7 @@ static int vban_audio_receive(struct impl *impl, uint8_t *buffer, ssize_t len)
 | 
			
		|||
	uint32_t stride = impl->stride;
 | 
			
		||||
	int32_t filled;
 | 
			
		||||
 | 
			
		||||
	if (len < VBAN_HEADER_SIZE)
 | 
			
		||||
		goto short_packet;
 | 
			
		||||
 | 
			
		||||
	hdr = (struct vban_header*)buffer;
 | 
			
		||||
	if (strncmp(hdr->vban, "VBAN", 3))
 | 
			
		||||
		goto invalid_version;
 | 
			
		||||
 | 
			
		||||
	impl->receiving = true;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -155,14 +150,6 @@ static int vban_audio_receive(struct impl *impl, uint8_t *buffer, ssize_t len)
 | 
			
		|||
		spa_ringbuffer_write_update(&impl->ring, write);
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
short_packet:
 | 
			
		||||
	pw_log_warn("short packet received");
 | 
			
		||||
	return -EINVAL;
 | 
			
		||||
invalid_version:
 | 
			
		||||
	pw_log_warn("invalid VBAN version");
 | 
			
		||||
	spa_debug_log_mem(pw_log_get(), SPA_LOG_LEVEL_INFO, 0, buffer, len);
 | 
			
		||||
	return -EPROTO;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -201,13 +201,7 @@ static int vban_midi_receive(struct impl *impl, uint8_t *buffer, ssize_t len)
 | 
			
		|||
	ssize_t hlen;
 | 
			
		||||
	uint32_t n_frames;
 | 
			
		||||
 | 
			
		||||
	if (len < VBAN_HEADER_SIZE)
 | 
			
		||||
		goto short_packet;
 | 
			
		||||
 | 
			
		||||
	hdr = (struct vban_header*)buffer;
 | 
			
		||||
	if (strncmp(hdr->vban, "VBAN", 3))
 | 
			
		||||
		goto invalid_version;
 | 
			
		||||
 | 
			
		||||
	hlen = VBAN_HEADER_SIZE;
 | 
			
		||||
 | 
			
		||||
	n_frames = hdr->n_frames;
 | 
			
		||||
| 
						 | 
				
			
			@ -221,14 +215,6 @@ static int vban_midi_receive(struct impl *impl, uint8_t *buffer, ssize_t len)
 | 
			
		|||
	impl->receiving = true;
 | 
			
		||||
 | 
			
		||||
	return vban_midi_receive_midi(impl, buffer, hlen, len);
 | 
			
		||||
 | 
			
		||||
short_packet:
 | 
			
		||||
	pw_log_warn("short packet received");
 | 
			
		||||
	return -EINVAL;
 | 
			
		||||
invalid_version:
 | 
			
		||||
	pw_log_warn("invalid RTP version");
 | 
			
		||||
	spa_debug_log_mem(pw_log_get(), SPA_LOG_LEVEL_INFO, 0, buffer, len);
 | 
			
		||||
	return -EPROTO;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void vban_midi_flush_packets(struct impl *impl,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -94,13 +94,13 @@ struct format_info {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
static const struct format_info audio_format_info[] = {
 | 
			
		||||
	{ SPA_MEDIA_SUBTYPE_raw, SPA_AUDIO_FORMAT_U8, 1, VBAN_DATATYPE_U8, },
 | 
			
		||||
	{ SPA_MEDIA_SUBTYPE_raw, SPA_AUDIO_FORMAT_U8, 1, VBAN_DATATYPE_BYTE8, },
 | 
			
		||||
	{ SPA_MEDIA_SUBTYPE_raw, SPA_AUDIO_FORMAT_S16_LE, 2, VBAN_DATATYPE_INT16, },
 | 
			
		||||
	{ SPA_MEDIA_SUBTYPE_raw, SPA_AUDIO_FORMAT_S24_LE, 3, VBAN_DATATYPE_INT24, },
 | 
			
		||||
	{ SPA_MEDIA_SUBTYPE_raw, SPA_AUDIO_FORMAT_S32_LE, 4, VBAN_DATATYPE_INT32, },
 | 
			
		||||
	{ SPA_MEDIA_SUBTYPE_raw, SPA_AUDIO_FORMAT_F32_LE, 4, VBAN_DATATYPE_FLOAT32, },
 | 
			
		||||
	{ SPA_MEDIA_SUBTYPE_raw, SPA_AUDIO_FORMAT_F64_LE, 8, VBAN_DATATYPE_FLOAT64, },
 | 
			
		||||
	{ SPA_MEDIA_SUBTYPE_control, 0, 1, VBAN_SERIAL_MIDI | VBAN_DATATYPE_U8, },
 | 
			
		||||
	{ SPA_MEDIA_SUBTYPE_control, 0, 1, VBAN_SERIAL_MIDI | VBAN_DATATYPE_BYTE8, },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void stream_io_changed(void *data, uint32_t id, void *area, uint32_t size)
 | 
			
		||||
| 
						 | 
				
			
			@ -290,7 +290,7 @@ struct vban_stream *vban_stream_new(struct pw_core *core,
 | 
			
		|||
		if (impl->rate == 0)
 | 
			
		||||
			impl->rate = 10000;
 | 
			
		||||
 | 
			
		||||
		impl->header.format_SR = (0x1 << 5) | 14; /* 115200 */
 | 
			
		||||
		impl->header.format_SR = VBAN_PROTOCOL_SERIAL | vban_BPSList[14]; /* 115200 */
 | 
			
		||||
		impl->header.format_nbs = 0;
 | 
			
		||||
		impl->header.format_nbc = 0;
 | 
			
		||||
		impl->header.format_bit = impl->format_info->format_bit;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,21 +17,30 @@ extern "C" {
 | 
			
		|||
#define VBAN_SAMPLES_MAX_NB	256
 | 
			
		||||
 | 
			
		||||
struct vban_header {
 | 
			
		||||
	char vban[4];			/* contains 'V' 'B', 'A', 'N' */
 | 
			
		||||
	uint8_t format_SR;			/* SR index */
 | 
			
		||||
	uint8_t format_nbs;			/* nb sample per frame (1 to 256) */
 | 
			
		||||
	uint8_t format_nbc;			/* nb channel (1 to 256) */
 | 
			
		||||
	uint8_t format_bit;			/* bit format */
 | 
			
		||||
	char vban[4];					/* contains 'V' 'B', 'A', 'N' */
 | 
			
		||||
	uint8_t format_SR;				/* SR index */
 | 
			
		||||
	uint8_t format_nbs;				/* nb sample per frame (1 to 256) */
 | 
			
		||||
	uint8_t format_nbc;				/* nb channel (1 to 256) */
 | 
			
		||||
	uint8_t format_bit;				/* bit format */
 | 
			
		||||
	char stream_name[VBAN_STREAM_NAME_SIZE];	/* stream name */
 | 
			
		||||
	uint32_t n_frames;			/* growing frame number. */
 | 
			
		||||
	uint32_t n_frames;				/* growing frame number. */
 | 
			
		||||
} __attribute__ ((packed));
 | 
			
		||||
 | 
			
		||||
#define VBAN_PROTOCOL_AUDIO		0x00
 | 
			
		||||
#define VBAN_PROTOCOL_SERIAL		0x20
 | 
			
		||||
#define VBAN_PROTOCOL_TXT		0x40
 | 
			
		||||
#define VBAN_PROTOCOL_SERVICE		0x60
 | 
			
		||||
#define VBAN_PROTOCOL_UNDEFINED_1	0x80
 | 
			
		||||
#define VBAN_PROTOCOL_UNDEFINED_2	0xA0
 | 
			
		||||
#define VBAN_PROTOCOL_UNDEFINED_3	0xC0
 | 
			
		||||
#define VBAN_PROTOCOL_USER		0xE0
 | 
			
		||||
 | 
			
		||||
#define VBAN_SR_MAXNUMBER	21
 | 
			
		||||
 | 
			
		||||
static uint32_t const vban_SR[VBAN_SR_MAXNUMBER] = {
 | 
			
		||||
    6000, 12000, 24000, 48000, 96000, 192000, 384000,
 | 
			
		||||
    8000, 16000, 32000, 64000, 128000, 256000, 512000,
 | 
			
		||||
    11025, 22050, 44100, 88200, 176400, 352800, 705600
 | 
			
		||||
static uint32_t const vban_SR[32] = {
 | 
			
		||||
	6000, 12000, 24000, 48000, 96000, 192000, 384000,
 | 
			
		||||
	8000, 16000, 32000, 64000, 128000, 256000, 512000,
 | 
			
		||||
	11025, 22050, 44100, 88200, 176400, 352800, 705600
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static inline uint8_t vban_sr_index(uint32_t rate)
 | 
			
		||||
| 
						 | 
				
			
			@ -44,7 +53,37 @@ static inline uint8_t vban_sr_index(uint32_t rate)
 | 
			
		|||
	return VBAN_SR_MAXNUMBER;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define VBAN_DATATYPE_U8	0x00
 | 
			
		||||
#define VBAN_CODEC_PCM		0x00
 | 
			
		||||
#define VBAN_CODEC_VBCA		0x10 //VB-AUDIO AOIP CODEC
 | 
			
		||||
#define VBAN_CODEC_VBCV		0x20 //VB-AUDIO VOIP CODEC
 | 
			
		||||
#define VBAN_CODEC_UNDEFINED_1	0x30
 | 
			
		||||
#define VBAN_CODEC_UNDEFINED_2	0x40
 | 
			
		||||
#define VBAN_CODEC_UNDEFINED_3	0x50
 | 
			
		||||
#define VBAN_CODEC_UNDEFINED_4	0x60
 | 
			
		||||
#define VBAN_CODEC_UNDEFINED_5	0x70
 | 
			
		||||
#define VBAN_CODEC_UNDEFINED_6	0x80
 | 
			
		||||
#define VBAN_CODEC_UNDEFINED_7	0x90
 | 
			
		||||
#define VBAN_CODEC_UNDEFINED_8	0xA0
 | 
			
		||||
#define VBAN_CODEC_UNDEFINED_9	0xB0
 | 
			
		||||
#define VBAN_CODEC_UNDEFINED_10	0xC0
 | 
			
		||||
#define VBAN_CODEC_UNDEFINED_11	0xD0
 | 
			
		||||
#define VBAN_CODEC_UNDEFINED_12	0xE0
 | 
			
		||||
#define VBAN_CODEC_USER		0xF0
 | 
			
		||||
 | 
			
		||||
#define VBAN_BPS_MAXNUMBER 25
 | 
			
		||||
 | 
			
		||||
static const long vban_BPSList[32] = {
 | 
			
		||||
	0, 110, 150, 300, 600, 1200, 2400, 4800, 9600,
 | 
			
		||||
	14400, 19200, 31250, 38400, 57600, 115200, 128000,
 | 
			
		||||
	230400, 250000, 256000, 460800, 921600, 1000000,
 | 
			
		||||
	1500000, 2000000, 3000000
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define VBAN_SERIAL_GENERIC	0x00
 | 
			
		||||
#define VBAN_SERIAL_MIDI	0x10
 | 
			
		||||
#define VBAN_SERIAL_USER	0xf0
 | 
			
		||||
 | 
			
		||||
#define VBAN_DATATYPE_BYTE8	0x00
 | 
			
		||||
#define VBAN_DATATYPE_INT16	0x01
 | 
			
		||||
#define VBAN_DATATYPE_INT24	0x02
 | 
			
		||||
#define VBAN_DATATYPE_INT32	0x03
 | 
			
		||||
| 
						 | 
				
			
			@ -53,10 +92,6 @@ static inline uint8_t vban_sr_index(uint32_t rate)
 | 
			
		|||
#define VBAN_DATATYPE_12BITS	0x06
 | 
			
		||||
#define VBAN_DATATYPE_10BITS	0x07
 | 
			
		||||
 | 
			
		||||
#define VBAN_SERIAL_GENERIC	0x00
 | 
			
		||||
#define VBAN_SERIAL_MIDI	0x10
 | 
			
		||||
#define VBAN_SERIAL_USER	0xf0
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue