pipewire/spa/plugins/audiotestsrc/render.c
Wim Taymans 499dd3ff22 node: add port and node params
Add a new struct spa_param_info that lists the available params on
a node/port and if they are readable/writable/updated. We can use
this to replace and improve the PARAM_List and also to notify
property change and updates.

Update elements and code to deal with this new param stuff. Add
port and node info to most elements and signal changes.

Use async enum_params in -inspect and use the param info to know
which ones to enumerate.

Use the port info to know what parameters to update in the
remote-node.
2019-02-27 16:43:01 +01:00

65 lines
2.4 KiB
C

/* Spa
*
* Copyright © 2018 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#include <math.h>
#define M_PI_M2 ( M_PI + M_PI )
#define DEFINE_SINE(type,scale) \
static void \
audio_test_src_create_sine_##type (struct impl *this, type *samples, size_t n_samples) \
{ \
size_t i; \
uint32_t c, channels; \
float step, amp; \
float freq = this->props.freq; \
float volume = this->props.volume; \
\
channels = this->port.current_format.info.raw.channels; \
step = M_PI_M2 * freq / this->port.current_format.info.raw.rate; \
amp = volume * scale; \
\
for (i = 0; i < n_samples; i++) { \
type val; \
this->port.accumulator += step; \
if (this->port.accumulator >= M_PI_M2) \
this->port.accumulator -= M_PI_M2; \
val = (type) (sin (this->port.accumulator) * amp); \
for (c = 0; c < channels; ++c) \
*samples++ = val; \
} \
}
DEFINE_SINE(int16_t, 32767.0);
DEFINE_SINE(int32_t, 2147483647.0);
DEFINE_SINE(float, 1.0);
DEFINE_SINE(double, 1.0);
static const render_func_t sine_funcs[] = {
(render_func_t) audio_test_src_create_sine_int16_t,
(render_func_t) audio_test_src_create_sine_int32_t,
(render_func_t) audio_test_src_create_sine_float,
(render_func_t) audio_test_src_create_sine_double
};