mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-01 22:58:50 -04:00
work on port-update control message
Serialize format and properties. Simplify the properties by moving the unset-mask inside the property structure. We can then also just use the index of the property as the bit in the mask. Work on stopping on disconnect
This commit is contained in:
parent
de53315f6e
commit
0d2f5a1386
24 changed files with 318 additions and 238 deletions
|
|
@ -124,54 +124,42 @@ static const SpaPropInfo prop_info[] =
|
|||
strlen (default_device)+1, default_device,
|
||||
SPA_PROP_RANGE_TYPE_NONE, 0, NULL,
|
||||
NULL,
|
||||
offsetof (SpaALSASinkProps, device),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaALSASinkProps, device) },
|
||||
{ PROP_ID_DEVICE_NAME, "device-name", "Human-readable name of the sound device",
|
||||
SPA_PROP_FLAG_READABLE,
|
||||
SPA_PROP_TYPE_STRING, 127,
|
||||
0, NULL,
|
||||
SPA_PROP_RANGE_TYPE_NONE, 0, NULL,
|
||||
NULL,
|
||||
offsetof (SpaALSASinkProps, device_name),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaALSASinkProps, device_name) },
|
||||
{ PROP_ID_CARD_NAME, "card-name", "Human-readable name of the sound card",
|
||||
SPA_PROP_FLAG_READABLE,
|
||||
SPA_PROP_TYPE_STRING, 127,
|
||||
0, NULL,
|
||||
SPA_PROP_RANGE_TYPE_NONE, 0, NULL,
|
||||
NULL,
|
||||
offsetof (SpaALSASinkProps, card_name),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaALSASinkProps, card_name) },
|
||||
{ PROP_ID_BUFFER_TIME, "buffer-time", "The total size of the buffer in time",
|
||||
SPA_PROP_FLAG_READWRITE,
|
||||
SPA_PROP_TYPE_UINT32, sizeof (uint32_t),
|
||||
sizeof (uint32_t), &default_buffer_time,
|
||||
SPA_PROP_RANGE_TYPE_MIN_MAX, 2, uint32_range,
|
||||
NULL,
|
||||
offsetof (SpaALSASinkProps, buffer_time),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaALSASinkProps, buffer_time) },
|
||||
{ PROP_ID_PERIOD_TIME, "period-time", "The size of a period in time",
|
||||
SPA_PROP_FLAG_READWRITE,
|
||||
SPA_PROP_TYPE_UINT32, sizeof (uint32_t),
|
||||
sizeof (uint32_t), &default_period_time,
|
||||
SPA_PROP_RANGE_TYPE_MIN_MAX, 2, uint32_range,
|
||||
NULL,
|
||||
offsetof (SpaALSASinkProps, period_time),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaALSASinkProps, period_time) },
|
||||
{ PROP_ID_PERIOD_EVENT, "period-event", "Generate an event each period",
|
||||
SPA_PROP_FLAG_READWRITE,
|
||||
SPA_PROP_TYPE_BOOL, sizeof (bool),
|
||||
sizeof (bool), &default_period_event,
|
||||
SPA_PROP_RANGE_TYPE_NONE, 0, NULL,
|
||||
NULL,
|
||||
offsetof (SpaALSASinkProps, period_event),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaALSASinkProps, period_event) },
|
||||
};
|
||||
|
||||
static SpaResult
|
||||
|
|
|
|||
|
|
@ -90,27 +90,21 @@ static const SpaPropInfo prop_info[] =
|
|||
sizeof (uint32_t), &default_wave,
|
||||
SPA_PROP_RANGE_TYPE_ENUM, SPA_N_ELEMENTS (wave_range), wave_range,
|
||||
NULL,
|
||||
offsetof (SpaAudioTestSrcProps, wave),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaAudioTestSrcProps, wave) },
|
||||
{ PROP_ID_FREQ, "freq", "Frequency of test signal. The sample rate needs to be at least 4 times higher",
|
||||
SPA_PROP_FLAG_READWRITE,
|
||||
SPA_PROP_TYPE_DOUBLE, sizeof (double),
|
||||
sizeof (double), &default_freq,
|
||||
SPA_PROP_RANGE_TYPE_MIN_MAX, 2, freq_range,
|
||||
NULL,
|
||||
offsetof (SpaAudioTestSrcProps, freq),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaAudioTestSrcProps, freq) },
|
||||
{ PROP_ID_VOLUME, "volume", "The Volume factor",
|
||||
SPA_PROP_FLAG_READWRITE,
|
||||
SPA_PROP_TYPE_DOUBLE, sizeof (double),
|
||||
sizeof (double), &default_volume,
|
||||
SPA_PROP_RANGE_TYPE_MIN_MAX, 2, volume_range,
|
||||
NULL,
|
||||
offsetof (SpaAudioTestSrcProps, volume),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaAudioTestSrcProps, volume) },
|
||||
};
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -90,9 +90,7 @@ static const SpaPropInfo prop_info[PROP_ID_LAST] =
|
|||
sizeof (int), NULL,
|
||||
SPA_PROP_RANGE_TYPE_NONE, 0, NULL,
|
||||
NULL,
|
||||
offsetof (SpaProxyProps, socketfd),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaProxyProps, socketfd) },
|
||||
};
|
||||
|
||||
static void
|
||||
|
|
@ -920,6 +918,7 @@ parse_control (SpaProxy *this,
|
|||
{
|
||||
SpaControlCmdPortUpdate pu;
|
||||
SpaProxyPort *port;
|
||||
unsigned int i;
|
||||
|
||||
fprintf (stderr, "proxy %p: got port update %d\n", this, cmd);
|
||||
if (spa_control_iter_parse_cmd (&it, &pu) < 0)
|
||||
|
|
@ -929,6 +928,12 @@ parse_control (SpaProxy *this,
|
|||
break;
|
||||
|
||||
port = &this->ports[pu.port_id];
|
||||
|
||||
for (i = 0; i < pu.n_possible_formats; i++)
|
||||
spa_debug_format (pu.possible_formats[i]);
|
||||
|
||||
spa_debug_props (pu.props, true);
|
||||
|
||||
if (!port->valid && pu.direction != SPA_DIRECTION_INVALID) {
|
||||
do_init_port (this, pu.port_id, pu.direction);
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
|
||||
typedef struct _SpaV4l2Source SpaV4l2Source;
|
||||
|
||||
static const char default_device[] = "/dev/video1";
|
||||
static const char default_device[] = "/dev/video0";
|
||||
|
||||
typedef struct {
|
||||
SpaProps props;
|
||||
|
|
@ -66,7 +66,6 @@ typedef struct _V4l2Format V4l2Format;
|
|||
|
||||
struct _V4l2Format {
|
||||
SpaFormat fmt;
|
||||
uint32_t unset_mask;
|
||||
SpaVideoFormat format;
|
||||
SpaRectangle size;
|
||||
SpaFraction framerate;
|
||||
|
|
@ -146,27 +145,21 @@ static const SpaPropInfo prop_info[] =
|
|||
strlen (default_device)+1, default_device,
|
||||
SPA_PROP_RANGE_TYPE_NONE, 0, NULL,
|
||||
NULL,
|
||||
offsetof (SpaV4l2SourceProps, device),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaV4l2SourceProps, device) },
|
||||
{ PROP_ID_DEVICE_NAME, "device-name", "Human-readable name of the device",
|
||||
SPA_PROP_FLAG_READABLE,
|
||||
SPA_PROP_TYPE_STRING, 127,
|
||||
0, NULL,
|
||||
SPA_PROP_RANGE_TYPE_NONE, 0, NULL,
|
||||
NULL,
|
||||
offsetof (SpaV4l2SourceProps, device_name),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaV4l2SourceProps, device_name) },
|
||||
{ PROP_ID_DEVICE_FD, "device-fd", "Device file descriptor",
|
||||
SPA_PROP_FLAG_READABLE,
|
||||
SPA_PROP_TYPE_UINT32, sizeof (uint32_t),
|
||||
0, NULL,
|
||||
SPA_PROP_RANGE_TYPE_NONE, 0, NULL,
|
||||
NULL,
|
||||
offsetof (SpaV4l2SourceProps, device_fd),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaV4l2SourceProps, device_fd) },
|
||||
};
|
||||
|
||||
static SpaResult
|
||||
|
|
@ -347,20 +340,12 @@ spa_v4l2_format_init (V4l2Format *f)
|
|||
spa_video_raw_fill_prop_info (&f->infos[0],
|
||||
SPA_PROP_ID_VIDEO_FORMAT,
|
||||
offsetof (V4l2Format, format));
|
||||
f->infos[0].mask_offset = offsetof (V4l2Format, unset_mask);
|
||||
f->infos[0].unset_mask = 1 << 0;
|
||||
|
||||
spa_video_raw_fill_prop_info (&f->infos[1],
|
||||
SPA_PROP_ID_VIDEO_SIZE,
|
||||
offsetof (V4l2Format, size));
|
||||
f->infos[1].mask_offset = offsetof (V4l2Format, unset_mask);
|
||||
f->infos[1].unset_mask = 1 << 1;
|
||||
|
||||
spa_video_raw_fill_prop_info (&f->infos[2],
|
||||
SPA_PROP_ID_VIDEO_FRAMERATE,
|
||||
offsetof (V4l2Format, framerate));
|
||||
f->infos[2].mask_offset = offsetof (V4l2Format, unset_mask);
|
||||
f->infos[2].unset_mask = 1 << 2;
|
||||
}
|
||||
|
||||
static SpaResult
|
||||
|
|
|
|||
|
|
@ -279,13 +279,12 @@ again:
|
|||
fmt->fmt.media_subtype = info->media_subtype;
|
||||
fmt->fmt.props.prop_info = fmt->infos;
|
||||
fmt->fmt.props.n_prop_info = pi = 0;
|
||||
fmt->unset_mask = 0;
|
||||
fmt->fmt.props.unset_mask = 0;
|
||||
|
||||
if (info->media_subtype == SPA_MEDIA_SUBTYPE_RAW) {
|
||||
spa_video_raw_fill_prop_info (&fmt->infos[pi],
|
||||
SPA_PROP_ID_VIDEO_FORMAT,
|
||||
offsetof (V4l2Format, format));
|
||||
fmt->infos[pi].mask_offset = offsetof (V4l2Format, unset_mask);
|
||||
fmt->format = info->format;
|
||||
pi = ++fmt->fmt.props.n_prop_info;
|
||||
}
|
||||
|
|
@ -293,7 +292,6 @@ again:
|
|||
spa_video_raw_fill_prop_info (&fmt->infos[pi],
|
||||
SPA_PROP_ID_VIDEO_SIZE,
|
||||
offsetof (V4l2Format, size));
|
||||
fmt->infos[pi].mask_offset = offsetof (V4l2Format, unset_mask);
|
||||
fmt->size.width = state->frmsize.discrete.width;
|
||||
fmt->size.height = state->frmsize.discrete.height;
|
||||
pi = ++fmt->fmt.props.n_prop_info;
|
||||
|
|
@ -301,7 +299,6 @@ again:
|
|||
spa_video_raw_fill_prop_info (&fmt->infos[pi],
|
||||
SPA_PROP_ID_VIDEO_FRAMERATE,
|
||||
offsetof (V4l2Format, framerate));
|
||||
fmt->infos[pi].mask_offset = offsetof (V4l2Format, unset_mask);
|
||||
fmt->infos[pi].range_type = SPA_PROP_RANGE_TYPE_ENUM;
|
||||
fmt->infos[pi].range_values = fmt->ranges;
|
||||
fmt->infos[pi].n_range_values = 0;
|
||||
|
|
@ -328,8 +325,7 @@ again:
|
|||
i = ++state->frmival.index;
|
||||
}
|
||||
fmt->infos[pi].n_range_values = i;
|
||||
fmt->infos[pi].unset_mask = 1 << i;
|
||||
fmt->unset_mask |= fmt->infos[pi].unset_mask;
|
||||
fmt->fmt.props.unset_mask |= 1 << pi;
|
||||
pi = ++fmt->fmt.props.n_prop_info;
|
||||
|
||||
*format = &state->format[0].fmt;
|
||||
|
|
|
|||
|
|
@ -81,18 +81,14 @@ static const SpaPropInfo prop_info[] =
|
|||
sizeof (double), &default_volume,
|
||||
SPA_PROP_RANGE_TYPE_MIN_MAX, 2, volume_range,
|
||||
NULL,
|
||||
offsetof (SpaVolumeProps, volume),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaVolumeProps, volume) },
|
||||
{ PROP_ID_MUTE, "mute", "Mute",
|
||||
SPA_PROP_FLAG_READWRITE,
|
||||
SPA_PROP_TYPE_BOOL, sizeof (bool),
|
||||
sizeof (bool), &default_mute,
|
||||
SPA_PROP_RANGE_TYPE_NONE, 0, NULL,
|
||||
NULL,
|
||||
offsetof (SpaVolumeProps, mute),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaVolumeProps, mute) },
|
||||
};
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -103,27 +103,21 @@ static const SpaPropInfo prop_info[] =
|
|||
strlen (default_device)+1, default_device,
|
||||
SPA_PROP_RANGE_TYPE_NONE, 0, NULL,
|
||||
NULL,
|
||||
offsetof (SpaXvSinkProps, device),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaXvSinkProps, device) },
|
||||
{ PROP_ID_DEVICE_NAME, "device-name", "Human-readable name of the device",
|
||||
SPA_PROP_FLAG_READABLE,
|
||||
SPA_PROP_TYPE_STRING, 127,
|
||||
0, NULL,
|
||||
SPA_PROP_RANGE_TYPE_NONE, 0, NULL,
|
||||
NULL,
|
||||
offsetof (SpaXvSinkProps, device_name),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaXvSinkProps, device_name) },
|
||||
{ PROP_ID_DEVICE_FD, "device-fd", "Device file descriptor",
|
||||
SPA_PROP_FLAG_READABLE,
|
||||
SPA_PROP_TYPE_UINT32, sizeof (uint32_t),
|
||||
0, NULL,
|
||||
SPA_PROP_RANGE_TYPE_NONE, 0, NULL,
|
||||
NULL,
|
||||
offsetof (SpaXvSinkProps, device_fd),
|
||||
0, 0,
|
||||
NULL },
|
||||
offsetof (SpaXvSinkProps, device_fd) },
|
||||
};
|
||||
|
||||
static SpaResult
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue