Projects
Essentials
pipewire-aptx
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 41
View file
pipewire-aptx.changes
Changed
@@ -1,4 +1,9 @@ ------------------------------------------------------------------- +Wed Jan 24 22:21:37 UTC 2024 - Mariusz Fik <fisiu@opensuse.org> + +- Update to version 1.0.1 + +------------------------------------------------------------------- Mon Nov 27 08:46:54 UTC 2023 - Bjørn Lie <zaitor@opensuse.org> - Update to version 1.0.0
View file
pipewire-aptx.spec
Changed
@@ -7,12 +7,12 @@ %define soversion 0_2 Name: pipewire-aptx -Version: 1.0.0 +Version: 1.0.1 Release: 0 Summary: PipeWire Bluetooth aptX codec plugin License: MIT URL: https://gitlab.freedesktop.org/pipewire/pipewire -Source: %{url}/-/archive/%{version}/pipewire-%{version}.tar.gz +Source: %{url}/-/archive/%{version}/pipewire-%{version}.tar.bz2 BuildRequires: c++_compiler BuildRequires: c_compiler
View file
pipewire-1.0.0.tar.gz/NEWS -> pipewire-1.0.1.tar.bz2/NEWS
Changed
@@ -1,3 +1,57 @@ +# PipeWire 1.0.1 (2024-01-11) + +This is a bugfix release that is API and ABI compatible with previous +1.0.x releases. + +## Highlights + - Work around the buggy ALSA backend in libcanberra by forcing the pulse + backend in module-x11-bell. + - Fix a race in the device info updates in pulse-server. + - Fix timing and rate matching in ALSA sequencer. + - Improve timing information in JACK and from the ALSA driver. + - More small fixes and improvements. + + +## PipeWire + - Fix a build issue when examples where disabled. + - Avoid some compiler warnings. + - Avoid some bitfield data races. (#3706) + +## Modules + - Bump the PTP driver priority. (#3217) + - Support the previous "allowed" permission in the access module. + - Fix filename leak in module-filter-chain. + - Work around the buggy ALSA backend in libcanberra by forcing the pulse + backend in module-x11-bell. (#3688) + - Fix a race in the device info updates in pulse-server. + - Fix compatibility in RAOP. (#3698) + +## SPA + - Handle ALSA picth control errors correctly + - Clamp buffer-frames correctly. (#3000) + - Fix timing and rate matching in ALSA sequencer. (#3657) + - Revert a commit that could result in current time in the future in the + timing updates. + - Improve adapter state checks. + - Remove the timer from the ALSA pcm. + - Fix timeout in freewheel driver. + +## Pulse-server + - Also handle active ports for monitor sources. + - Fix zeroconf-publish format properties. + +## JACK + - Improve timing and transport calculations. + - Handle -ENOENT from the core and don't error out. + +## GStreamer + - Handle node port removal in the device provider. (#3708) + - Improve error handling while connecting. + - Fix dts_offset. + +Older versions: + + # PipeWire 1.0.0 (2023-11-26) The PipeWire project is immensely proud to announce the 1.0 release @@ -76,9 +130,6 @@ - Manpages are now made with Doxygen. - Add docs for pulse-modules -Older versions: - - # PipeWire 0.3.85 (2023-11-16) This is the fifth (and last) 1.0 release candidate that is API and ABI
View file
pipewire-1.0.0.tar.gz/meson.build -> pipewire-1.0.1.tar.bz2/meson.build
Changed
@@ -1,5 +1,5 @@ project('pipewire', 'c' , - version : '1.0.0', + version : '1.0.1', license : 'MIT', 'LGPL-2.1-or-later', 'GPL-2.0-only' , meson_version : '>= 0.61.1', default_options : 'warning_level=3',
View file
pipewire-1.0.0.tar.gz/meson_options.txt -> pipewire-1.0.1.tar.bz2/meson_options.txt
Changed
@@ -61,7 +61,7 @@ option('jack-devel', description: 'Install jack development files', type: 'boolean', - value: 'false') + value: false) option('libjack-path', description: 'Where to install the libjack.so library', type: 'string') @@ -268,7 +268,7 @@ option('legacy-rtkit', description: 'Build legacy rtkit module', type: 'boolean', - value: 'true') + value: true) option('avb', description: 'Enable AVB code', type: 'feature', @@ -292,7 +292,7 @@ option('pam-defaults-install', description: 'Install limits.d file modifying defaults for all PAM users. Only for old kernels/systemd!', type: 'boolean', - value: 'false') + value: false) option('pam-memlock-default', description : 'The default memlock value for any PAM user in kilobytes. Multiples of 64 recommended.', type : 'integer', @@ -301,7 +301,7 @@ option('rlimits-install', description: 'Install PAM limits.d file. Voids all following rlimits-* options, if false', type: 'boolean', - value: 'true') + value: true) option('rlimits-match', description : 'PAM match rule for the generated limits.d file. @<name> denotes matching a group.', type : 'string',
View file
pipewire-1.0.0.tar.gz/pipewire-jack/src/pipewire-jack.c -> pipewire-1.0.1.tar.bz2/pipewire-jack/src/pipewire-jack.c
Changed
@@ -1210,6 +1210,11 @@ id, seq, res, spa_strerror(res), message); if (id == PW_ID_CORE) { + /* This happens when we did something on a proxy that + * was destroyed on the server already */ + if (res == -ENOENT) + return; + client->last_res = res; if (res == -EPIPE && !client->destroyed) { queue_notify(client, NOTIFY_TYPE_SHUTDOWN, @@ -4064,6 +4069,7 @@ exit_unlock: pw_thread_loop_unlock(client->context.loop); exit: + pw_log_info("%p: error %d", client, *status); jack_client_close((jack_client_t *) client); return NULL; disabled: @@ -6396,7 +6402,7 @@ { struct client *c = (struct client *) client; struct frame_times times; - uint64_t diff; + int64_t diff; return_val_if_fail(c != NULL, 0); @@ -6438,14 +6444,14 @@ get_frame_times(c, ×); + if (times.sample_rate == 0 || times.rate_diff == 0.0) + return -1; + *current_frames = times.frames; - *current_usecs = times.nsec / SPA_NSEC_PER_USEC; *next_usecs = times.next_nsec / SPA_NSEC_PER_USEC; - if (times.sample_rate == 0 || times.rate_diff == 0.0) - *period_usecs = (times.next_nsec - times.nsec) / SPA_NSEC_PER_USEC; - else - *period_usecs = times.buffer_frames * + *period_usecs = times.buffer_frames * (float)SPA_USEC_PER_SEC / (times.sample_rate * times.rate_diff); + *current_usecs = *next_usecs - (jack_time_t)*period_usecs; pw_log_trace("%p: %d %"PRIu64" %"PRIu64" %f", c, *current_frames, *current_usecs, *next_usecs, *period_usecs); @@ -6462,14 +6468,15 @@ get_frame_times(c, ×); - if (times.buffer_frames == 0) + if (times.buffer_frames == 0 || times.sample_rate == 0 || times.rate_diff == 0.0) return 0; uint32_t nf = (uint32_t)times.frames; - uint64_t w = times.nsec/SPA_NSEC_PER_USEC; uint64_t nw = times.next_nsec/SPA_NSEC_PER_USEC; + uint64_t dp = (uint64_t)(times.buffer_frames * + (float)SPA_USEC_PER_SEC / (times.sample_rate * times.rate_diff)); + uint64_t w = nw - dp; int32_t df = frames - nf; - int64_t dp = nw - w; return w + (int64_t)rint((double) df * (double) dp / times.buffer_frames); } @@ -6483,14 +6490,15 @@ get_frame_times(c, ×); - if (times.buffer_frames == 0) + if (times.sample_rate == 0 || times.rate_diff == 0.0) return 0; uint32_t nf = (uint32_t)times.frames; - uint64_t w = times.nsec/SPA_NSEC_PER_USEC; uint64_t nw = times.next_nsec/SPA_NSEC_PER_USEC; + uint64_t dp = (uint64_t)(times.buffer_frames * + (float)SPA_USEC_PER_SEC / (times.sample_rate * times.rate_diff)); + uint64_t w = nw - dp; int64_t du = usecs - w; - int64_t dp = nw - w; return nf + (int32_t)rint((double)du / (double)dp * times.buffer_frames); }
View file
pipewire-1.0.0.tar.gz/spa/examples/meson.build -> pipewire-1.0.1.tar.bz2/spa/examples/meson.build
Changed
@@ -6,6 +6,10 @@ 'local-v4l2', +if not get_option('examples').allowed() + subdir_done() +endif + spa_examples_extra_deps = { 'local-v4l2': sdl_dep, 'local-libcamera': sdl_dep, libcamera_dep,
View file
pipewire-1.0.0.tar.gz/spa/include/spa/param/video/multiview.h -> pipewire-1.0.1.tar.bz2/spa/include/spa/param/video/multiview.h
Changed
@@ -59,12 +59,11 @@ * sequence. This method only applies to * raw video buffers at the moment. * Specific view identification is via - * \ref spa_video_multiview_meta on raw - * video buffers. */ + * metadata on raw video buffers. */ SPA_VIDEO_MULTIVIEW_MODE_SEPARATED, /**< Multiple views are provided as separate * \ref spa_data framebuffers attached * to each \ref spa_buffer, described - * by the \ref spa_video_multiview_meta */ + * by the metadata */ /* future expansion for annotated modes */ }; @@ -97,9 +96,7 @@ SPA_VIDEO_MULTIVIEW_FLAGS_MIXED_MONO = (1 << 15), /**< The video stream contains both * mono and multiview portions, * signalled on each buffer by the - * absence or presence of the - * \ref SPA_VIDEO_BUFFER_FLAG_MULTIPLE_VIEW - * buffer flag. */ + * absence or presence of a buffer flag. */ };
View file
pipewire-1.0.0.tar.gz/spa/meson.build -> pipewire-1.0.1.tar.bz2/spa/meson.build
Changed
@@ -113,6 +113,4 @@ subdir('tools') subdir('tests') -if get_option('examples').allowed() - subdir('examples') -endif +subdir('examples')
View file
pipewire-1.0.0.tar.gz/spa/plugins/alsa/acp/acp.c -> pipewire-1.0.1.tar.bz2/spa/plugins/alsa/acp/acp.c
Changed
@@ -1140,7 +1140,8 @@ { pa_cvolume r; - dev->real_volume = *v; + if (v != &dev->real_volume) + dev->real_volume = *v; if (!dev->mixer_handle) return;
View file
pipewire-1.0.0.tar.gz/spa/plugins/alsa/alsa-pcm.c -> pipewire-1.0.1.tar.bz2/spa/plugins/alsa/alsa-pcm.c
Changed
@@ -776,7 +776,8 @@ while (spa_json_get_string(&it1, v, sizeof(v)) > 0 && i < SPA_N_ELEMENTS(state->bound_ctls)) { - strncpy(state->bound_ctlsi.name, v, sizeof(state->bound_ctlsi.name)); + snprintf(state->bound_ctlsi.name, + sizeof(state->bound_ctlsi.name), "%s", v); i++; } state->num_bind_ctls = i; @@ -902,8 +903,9 @@ if (opened) { snd_ctl_close(state->ctl); state->ctl = NULL; - goto error; } + + goto error; } snd_ctl_elem_value_set_integer(state->pitch_elem, 0, 1000000); @@ -2082,7 +2084,7 @@ } else { CHECK(snd_pcm_hw_params_get_buffer_size_max(params, &state->buffer_frames), "get_buffer_size_max"); - state->buffer_frames = SPA_MIN(state->buffer_frames, state->quantum_limit * 4)* state->frame_scale; + state->buffer_frames = SPA_MIN(state->buffer_frames, state->quantum_limit * 4 * state->frame_scale); CHECK(snd_pcm_hw_params_set_buffer_size_min(hndl, params, &state->buffer_frames), "set_buffer_size_min"); CHECK(snd_pcm_hw_params_set_buffer_size_near(hndl, params, &state->buffer_frames), "set_buffer_size_near"); @@ -2180,8 +2182,6 @@ /* start the transfer */ CHECK(snd_pcm_sw_params_set_start_threshold(hndl, params, LONG_MAX), "set_start_threshold"); - CHECK(snd_pcm_sw_params_set_period_event(hndl, params, state->disable_tsched), "set_period_event"); - if (state->disable_tsched) { snd_pcm_uframes_t avail_min; @@ -2531,15 +2531,6 @@ return 0; } - -static uint64_t get_time_ns(struct state *state) -{ - struct timespec now; - if (spa_system_clock_gettime(state->data_system, CLOCK_MONOTONIC, &now) < 0) - return 0; - return SPA_TIMESPEC_TO_NSEC(&now); -} - static int update_time(struct state *state, uint64_t current_time, snd_pcm_sframes_t delay, snd_pcm_sframes_t target, bool follower) { @@ -2547,15 +2538,8 @@ int32_t diff; if (state->disable_tsched && !follower) { - uint64_t now = get_time_ns(state); - - if (SPA_UNLIKELY(state->dll.bw == 0.0)) { - current_time = now; - err = 0.0; - } else { - err = (int64_t)(now - current_time); - err = err / 1e9 * state->rate; - } + err = (int64_t)(current_time - state->next_time); + err = err / 1e9 * state->rate; } else { if (state->stream == SND_PCM_STREAM_PLAYBACK) err = delay - target; @@ -3182,6 +3166,14 @@ return 0; } +static uint64_t get_time_ns(struct state *state) +{ + struct timespec now; + if (spa_system_clock_gettime(state->data_system, CLOCK_MONOTONIC, &now) < 0) + return 0; + return SPA_TIMESPEC_TO_NSEC(&now); +} + static void alsa_wakeup_event(struct spa_source *source) { struct state *state = source->data, *follower; @@ -3193,6 +3185,8 @@ int err; unsigned short revents; + current_time = get_time_ns(state); + for (int i = 0; i < state->n_fds; i++) { state->pfdsi.revents = state->sourcei.rmask; /* Reset so that we only handle all our sources' events once */ @@ -3228,8 +3222,8 @@ return; } } + current_time = state->next_time; } - current_time = state->next_time; /* first do all the sync */ if (state->stream == SND_PCM_STREAM_CAPTURE)
View file
pipewire-1.0.0.tar.gz/spa/plugins/alsa/alsa-seq-bridge.c -> pipewire-1.0.1.tar.bz2/spa/plugins/alsa/alsa-seq-bridge.c
Changed
@@ -677,7 +677,7 @@ { struct seq_state *this = object; struct seq_port *port; - int res; + int res = 0; spa_return_val_if_fail(this != NULL, -EINVAL);
View file
pipewire-1.0.0.tar.gz/spa/plugins/alsa/alsa-seq.c -> pipewire-1.0.1.tar.bz2/spa/plugins/alsa/alsa-seq.c
Changed
@@ -703,9 +703,7 @@ const snd_seq_real_time_t* queue_time; uint64_t queue_real; double err, corr; - uint64_t queue_elapsed; - - corr = 1.0 - (state->dll.z2 + state->dll.z3); + uint64_t q1, q2; /* take queue time */ snd_seq_queue_status_alloca(&status); @@ -713,33 +711,43 @@ queue_time = snd_seq_queue_status_get_real_time(status); queue_real = SPA_TIMESPEC_TO_NSEC(queue_time); - if (state->queue_time == 0) - queue_elapsed = 0; - else - queue_elapsed = (queue_real - state->queue_time) / corr; - - state->queue_time = queue_real; - - queue_elapsed = NSEC_TO_CLOCK(&state->rate, queue_elapsed); - - err = ((int64_t)state->threshold - (int64_t) queue_elapsed); - err = SPA_CLAMP(err, -64, 64); - if (state->dll.bw == 0.0) { spa_dll_set_bw(&state->dll, SPA_DLL_BW_MAX, state->threshold, state->rate.denom); state->next_time = nsec; state->base_time = nsec; + state->queue_next = queue_real; } + + /* track our estimated elapsed time against the real elapsed queue time */ + q1 = NSEC_TO_CLOCK(&state->rate, state->queue_next); + q2 = NSEC_TO_CLOCK(&state->rate, queue_real); + err = ((int64_t)q1 - (int64_t) q2); + + if (fabs(err) > state->threshold) + spa_dll_init(&state->dll); + + err = SPA_CLAMP(err, -64, 64); corr = spa_dll_update(&state->dll, err); + /* this is our current estimated queue time and rate */ + state->queue_time = state->queue_next; + state->queue_corr = corr; + + /* make a new estimated queue time with the current quantum, if we are following, + * use the rate correction, else we will use the rate correction only for the new + * timeout. */ + if (state->following) + state->queue_next += state->threshold * corr * 1e9 / state->rate.denom; + else + state->queue_next += state->threshold * 1e9 / state->rate.denom; + if ((state->next_time - state->base_time) > BW_PERIOD) { state->base_time = state->next_time; spa_log_debug(state->log, "%p: follower:%d rate:%f bw:%f err:%f (%f %f %f)", state, follower, corr, state->dll.bw, err, state->dll.z1, state->dll.z2, state->dll.z3); } - state->next_time += state->threshold / corr * 1e9 / state->rate.denom; if (!follower && state->clock) { @@ -850,8 +858,11 @@ int res; if ((res = spa_system_clock_gettime(state->data_system, CLOCK_MONOTONIC, &now)) < 0) - return res; + return res; + state->queue_time = 0; + state->queue_corr = 1.0; + spa_dll_init(&state->dll); state->next_time = SPA_TIMESPEC_TO_NSEC(&now); if (state->following) { set_timeout(state, 0); @@ -898,11 +909,9 @@ state->source.rmask = 0; spa_loop_add_source(state->data_loop, &state->source); - state->queue_time = 0; - spa_dll_init(&state->dll); - set_timers(state); + res = set_timers(state); - return 0; + return res; } static int do_reassign_follower(struct spa_loop *loop, @@ -913,7 +922,10 @@ void *user_data) { struct seq_state *state = user_data; - set_timers(state); + int res; + + if ((res = set_timers(state)) < 0) + spa_log_error(state->log, "can't set timers: %s", spa_strerror(res)); return 0; }
View file
pipewire-1.0.0.tar.gz/spa/plugins/alsa/alsa-seq.h -> pipewire-1.0.1.tar.bz2/spa/plugins/alsa/alsa-seq.h
Changed
@@ -142,6 +142,8 @@ uint64_t next_time; uint64_t base_time; uint64_t queue_time; + uint64_t queue_next; + double queue_corr; unsigned int opened:1; unsigned int started:1;
View file
pipewire-1.0.0.tar.gz/spa/plugins/audioconvert/audioadapter.c -> pipewire-1.0.1.tar.bz2/spa/plugins/audioconvert/audioadapter.c
Changed
@@ -89,13 +89,14 @@ unsigned int add_listener:1; unsigned int have_format:1; unsigned int started:1; - unsigned int warned:1; unsigned int ready:1; - unsigned int driver:1; unsigned int async:1; unsigned int passthrough:1; unsigned int follower_removing:1; unsigned int in_recalc; + + unsigned int warned:1; + unsigned int driver:1; }; /** \endcond */ @@ -926,15 +927,9 @@ this->warned = false; break; case SPA_NODE_COMMAND_Suspend: - this->started = false; - this->ready = false; - this->warned = false; spa_log_debug(this->log, "%p: suspending", this); break; case SPA_NODE_COMMAND_Pause: - this->started = false; - this->ready = false; - this->warned = false; spa_log_debug(this->log, "%p: pausing", this); break; case SPA_NODE_COMMAND_Flush: @@ -971,9 +966,15 @@ break; case SPA_NODE_COMMAND_Suspend: configure_format(this, 0, NULL); + this->started = false; + this->warned = false; + this->ready = false; spa_log_debug(this->log, "%p: suspended", this); break; case SPA_NODE_COMMAND_Pause: + this->started = false; + this->warned = false; + this->ready = false; spa_log_debug(this->log, "%p: paused", this); break; case SPA_NODE_COMMAND_Flush: @@ -1571,7 +1572,7 @@ struct impl *this = object; int status = 0, fstatus, retry = 8; - if (!this->started) { + if (!this->ready) { if (!this->warned) spa_log_warn(this->log, "%p: scheduling stopped node", this); this->warned = true;
View file
pipewire-1.0.0.tar.gz/spa/plugins/bluez5/bluez-hardware.conf -> pipewire-1.0.1.tar.bz2/spa/plugins/bluez5/bluez-hardware.conf
Changed
@@ -39,6 +39,7 @@ { name = "JBL LIVE650BTNC" }, { name = "Motorola DC800", no-features = sbc-xq }, # #pipewire-1590 { name = "Motorola S305", no-features = sbc-xq }, # #pipewire-1590 + { name = "PMK True Wireless Earbuds" no-features = sbc-xq }, # Primark earbud { name = "Soundcore Life P2-L", no-features = msbc-alt1, msbc-alt1-rtl }, { name = "Soundcore Motion B", no-features = hw-volume }, { name = "SoundCore mini", no-features = hw-volume }, # #pipewire-1686
View file
pipewire-1.0.0.tar.gz/spa/plugins/support/node-driver.c -> pipewire-1.0.1.tar.bz2/spa/plugins/support/node-driver.c
Changed
@@ -30,6 +30,7 @@ #define NAME "driver" #define DEFAULT_FREEWHEEL false +#define DEFAULT_FREEWHEEL_WAIT 10 #define DEFAULT_CLOCK_PREFIX "clock.system" #define DEFAULT_CLOCK_ID CLOCK_MONOTONIC @@ -44,6 +45,7 @@ bool freewheel; char clock_name64; clockid_t clock_id; + uint32_t freewheel_wait; }; struct impl { @@ -86,6 +88,7 @@ props->freewheel = DEFAULT_FREEWHEEL; spa_zero(props->clock_name); props->clock_id = CLOCK_MONOTONIC; + props->freewheel_wait = DEFAULT_FREEWHEEL_WAIT; } static const struct clock_info { @@ -262,7 +265,10 @@ duration = 1024; rate = 48000; } - nsec = this->next_time; + if (this->props.freewheel) + nsec = gettime_nsec(this, this->props.clock_id); + else + nsec = this->next_time; if (this->tracking) /* we are actually following another clock */ @@ -293,7 +299,10 @@ this->last_time = current_time; - if (this->tracking) { + if (this->props.freewheel) { + corr = 1.0; + this->next_time = nsec + this->props.freewheel_wait * SPA_NSEC_PER_SEC; + } else if (this->tracking) { corr = spa_dll_update(&this->dll, err); this->next_time = nsec + duration / corr * 1e9 / rate; } else { @@ -610,6 +619,8 @@ } else { this->props.clock_id = FD_TO_CLOCKID(this->clock_fd); } + } else if (spa_streq(k, "freewheel.wait")) { + this->props.freewheel_wait = atoi(s); } } if (this->props.clock_name0 == '\0') {
View file
pipewire-1.0.0.tar.gz/src/daemon/minimal.conf.in -> pipewire-1.0.1.tar.bz2/src/daemon/minimal.conf.in
Changed
@@ -162,7 +162,7 @@ } } - # A default dummy driver. This handles nodes marked with the "node.always-driver" + # A default dummy driver. This handles nodes marked with the "node.always-process" # property when no other driver is currently active. JACK clients need this. { factory = spa-node-factory args = {
View file
pipewire-1.0.0.tar.gz/src/daemon/pipewire-aes67.conf.in -> pipewire-1.0.1.tar.bz2/src/daemon/pipewire-aes67.conf.in
Changed
@@ -34,7 +34,7 @@ node.name = PTP0-Driver node.group = pipewire.ptp0 # This driver should only be used for network nodes marked with group - priority.driver = 0 + priority.driver = 100000 clock.name = "clock.system.ptp0" #clock.id = tai clock.device = "/dev/ptp0"
View file
pipewire-1.0.0.tar.gz/src/daemon/pipewire.conf.in -> pipewire-1.0.1.tar.bz2/src/daemon/pipewire.conf.in
Changed
@@ -224,7 +224,7 @@ #{ factory = adapter args = { factory.name = audiotestsrc node.name = my-test node.description = audiotestsrc } } #{ factory = spa-node-factory args = { factory.name = api.vulkan.compute.source node.name = my-compute-source } } - # A default dummy driver. This handles nodes marked with the "node.always-driver" + # A default dummy driver. This handles nodes marked with the "node.always-process" # property when no other driver is currently active. JACK clients need this. { factory = spa-node-factory args = {
View file
pipewire-1.0.0.tar.gz/src/examples/meson.build -> pipewire-1.0.1.tar.bz2/src/examples/meson.build
Changed
@@ -22,6 +22,10 @@ 'local-v4l2', +if not get_option('examples').allowed() + subdir_done() +endif + examples_extra_deps = { 'video-src-fixate': drm_dep, 'video-play': sdl_dep,
View file
pipewire-1.0.0.tar.gz/src/gst/gstpipewiredeviceprovider.c -> pipewire-1.0.1.tar.bz2/src/gst/gstpipewiredeviceprovider.c
Changed
@@ -180,9 +180,11 @@ struct pw_node_info *info; GstCaps *caps; GstDevice *dev; + struct spa_list ports; }; struct port_data { + struct spa_list link; struct node_data *node_data; struct pw_port *proxy; struct spa_hook proxy_listener; @@ -353,6 +355,9 @@ pw_log_debug("%p", port_data); + if (node_data == NULL) + return; + if (info->change_mask & PW_PORT_CHANGE_MASK_PARAMS) { for (i = 0; i < info->n_params; i++) { uint32_t id = info->paramsi.id; @@ -375,6 +380,9 @@ struct node_data *node_data = port_data->node_data; GstCaps *c1; + if (node_data == NULL) + return; + c1 = gst_caps_from_format (param); if (c1 && node_data->caps) gst_caps_append (node_data->caps, c1); @@ -438,11 +446,17 @@ destroy_node (void *data) { struct node_data *nd = data; + struct port_data *pd; GstPipeWireDeviceProvider *self = nd->self; GstDeviceProvider *provider = GST_DEVICE_PROVIDER (self); pw_log_debug("destroy %p", nd); + spa_list_consume(pd, &nd->ports, link) { + spa_list_remove(&pd->link); + pd->node_data = NULL; + } + if (nd->dev != NULL) { gst_device_provider_device_remove (provider, GST_DEVICE (nd->dev)); } @@ -472,6 +486,7 @@ { struct port_data *pd = data; pw_log_debug("destroy %p", pd); + spa_list_remove(&pd->link); } static const struct pw_proxy_events proxy_port_events = { @@ -515,6 +530,7 @@ nd->id = id; if (!props || !spa_atou64(spa_dict_lookup(props, PW_KEY_OBJECT_SERIAL), &nd->serial, 0)) nd->serial = SPA_ID_INVALID; + spa_list_init(&nd->ports); spa_list_append(&self->nodes, &nd->link); pw_node_add_listener(node, &nd->node_listener, &node_events, nd); pw_proxy_add_listener((struct pw_proxy*)node, &nd->proxy_listener, &proxy_node_events, nd); @@ -541,6 +557,7 @@ pd->id = id; if (!props || !spa_atou64(spa_dict_lookup(props, PW_KEY_OBJECT_SERIAL), &pd->serial, 0)) pd->serial = SPA_ID_INVALID; + spa_list_append(&nd->ports, &pd->link); pw_port_add_listener(port, &pd->port_listener, &port_events, pd); pw_proxy_add_listener((struct pw_proxy*)port, &pd->proxy_listener, &proxy_port_events, pd); resync(self); @@ -581,7 +598,6 @@ pw_thread_loop_lock (self->core->loop); spa_list_init(&self->nodes); - spa_list_init(&self->pending); self->end = FALSE; self->error = 0; self->list_only = TRUE; @@ -631,7 +647,6 @@ pw_thread_loop_lock (self->core->loop); spa_list_init(&self->nodes); - spa_list_init(&self->pending); self->end = FALSE; self->error = 0; self->list_only = FALSE;
View file
pipewire-1.0.0.tar.gz/src/gst/gstpipewiredeviceprovider.h -> pipewire-1.0.1.tar.bz2/src/gst/gstpipewiredeviceprovider.h
Changed
@@ -70,7 +70,6 @@ struct pw_registry *registry; struct spa_hook registry_listener; struct spa_list nodes; - struct spa_list pending; int seq; int error;
View file
pipewire-1.0.0.tar.gz/src/gst/gstpipewiresink.c -> pipewire-1.0.1.tar.bz2/src/gst/gstpipewiresink.c
Changed
@@ -466,7 +466,10 @@ if (data->header) { data->header->seq = GST_BUFFER_OFFSET (buffer); data->header->pts = GST_BUFFER_PTS (buffer); - data->header->dts_offset = GST_BUFFER_DTS (buffer); + if (GST_BUFFER_DTS(buffer) != GST_CLOCK_TIME_NONE) + data->header->dts_offset = GST_BUFFER_DTS (buffer) - GST_BUFFER_PTS (buffer); + else + data->header->dts_offset = 0; } if (data->crop) { GstVideoCropMeta *meta = gst_buffer_get_video_crop_meta (buffer);
View file
pipewire-1.0.0.tar.gz/src/gst/gstpipewiresrc.c -> pipewire-1.0.1.tar.bz2/src/gst/gstpipewiresrc.c
Changed
@@ -768,7 +768,7 @@ static enum pw_stream_state wait_started (GstPipeWireSrc *this) { - enum pw_stream_state state; + enum pw_stream_state state, prev_state = PW_STREAM_STATE_UNCONNECTED; const char *error = NULL; struct timespec abstime; @@ -783,10 +783,9 @@ GST_DEBUG_OBJECT (this, "waiting for started signal, state now %s", pw_stream_state_as_string (state)); - if (state == PW_STREAM_STATE_ERROR) - break; - - if (this->flushing) { + if (state == PW_STREAM_STATE_ERROR || + (state == PW_STREAM_STATE_UNCONNECTED && prev_state > PW_STREAM_STATE_UNCONNECTED) || + this->flushing) { state = PW_STREAM_STATE_ERROR; break; } @@ -798,6 +797,8 @@ state = PW_STREAM_STATE_ERROR; break; } + + prev_state = state; } GST_DEBUG_OBJECT (this, "got started signal: %s", pw_stream_state_as_string (state));
View file
pipewire-1.0.0.tar.gz/src/meson.build -> pipewire-1.0.1.tar.bz2/src/meson.build
Changed
@@ -3,9 +3,7 @@ subdir('daemon') subdir('tools') subdir('modules') -if get_option('examples').allowed() - subdir('examples') -endif +subdir('examples') if get_option('tests').allowed() subdir('tests') endif
View file
pipewire-1.0.0.tar.gz/src/modules/module-access.c -> pipewire-1.0.1.tar.bz2/src/modules/module-access.c
Changed
@@ -50,6 +50,7 @@ * - If `access.legacy` is enabled, the value is: * * - `"flatpak"`: if client is a Flatpak client + * - `"unrestricted"`: if \ref PW_KEY_CLIENT_ACCESS client property is set to `"allowed"` * - Value of \ref PW_KEY_CLIENT_ACCESS client property, if set * - `"unrestricted"`: otherwise * @@ -199,12 +200,16 @@ else access = ACCESS_DEFAULT; } else { - if (sandbox_flatpak) + if (sandbox_flatpak) { access = ACCESS_FLATPAK; - else if ((str = pw_properties_get(props, PW_KEY_CLIENT_ACCESS)) != NULL) - access = str; - else + } else if ((str = pw_properties_get(props, PW_KEY_CLIENT_ACCESS)) != NULL) { + if (spa_streq(str, "allowed")) + access = ACCESS_UNRESTRICTED; + else + access = str; + } else { access = ACCESS_UNRESTRICTED; + } } /* Handle resolution */
View file
pipewire-1.0.0.tar.gz/src/modules/module-client-node/protocol-native.c -> pipewire-1.0.1.tar.bz2/src/modules/module-client-node/protocol-native.c
Changed
@@ -412,6 +412,9 @@ SPA_POD_PodObject(&event)) < 0) return -EINVAL; + if (event == NULL) + return -EINVAL; + pw_proxy_notify(proxy, struct pw_client_node_events, event, 0, event); return 0; } @@ -427,6 +430,9 @@ SPA_POD_PodObject(&command)) < 0) return -EINVAL; + if (command == NULL) + return -EINVAL; + pw_proxy_notify(proxy, struct pw_client_node_events, command, 0, command); return 0; } @@ -1097,6 +1103,9 @@ SPA_POD_PodObject(&event)) < 0) return -EINVAL; + if (event == NULL) + return -EINVAL; + pw_resource_notify(resource, struct pw_client_node_methods, event, 0, event); return 0; }
View file
pipewire-1.0.0.tar.gz/src/modules/module-filter-chain/builtin_plugin.c -> pipewire-1.0.1.tar.bz2/src/modules/module-filter-chain/builtin_plugin.c
Changed
@@ -856,7 +856,7 @@ { struct convolver_impl *impl; float *samples; - int offset = 0, length = 0, channel = index, n_samples, len; + int offset = 0, length = 0, channel = index, n_samples = 0, len; uint32_t i = 0; struct spa_json it3; const char *val; @@ -979,15 +979,16 @@ samples = resample_buffer(samples, &n_samples, rate, SampleRate, resample_quality); } - if (samples == NULL) { - errno = ENOENT; - return NULL; - } for (i = 0; i < MAX_RATES; i++) if (filenamesi) free(filenamesi); + if (samples == NULL) { + errno = ENOENT; + return NULL; + } + if (blocksize <= 0) blocksize = SPA_CLAMP(n_samples, 64, 256); if (tailsize <= 0)
View file
pipewire-1.0.0.tar.gz/src/modules/module-loopback.c -> pipewire-1.0.1.tar.bz2/src/modules/module-loopback.c
Changed
@@ -592,6 +592,7 @@ pw_properties_free(impl->capture_props); pw_properties_free(impl->playback_props); + free(impl->buffer_data); free(impl); }
View file
pipewire-1.0.0.tar.gz/src/modules/module-pipe-tunnel.c -> pipewire-1.0.1.tar.bz2/src/modules/module-pipe-tunnel.c
Changed
@@ -187,7 +187,6 @@ unsigned int do_disconnect:1; unsigned int driving:1; - unsigned int have_sync:1; unsigned int may_pause:1; unsigned int paused:1; @@ -203,6 +202,7 @@ float corr; uint64_t next_time; + unsigned int have_sync:1; }; static uint64_t get_time_ns(struct impl *impl)
View file
pipewire-1.0.0.tar.gz/src/modules/module-protocol-native/protocol-native.c -> pipewire-1.0.1.tar.bz2/src/modules/module-protocol-native/protocol-native.c
Changed
@@ -1342,6 +1342,9 @@ SPA_POD_Pod(&command)) < 0) return -EINVAL; + if (command == NULL) + return -EINVAL; + return pw_resource_notify(resource, struct pw_node_methods, send_command, 0, command); }
View file
pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/collect.c -> pipewire-1.0.1.tar.bz2/src/modules/module-protocol-pulse/collect.c
Changed
@@ -234,7 +234,7 @@ { struct pw_manager_param *p; - if (card && !monitor) { + if (card) { spa_list_for_each(p, &card->param_list, link) { uint32_t index, dev; struct spa_pod *props; @@ -251,7 +251,7 @@ if (dev != dev_info->device) continue; dev_info->active_port = index; - if (props) { + if (props && !monitor) { volume_parse_param(props, &dev_info->volume_info, monitor); dev_info->have_volume = true; }
View file
pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/manager.c -> pipewire-1.0.1.tar.bz2/src/modules/module-protocol-pulse/manager.c
Changed
@@ -290,6 +290,7 @@ { struct object *o = data; uint32_t i, changed = 0; + bool enumerate = false; pw_log_debug("object %p: id:%d change-mask:%08"PRIx64, o, o->this.id, info->change_mask); @@ -321,6 +322,9 @@ default: break; } + + enumerate = true; + add_param(&o->pending_list, info->paramsi.seq, id, NULL); if (!(info->paramsi.flags & SPA_PARAM_INFO_READ)) continue; @@ -331,7 +335,7 @@ info->paramsi.seq = res; } } - if (changed) { + if (changed || enumerate) { o->changed += changed; core_sync(o->manager); } @@ -410,6 +414,7 @@ { struct object *o = data; uint32_t i, changed = 0; + bool enumerate = false; pw_log_debug("object %p: id:%d change-mask:%08"PRIx64, o, o->this.id, info->change_mask); @@ -449,6 +454,9 @@ default: break; } + + enumerate = true; + add_param(&o->pending_list, info->paramsi.seq, id, NULL); if (!(info->paramsi.flags & SPA_PARAM_INFO_READ)) continue; @@ -459,7 +467,7 @@ info->paramsi.seq = res; } } - if (changed) { + if (changed || enumerate) { o->changed += changed; core_sync(o->manager); }
View file
pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-zeroconf-publish.c -> pipewire-1.0.1.tar.bz2/src/modules/module-protocol-pulse/modules/module-zeroconf-publish.c
Changed
@@ -578,6 +578,8 @@ { struct service *s; struct pw_node_info *info; + struct module_zeroconf_publish_data *data = d; + struct impl *impl = data->module->impl; if (!pw_manager_object_is_sink(o) && !pw_manager_object_is_source(o)) return; @@ -589,7 +591,9 @@ if (pw_manager_object_is_network(o)) return; - s = create_service(d, o); + update_object_info(data->manager, o, &impl->defs); + + s = create_service(data, o); if (s == NULL) return;
View file
pipewire-1.0.0.tar.gz/src/modules/module-raop-sink.c -> pipewire-1.0.1.tar.bz2/src/modules/module-raop-sink.c
Changed
@@ -153,6 +153,7 @@ #define RAOP_STRIDE (2*DEFAULT_CHANNELS) #define RAOP_RATE 44100 #define RAOP_LATENCY_MS 250 +#define DEFAULT_LATENCY_MS 1500 #define VOLUME_MAX 0.0 #define VOLUME_MIN -30.0 @@ -166,6 +167,7 @@ "( raop.encryption.type=<encryption, default:none> ) " \ "( raop.audio.codec=PCM ) " \ "( raop.password=<password for auth> ) " \ + "( raop.latency.ms=<min latency in ms, default:"SPA_STRINGIFY(DEFAULT_LATENCY_MS)"> ) " \ "( node.latency=<latency as fraction> ) " \ "( node.name=<name of the nodes> ) " \ "( node.description=<description of the nodes> ) " \ @@ -1849,6 +1851,10 @@ impl->mtu = impl->stride * impl->psamples; impl->sync_period = impl->rate / impl->psamples; + if ((str = pw_properties_get(props, "raop.latency.ms")) == NULL) + str = SPA_STRINGIFY(DEFAULT_LATENCY_MS); + impl->latency = SPA_MAX(impl->latency, msec_to_samples(impl, atoi(str))); + if (pw_properties_get(props, PW_KEY_AUDIO_FORMAT) == NULL) pw_properties_setf(props, PW_KEY_AUDIO_FORMAT, "%s", RAOP_FORMAT); if (pw_properties_get(props, PW_KEY_AUDIO_RATE) == NULL)
View file
pipewire-1.0.0.tar.gz/src/modules/module-rt/25-pw-rlimits.conf.in -> pipewire-1.0.1.tar.bz2/src/modules/module-rt/25-pw-rlimits.conf.in
Changed
@@ -1,7 +1,13 @@ # This file was installed by PipeWire project for its libpipewire-module-rt.so -# It's believed to be acceptable to have match rules that will never be true -# i.e. a group that does not exist. +# It is up to the distribution/user to create the @MATCH@ group and to add the +# relevant users to the group. +# +# PipeWire will fall back to the RTKit DBus service when the user is not able to +# acquire RT priorities with rlimits. +# +# If the group is not automatically created, the match rule will never be true +# and this file will have no effect. # @MATCH@ - rtprio @RTPRIO@ @MATCH@ - nice @NICE@
View file
pipewire-1.0.0.tar.gz/src/modules/module-x11-bell.c -> pipewire-1.0.1.tar.bz2/src/modules/module-x11-bell.c
Changed
@@ -104,6 +104,11 @@ res = -EIO; goto exit; } + if ((res = ca_context_set_driver(ca, "pulse")) < 0) { + pw_log_error("canberra context set backend error: %s", ca_strerror(res)); + res = -EIO; + goto exit_destroy; + } if ((res = ca_context_open(ca)) < 0) { pw_log_error("canberra context open error: %s", ca_strerror(res)); res = -EIO;
View file
pipewire-1.0.0.tar.gz/src/pipewire/data-loop.c -> pipewire-1.0.1.tar.bz2/src/pipewire/data-loop.c
Changed
@@ -188,7 +188,12 @@ if ((utils = loop->thread_utils) == NULL) utils = pw_thread_utils_get(); - thr = spa_thread_utils_create(utils, NULL, do_loop, loop); + + static const struct spa_dict_item items = { + { SPA_KEY_THREAD_NAME, "pw-data-loop" }, + }; + + thr = spa_thread_utils_create(utils, &SPA_DICT_INIT_ARRAY(items), do_loop, loop); loop->thread = (pthread_t)thr; if (thr == NULL) { pw_log_error("%p: can't create thread: %m", loop);
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.