Changes of Revision 45
pipewire-aptx.changes
Changed
x
1
2
-------------------------------------------------------------------
3
+Wed Sep 25 20:09:19 UTC 2024 - Bjørn Lie <zaitor@opensuse.org>
4
+
5
+- Update to version 1.2.4
6
+
7
+-------------------------------------------------------------------
8
Mon Sep 16 18:48:10 UTC 2024 - Bjørn Lie <zaitor@opensuse.org>
9
10
- Update to version 1.2.3
11
pipewire-aptx.spec
Changed
10
1
2
%define soversion 0_2
3
4
Name: pipewire-aptx
5
-Version: 1.2.3
6
+Version: 1.2.4
7
Release: 0
8
Summary: PipeWire Bluetooth aptX codec plugin
9
License: MIT
10
pipewire-1.2.3.tar.bz2/NEWS -> pipewire-1.2.4.tar.bz2/NEWS
Changed
46
1
2
+# PipeWire 1.2.4 (2024-09-19)
3
+
4
+This is a bugfix release that is API and ABI compatible with the
5
+previous 1.2.x and 1.0.x releases.
6
+
7
+## Highlights
8
+ - Avoid a crash in cleanup of globals. (#4250)
9
+ - Use systemd-logind to scan for new devices in v4l2.
10
+ - Some more bugfixes and improvements.
11
+
12
+
13
+## PipeWire
14
+ - Avoid a crash in cleanup of globals. (#4250)
15
+ - Improve RequestProcess dispatch.
16
+
17
+## Tools
18
+ - Improve float parsing. (#4234)
19
+
20
+## SPA
21
+ - Clear the ringbuffer when stopping in libcamera.
22
+ - Use systemd-logind to scan for new devices in v4l2. (#3539, #3960)
23
+ - Queue dropped first buffer in v4l2.
24
+ - Unlink pcm devices when moving drivers to avoid broken pipe.
25
+
26
+## JACK
27
+ - Emit buffer_size callback in jack_activate() to improve
28
+ compatibility with GStreamer. (#4260)
29
+
30
+Older versions:
31
+
32
+
33
# PipeWire 1.2.3 (2024-08-22)
34
35
This is a bugfix release that is API and ABI compatible with the
36
37
- pw-cli can now handle arbitrarily large input and params. (#4166)
38
- Avoid some compiler warnings in pw-top.
39
40
-Older versions:
41
-
42
-
43
# PipeWire 1.2.2 (2024-07-31)
44
45
This is a bugfix release that is API and ABI compatible with the
46
pipewire-1.2.3.tar.bz2/meson.build -> pipewire-1.2.4.tar.bz2/meson.build
Changed
17
1
2
project('pipewire', 'c' ,
3
- version : '1.2.3',
4
+ version : '1.2.4',
5
license : 'MIT', 'LGPL-2.1-or-later', 'GPL-2.0-only' ,
6
meson_version : '>= 0.61.1',
7
default_options : 'warning_level=3',
8
9
'gio-2.0': {},
10
'gio-unix-2.0': {},
11
'gstreamer-1.0': {'version': '>= 1.10.0'},
12
- 'gstreamer-plugins-base-1.0': {},
13
+ 'gstreamer-base-1.0': {},
14
'gstreamer-video-1.0': {},
15
'gstreamer-audio-1.0': {},
16
'gstreamer-allocators-1.0': {},
17
pipewire-1.2.3.tar.bz2/pipewire-jack/src/pipewire-jack.c -> pipewire-1.2.4.tar.bz2/pipewire-jack/src/pipewire-jack.c
Changed
33
1
2
return res;
3
}
4
5
+static int
6
+do_emit_buffer_size(struct spa_loop *loop,
7
+ bool async, uint32_t seq, const void *data, size_t size, void *user_data)
8
+{
9
+ struct client *c = user_data;
10
+ c->buffer_frames = c->rt.position->clock.duration;
11
+ pw_log_debug("%p: emit buffersize %d", c, c->buffer_frames);
12
+ c->bufsize_callback(c->buffer_frames, c->bufsize_arg);
13
+ return 0;
14
+}
15
+
16
SPA_EXPORT
17
int jack_activate (jack_client_t *client)
18
{
19
20
if (res < 0) {
21
c->active = false;
22
pw_data_loop_stop(c->loop);
23
+ } else if (SPA_LIKELY(c->bufsize_callback != NULL)) {
24
+ pw_thread_loop_unlock(c->context.loop);
25
+ pw_data_loop_invoke(c->loop,
26
+ do_emit_buffer_size, SPA_ID_INVALID, NULL, 0, true, c);
27
+ pw_thread_loop_lock(c->context.loop);
28
}
29
-
30
pw_log_debug("%p: activate result:%d", c, res);
31
thaw_callbacks(c);
32
pw_thread_loop_unlock(c->context.loop);
33
pipewire-1.2.3.tar.bz2/spa/include/spa/param/video/h264-utils.h -> pipewire-1.2.4.tar.bz2/spa/include/spa/param/video/h264-utils.h
Changed
10
1
2
SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction(&info->framerate), 0);
3
if (info->max_framerate.denom != 0)
4
spa_pod_builder_add(builder,
5
- SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_Fraction(info->max_framerate), 0);
6
+ SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_Fraction(&info->max_framerate), 0);
7
if (info->stream_format != 0)
8
spa_pod_builder_add(builder,
9
SPA_FORMAT_VIDEO_H264_streamFormat, SPA_POD_Id(info->stream_format), 0);
10
pipewire-1.2.3.tar.bz2/spa/include/spa/param/video/mjpg-utils.h -> pipewire-1.2.4.tar.bz2/spa/include/spa/param/video/mjpg-utils.h
Changed
10
1
2
SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction(&info->framerate), 0);
3
if (info->max_framerate.denom != 0)
4
spa_pod_builder_add(builder,
5
- SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_Fraction(info->max_framerate), 0);
6
+ SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_Fraction(&info->max_framerate), 0);
7
return (struct spa_pod*)spa_pod_builder_pop(builder, &f);
8
}
9
10
pipewire-1.2.3.tar.bz2/spa/include/spa/param/video/raw-utils.h -> pipewire-1.2.4.tar.bz2/spa/include/spa/param/video/raw-utils.h
Changed
19
1
2
}
3
if (info->max_framerate.denom != 0)
4
spa_pod_builder_add(builder,
5
- SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_Fraction(info->max_framerate), 0);
6
+ SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_Fraction(&info->max_framerate), 0);
7
if (info->views != 0)
8
spa_pod_builder_add(builder,
9
SPA_FORMAT_VIDEO_views, SPA_POD_Int(info->views), 0);
10
11
SPA_FORMAT_VIDEO_interlaceMode, SPA_POD_Id(info->interlace_mode), 0);
12
if (info->pixel_aspect_ratio.denom != 0)
13
spa_pod_builder_add(builder,
14
- SPA_FORMAT_VIDEO_pixelAspectRatio,SPA_POD_Fraction(info->pixel_aspect_ratio), 0);
15
+ SPA_FORMAT_VIDEO_pixelAspectRatio, SPA_POD_Fraction(&info->pixel_aspect_ratio), 0);
16
if (info->multiview_mode != 0)
17
spa_pod_builder_add(builder,
18
SPA_FORMAT_VIDEO_multiviewMode, SPA_POD_Id(info->multiview_mode), 0);
19
pipewire-1.2.3.tar.bz2/spa/plugins/alsa/alsa-pcm.c -> pipewire-1.2.4.tar.bz2/spa/plugins/alsa/alsa-pcm.c
Changed
12
1
2
spa_list_append(&state->driver->rt.followers, &rt->driver_link);
3
rt->driver = state->driver;
4
spa_log_debug(state->log, "state:%p -> driver:%p", state, state->driver);
5
+
6
+ if(state->linked && state->matching) {
7
+ try_unlink(state);
8
+ }
9
}
10
if (state->following) {
11
remove_sources(state);
12
pipewire-1.2.3.tar.bz2/spa/plugins/audioconvert/audioadapter.c -> pipewire-1.2.4.tar.bz2/spa/plugins/audioconvert/audioadapter.c
Changed
11
1
2
3
switch (SPA_NODE_EVENT_ID(event)) {
4
case SPA_NODE_EVENT_Error:
5
- /* Forward errors */
6
+ case SPA_NODE_EVENT_RequestProcess:
7
+ /* Forward errors and process requests */
8
spa_node_emit_event(&this->hooks, event);
9
break;
10
default:
11
pipewire-1.2.3.tar.bz2/spa/plugins/libcamera/libcamera-utils.cpp -> pipewire-1.2.4.tar.bz2/spa/plugins/libcamera/libcamera-utils.cpp
Changed
9
1
2
3
freeBuffers(impl, port);
4
port->n_buffers = 0;
5
+ port->ring = SPA_RINGBUFFER_INIT();
6
7
return 0;
8
}
9
pipewire-1.2.3.tar.bz2/spa/plugins/v4l2/meson.build -> pipewire-1.2.4.tar.bz2/spa/plugins/v4l2/meson.build
Changed
15
1
2
v4l2_dependencies = spa_dep, libinotify_dep
3
4
if libudev_dep.found()
5
-v4l2_sources += 'v4l2-udev.c'
6
-v4l2_dependencies += libudev_dep
7
+ v4l2_sources += 'v4l2-udev.c'
8
+ v4l2_dependencies += libudev_dep
9
+ if systemd_dep.found()
10
+ v4l2_dependencies += systemd_dep
11
+ endif
12
endif
13
14
v4l2lib = shared_library('spa-v4l2',
15
pipewire-1.2.3.tar.bz2/spa/plugins/v4l2/v4l2-udev.c -> pipewire-1.2.4.tar.bz2/spa/plugins/v4l2/v4l2-udev.c
Changed
142
1
2
#include <spa/monitor/device.h>
3
#include <spa/monitor/utils.h>
4
5
+#include "config.h"
6
#include "v4l2.h"
7
8
+#ifdef HAVE_SYSTEMD
9
+#include <systemd/sd-login.h>
10
+#endif
11
+
12
#define MAX_DEVICES 64
13
14
enum action {
15
16
17
struct spa_source source;
18
struct spa_source notify;
19
+#ifdef HAVE_SYSTEMD
20
+ struct spa_source logind;
21
+ sd_login_monitor *logind_monitor;
22
+#endif
23
};
24
25
static int impl_udev_open(struct impl *this)
26
27
{
28
int notify_fd;
29
30
+#ifdef HAVE_SYSTEMD
31
+ /* Do not use inotify when using logind session monitoring */
32
+ if (this->logind_monitor)
33
+ return 0;
34
+#endif
35
+
36
if (this->notify.fd != -1)
37
return 0;
38
39
40
return 0;
41
}
42
43
+#ifdef HAVE_SYSTEMD
44
+static void impl_on_logind_events(struct spa_source *source)
45
+{
46
+ struct impl *this = source->data;
47
+
48
+ /* Recheck access on all v4l2 devices on logind session changes */
49
+ for (size_t i = 0; i < this->n_devices; i++)
50
+ process_device(this, ACTION_CHANGE, &this->devicesi);
51
+
52
+ sd_login_monitor_flush(this->logind_monitor);
53
+}
54
+
55
+static int start_logind(struct impl *this)
56
+{
57
+ int res;
58
+
59
+ if (this->logind_monitor)
60
+ return 0;
61
+
62
+ /* If we are not actually running logind become a NOP */
63
+ if (access("/run/systemd/seats/", F_OK) < 0)
64
+ return 0;
65
+
66
+ res = sd_login_monitor_new("session", &this->logind_monitor);
67
+ if (res < 0)
68
+ return res;
69
+
70
+ spa_log_info(this->log, "start logind monitoring");
71
+
72
+ this->logind.func = impl_on_logind_events;
73
+ this->logind.data = this;
74
+ this->logind.fd = sd_login_monitor_get_fd(this->logind_monitor);
75
+ this->logind.mask = SPA_IO_IN | SPA_IO_ERR;
76
+
77
+ spa_loop_add_source(this->main_loop, &this->logind);
78
+
79
+ return 0;
80
+}
81
+
82
+static void stop_logind(struct impl *this)
83
+{
84
+ if (this->logind_monitor) {
85
+ spa_loop_remove_source(this->main_loop, &this->logind);
86
+ sd_login_monitor_unref(this->logind_monitor);
87
+ this->logind_monitor = NULL;
88
+ }
89
+}
90
+#else
91
+/* Stubs to avoid more ifdefs below */
92
+static int start_logind(struct impl *this)
93
+{
94
+ return 0;
95
+}
96
+
97
+static void stop_logind(struct impl *this)
98
+{
99
+}
100
+#endif
101
+
102
static void impl_on_fd_events(struct spa_source *source)
103
{
104
struct impl *this = source->data;
105
106
107
spa_log_debug(this->log, "action %s", action);
108
109
- start_inotify(this);
110
-
111
if (spa_streq(action, "add") ||
112
spa_streq(action, "change")) {
113
process_udev_device(this, ACTION_CHANGE, dev);
114
115
spa_log_debug(this->log, "monitor %p", this->umonitor);
116
spa_loop_add_source(this->main_loop, &this->source);
117
118
+ if ((res = start_logind(this)) < 0)
119
+ return res;
120
+
121
if ((res = start_inotify(this)) < 0)
122
return res;
123
124
125
this->umonitor = NULL;
126
127
stop_inotify(this);
128
+ stop_logind(this);
129
130
return 0;
131
}
132
133
134
this = (struct impl *) handle;
135
this->notify.fd = -1;
136
+#ifdef HAVE_SYSTEMD
137
+ this->logind_monitor = NULL;
138
+#endif
139
140
this->log = spa_support_find(support, n_support, SPA_TYPE_INTERFACE_Log);
141
this->main_loop = spa_support_find(support, n_support, SPA_TYPE_INTERFACE_Loop);
142
pipewire-1.2.3.tar.bz2/spa/plugins/v4l2/v4l2-utils.c -> pipewire-1.2.4.tar.bz2/spa/plugins/v4l2/v4l2-utils.c
Changed
25
1
2
spa_zero(control);
3
control.id = c->ctrl_id;
4
if (xioctl(dev->fd, VIDIOC_G_CTRL, &control) < 0) {
5
+ /* Write only controls like relative pan/tilt return EACCES */
6
+ if (errno == EACCES) {
7
+ c->value = 0;
8
+ continue;
9
+ }
10
res = -errno;
11
goto done;
12
}
13
14
15
/* Drop the first frame in order to work around common firmware
16
* timestamp issues */
17
- if (buf.sequence == 0)
18
+ if (buf.sequence == 0) {
19
+ xioctl(dev->fd, VIDIOC_QBUF, &buf);
20
return 0;
21
+ }
22
23
pts = SPA_TIMEVAL_TO_NSEC(&buf.timestamp);
24
spa_log_trace(this->log, "v4l2 %p: have output %d", this, buf.index);
25
pipewire-1.2.3.tar.bz2/spa/plugins/videoconvert/videoadapter.c -> pipewire-1.2.4.tar.bz2/spa/plugins/videoconvert/videoadapter.c
Changed
11
1
2
3
switch (SPA_NODE_EVENT_ID(event)) {
4
case SPA_NODE_EVENT_Error:
5
- /* Forward errors */
6
+ case SPA_NODE_EVENT_RequestProcess:
7
+ /* Forward errors and process requests */
8
spa_node_emit_event(&this->hooks, event);
9
break;
10
default:
11
pipewire-1.2.3.tar.bz2/src/gst/gstpipewireformat.c -> pipewire-1.2.4.tar.bz2/src/gst/gstpipewireformat.c
Changed
10
1
2
g_ptr_array_add(fmt_array, g_strdup_printf ("%s", fmt_str));
3
4
#ifdef HAVE_GSTREAMER_DMA_DRM
5
- {
6
+ if (modsj != DRM_FORMAT_MOD_INVALID) {
7
char *drm_str;
8
9
if ((drm_str = video_id_to_dma_drm_fourcc(idi, modsj)))
10
pipewire-1.2.3.tar.bz2/src/modules/module-rtp-sap.c -> pipewire-1.2.4.tar.bz2/src/modules/module-rtp-sap.c
Changed
15
1
2
impl->gm_id6,
3
impl->gm_id7,
4
0/* domain */);
5
- } else {
6
- spa_strbuf_append(&buf, "a=ts-refclk:%s\n", sdp->ts_refclk);
7
+ } else if (sdp->ts_refclk != NULL) {
8
+ spa_strbuf_append(&buf, "a=ts-refclk:%s\n", sdp->ts_refclk);
9
}
10
- spa_strbuf_append(&buf, "a=mediaclk:direct=%u\n", sdp->ts_offset);
11
+ spa_strbuf_append(&buf, "a=mediaclk:direct=%u\n", sdp->ts_offset);
12
} else {
13
spa_strbuf_append(&buf, "a=mediaclk:sender\n");
14
}
15
pipewire-1.2.3.tar.bz2/src/pipewire/global.c -> pipewire-1.2.4.tar.bz2/src/pipewire/global.c
Changed
11
1
2
struct pw_resource *resource;
3
struct pw_context *context = global->context;
4
5
+ if (global->destroyed)
6
+ return;
7
+
8
global->destroyed = true;
9
10
pw_log_debug("%p: destroy %u", global, global->id);
11
pipewire-1.2.3.tar.bz2/src/pipewire/impl-node.c -> pipewire-1.2.4.tar.bz2/src/pipewire/impl-node.c
Changed
10
1
2
break;
3
case SPA_NODE_EVENT_RequestProcess:
4
pw_log_debug("request process");
5
- if (!node->driving) {
6
+ if (!node->driving && !node->exported) {
7
pw_impl_node_send_command(node->driver_node,
8
&SPA_NODE_COMMAND_INIT(SPA_NODE_COMMAND_RequestProcess));
9
}
10
pipewire-1.2.3.tar.bz2/src/tools/pw-cat.c -> pipewire-1.2.4.tar.bz2/src/tools/pw-cat.c
Changed
11
1
2
break;
3
4
case OPT_VOLUME:
5
- data.volume = (float)atof(optarg);
6
+ if (!spa_atof(optarg, &data.volume))
7
+ data.volume = (float)atof(optarg);
8
break;
9
default:
10
goto error_usage;
11
pipewire-1.2.3.tar.bz2/src/tools/pw-loopback.c -> pipewire-1.2.4.tar.bz2/src/tools/pw-loopback.c
Changed
11
1
2
data.latency = atoi(optarg) * DEFAULT_RATE / SPA_MSEC_PER_SEC;
3
break;
4
case 'd':
5
- data.delay = (float)atof(optarg);
6
+ if (!spa_atof(optarg, &data.delay))
7
+ data.delay = (float)atof(optarg);
8
break;
9
case 'C':
10
pw_properties_set(data.capture_props, PW_KEY_TARGET_OBJECT, optarg);
11