Since we map the ringbuffer to the pulseaudio internal ringbuffer, flush the
pulseaudio buffer when we are asked to clear the ringbuffer.
This avoids some leftover audio after a seek.
Hack around thread-safety issues in GObject and our racy _get_type()
functions (we could easily fix the _get_type() functions, but we still
need to hack around the GObject class races until we require a newer
GLib version, I think).
First we ignore request to fill the ringbuffer which are less then a segment.
The small request where causing stutter.
Then we disable flushing the stream when running against pa 0.9.12 as this
triggers an assertiong in the sound server and terminates it. It does not happen
with 0.9.10 and 0.9.14.
We can use prebuf = 0 to instruct pulse to not pause the stream on underflows.
This way we can remove the underflow callback. We however have to manually
uncork the stream now when we have no available space in the buffer or when we
are writing too far away from the current read_index.
when we switch streams, the clock will reset to 0. Make sure that the provided
clock doesn't get stuck when this happens by keeping an initial offset. We also
need to make sure that we subtract this offset in samples when writing to the
ringbuffer.
If the caps changes, the sink is reset without transitioning through
a PAUSED->PLAYING state change, resulting in a corked stream. This avoids
the problem by checking that the stream is uncorked when writing samples
to it.
When trying to write out a segment, wait until there is enough free space
for the entire segment. This helps to reduce ripple in the clock reporting,
where the app might query the playback position while only half a segment
has been written (and is therefore reported by _delay(), even though
the ring buffer has not yet been advanced)
rather than PA thread.
pa_threaded_mainloop_lock() (a.o.) and by extension get_property should
not be done from a PA thread, but the latter may occur as a result of a
property change notification. Fixes#571204 (though current situation
not ideal, e.g. post message rather than signal).
newer pulseaudio.
Fixes: #567794
* Hook pulsesink's volume property up with the stream volume -- not the
sink volume in PA.
* Read the device description directly from the sink instead of going
via the mixer.
* Properly implement _reset() methods for both sink and source to avoid
deadlocks when shutting down a pipeline.
* Replace all simple pa_threaded_mainloop_wait() by proper loops to
guarantee that we wait for the right event in case multiple events are
fired. While this is not strictly necessary in many cases it
certainly is more correct and makes me sleep better at night.
* Replace CHECK_DEAD_GOTO macros with proper functions
* Extend the number of supported channels to 32 since that is the actual
limit in PA.
* Get rid of _dispose() methods since we don't need them.
* Increase the volume property upper limit of the sink to 1000.
* Reset function pointers after we disconnect a stream/context. Better
fix for bug 556986.
* Reset the state of the element properly if open/prepare fails
* Cork the PA stream when the pipeline is paused. This allows the PA
* daemon to
close audio device on pause and thus save a bit of power.
* Set PA stream properties based on GST tags such as GST_TAG_TITLE,
GST_TAG_ARTIST, and so on.
Signed-off-by: Lennart Poettering <lennart@poettering.net>
Link to properties. Correct titles for examples. Document a few trivial cases. Keep lists in section file and docs/plugins/Makefile.am alphabetically ordered. Fix warnings that gtk-doc points out.
Original commit message from CVS:
* ext/pulse/pulsesink.c:
* ext/pulse/pulsesink.h:
Use a mutex to protect the current stream pointer, and ignore
callbacks for stream objects that have been destroyed already.
Fixes problems with unprepare/prepare cycles caused by the input
caps changing, without reintroducing bug #556986.
Original commit message from CVS:
* ext/pulse/pulsesink.c: (gst_pulsesink_destroy_stream):
Don't wait for the pulse mainloop when destroying the stream.
Fixes a deadlock when the pulsedaemon goes away while pulsesink
is PLAYING. Fixes bug #556986.
Original commit message from CVS:
* ext/pulse/pulsesink.c: (gst_pulsesink_write):
* ext/pulse/pulsesrc.c: (gst_pulsesrc_read):
Return -1 instead of 0 in error cases. Fixes#554771.
Original commit message from CVS:
* ext/pulse/pulsesink.c:
Fix problems with pulsesink randomly erroring with code 'OK' after a
format change on the stream by waiting when disconnecting the stream.
Original commit message from CVS:
* ext/pulse/pulsesink.c: (gst_pulsesink_prepare):
* ext/pulse/pulsesrc.c: (gst_pulsesrc_prepare):
The bytes_per_sample and silence_sample fields of the GstRingBufferSpec
are already filled with the correct values by
gst_ring_buffer_parse_caps() so there's no need to set them again
with wrong values.
Original commit message from CVS:
* ext/pulse/pulsesink.c: (gst_pulsesink_class_init),
(gst_pulsesink_init), (gst_pulsesink_finalize),
(gst_pulsesink_set_volume), (gst_pulsesink_get_volume),
(gst_pulsesink_set_property), (gst_pulsesink_get_property),
(gst_pulsesink_prepare), (gst_pulsesink_change_state):
* ext/pulse/pulsesink.h:
Add "device-name" property to pulsesink too and currently commented
out and not working support for a "volume" property.
Original commit message from CVS:
* ext/pulse/pulsemixer.c: (gst_pulsemixer_change_state):
* ext/pulse/pulsemixerctrl.c: (gst_pulsemixer_ctrl_subscribe_cb),
(gst_pulsemixer_ctrl_open), (gst_pulsemixer_ctrl_new),
(gst_pulsemixer_ctrl_free), (gst_pulsemixer_ctrl_timeout_event):
* ext/pulse/pulsemixerctrl.h:
* ext/pulse/pulseprobe.c: (gst_pulseprobe_open),
(gst_pulseprobe_enumerate), (gst_pulseprobe_new),
(gst_pulseprobe_free), (gst_pulseprobe_needs_probe),
(gst_pulseprobe_probe_property), (gst_pulseprobe_get_values):
* ext/pulse/pulseprobe.h:
* ext/pulse/pulsesink.c: (gst_pulsesink_init):
* ext/pulse/pulsesrc.c: (gst_pulsesrc_init), (gst_pulsesrc_delay),
(gst_pulsesrc_change_state):
Improve debugging a bit by including the parent object in pulsemixerctrl
and pulseprobe objects and using GST_WARNING_OBJECT instead of
GST_WARNING.
Use the parent GObject subclass instead of a random struct as GObject
parameter for G_OBJECT_WARN_INVALID_PROPERTY_ID. This fixes a crash
when probing for another property than "device".
Original commit message from CVS:
* ext/pulse/pulsemixer.c: (gst_pulsemixer_base_init),
(gst_pulsemixer_class_init):
* ext/pulse/pulsesink.c: (gst_pulsesink_base_init),
(gst_pulsesink_class_init), (gst_pulsesink_prepare):
* ext/pulse/pulsesrc.c: (gst_pulsesrc_interface_supported),
(gst_pulsesrc_base_init), (gst_pulsesrc_class_init),
(gst_pulsesrc_prepare):
Some smaller cleanup. Use G_PARAM_STATIC_STRINGS,
gst_element_class_set_details_simple() and fix coding style a bit
more.