mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	export-source: add float format
This commit is contained in:
		
							parent
							
								
									2ed627f3b1
								
							
						
					
					
						commit
						2660b5c4f5
					
				
					 1 changed files with 50 additions and 19 deletions
				
			
		| 
						 | 
				
			
			@ -203,7 +203,9 @@ static int port_enum_formats(struct spa_node *node,
 | 
			
		|||
		d->t->param.idEnumFormat, d->t->spa_format,
 | 
			
		||||
		"I", d->type.media_type.audio,
 | 
			
		||||
		"I", d->type.media_subtype.raw,
 | 
			
		||||
		":", d->type.format_audio.format,   "I", d->type.audio_format.S16,
 | 
			
		||||
		":", d->type.format_audio.format,   "Ieu", d->type.audio_format.S16,
 | 
			
		||||
			SPA_POD_PROP_ENUM(2, d->type.audio_format.S16,
 | 
			
		||||
					     d->type.audio_format.F32),
 | 
			
		||||
		":", d->type.format_audio.channels, "iru", 2,
 | 
			
		||||
			SPA_POD_PROP_MIN_MAX(1, INT32_MAX),
 | 
			
		||||
		":", d->type.format_audio.rate,     "iru", 44100,
 | 
			
		||||
| 
						 | 
				
			
			@ -353,7 +355,8 @@ static int port_set_format(struct spa_node *node,
 | 
			
		|||
	if (spa_format_audio_raw_parse(format, &d->format, &d->type.format_audio) < 0)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	if (d->format.format != d->type.audio_format.S16)
 | 
			
		||||
	if (d->format.format != d->type.audio_format.S16 &&
 | 
			
		||||
	    d->format.format != d->type.audio_format.F32)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -424,12 +427,51 @@ static int impl_port_reuse_buffer(struct spa_node *node, uint32_t port_id, uint3
 | 
			
		|||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void fill_f32(struct data *d, void *dest, int avail)
 | 
			
		||||
{
 | 
			
		||||
	float *dst = dest;
 | 
			
		||||
	int n_samples = avail / (sizeof(float) * d->format.channels);
 | 
			
		||||
	int i, c;
 | 
			
		||||
 | 
			
		||||
        for (i = 0; i < n_samples; i++) {
 | 
			
		||||
		float val;
 | 
			
		||||
 | 
			
		||||
                d->accumulator += M_PI_M2 * 440 / d->format.rate;
 | 
			
		||||
                if (d->accumulator >= M_PI_M2)
 | 
			
		||||
                        d->accumulator -= M_PI_M2;
 | 
			
		||||
 | 
			
		||||
                val = sin(d->accumulator);
 | 
			
		||||
 | 
			
		||||
                for (c = 0; c < d->format.channels; c++)
 | 
			
		||||
                        *dst++ = val;
 | 
			
		||||
        }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void fill_s16(struct data *d, void *dest, int avail)
 | 
			
		||||
{
 | 
			
		||||
	int16_t *dst = dest;
 | 
			
		||||
	int n_samples = avail / (sizeof(int16_t) * d->format.channels);
 | 
			
		||||
	int i, c;
 | 
			
		||||
 | 
			
		||||
        for (i = 0; i < n_samples; i++) {
 | 
			
		||||
                int16_t val;
 | 
			
		||||
 | 
			
		||||
                d->accumulator += M_PI_M2 * 440 / d->format.rate;
 | 
			
		||||
                if (d->accumulator >= M_PI_M2)
 | 
			
		||||
                        d->accumulator -= M_PI_M2;
 | 
			
		||||
 | 
			
		||||
                val = (int16_t) (sin(d->accumulator) * 32767.0);
 | 
			
		||||
 | 
			
		||||
                for (c = 0; c < d->format.channels; c++)
 | 
			
		||||
                        *dst++ = val;
 | 
			
		||||
        }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int impl_node_process_output(struct spa_node *node)
 | 
			
		||||
{
 | 
			
		||||
	struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
 | 
			
		||||
	struct buffer *b;
 | 
			
		||||
	int i, c, n_samples, avail;
 | 
			
		||||
	int16_t *dst;
 | 
			
		||||
	int avail;
 | 
			
		||||
        struct spa_io_buffers *io = d->io;
 | 
			
		||||
	uint32_t maxsize, index = 0;
 | 
			
		||||
	uint32_t filled, offset;
 | 
			
		||||
| 
						 | 
				
			
			@ -458,21 +500,10 @@ static int impl_node_process_output(struct spa_node *node)
 | 
			
		|||
	if (offset + avail > maxsize)
 | 
			
		||||
		avail = maxsize - offset;
 | 
			
		||||
 | 
			
		||||
	dst = SPA_MEMBER(b->ptr, offset, void);
 | 
			
		||||
        n_samples = avail / (sizeof(int16_t) * d->format.channels);
 | 
			
		||||
 | 
			
		||||
        for (i = 0; i < n_samples; i++) {
 | 
			
		||||
                int16_t val;
 | 
			
		||||
 | 
			
		||||
                d->accumulator += M_PI_M2 * 440 / d->format.rate;
 | 
			
		||||
                if (d->accumulator >= M_PI_M2)
 | 
			
		||||
                        d->accumulator -= M_PI_M2;
 | 
			
		||||
 | 
			
		||||
                val = (int16_t) (sin(d->accumulator) * 32767.0);
 | 
			
		||||
 | 
			
		||||
                for (c = 0; c < d->format.channels; c++)
 | 
			
		||||
                        *dst++ = val;
 | 
			
		||||
        }
 | 
			
		||||
	if (d->format.format == d->type.audio_format.S16)
 | 
			
		||||
		fill_s16(d, SPA_MEMBER(b->ptr, offset, void), avail);
 | 
			
		||||
	else if (d->format.format == d->type.audio_format.F32)
 | 
			
		||||
		fill_f32(d, SPA_MEMBER(b->ptr, offset, void), avail);
 | 
			
		||||
 | 
			
		||||
	od[0].chunk->offset = 0;
 | 
			
		||||
	od[0].chunk->size = avail;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue