mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
Compare commits
6 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e5ad31e873 | ||
|
|
e4d54dae91 | ||
|
|
0e896eb518 | ||
|
|
ca8c5242eb | ||
|
|
437cfe4630 | ||
|
|
8299a7f100 |
6 changed files with 47 additions and 17 deletions
19
NEWS
19
NEWS
|
|
@ -1,3 +1,22 @@
|
|||
PulseAudio 16.1
|
||||
|
||||
A bug fix release.
|
||||
|
||||
* Fix parsing of percentage volumes with decimal points in pactl
|
||||
* Fix crash with the "pacmd play-file" command when reads from the disk aren't frame-aligned
|
||||
* Fix module-rtp-recv sometimes thinking it's receiving an Opus stream when it's not
|
||||
* Fix frequent crashing in module-combine-sink, regression in 16.0
|
||||
* Fix crashing on 32-bit architectures when using the GStreamer codecs for LDAC and AptX
|
||||
|
||||
Contributors
|
||||
|
||||
Georg Chini
|
||||
Igor V. Kovalenko
|
||||
Jaechul Lee
|
||||
Jan Palus
|
||||
Sean Greenslade
|
||||
|
||||
|
||||
PulseAudio 16.0
|
||||
|
||||
Changes at a glance:
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@
|
|||
#endif
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <pulsecore/log.h>
|
||||
#include <pulsecore/macro.h>
|
||||
|
|
@ -82,7 +83,7 @@ fail:
|
|||
static GstCaps *gst_create_caps_from_sample_spec(const pa_sample_spec *ss) {
|
||||
gchar *sample_format;
|
||||
GstCaps *caps;
|
||||
int channel_mask;
|
||||
uint64_t channel_mask;
|
||||
|
||||
switch (ss->format) {
|
||||
case PA_SAMPLE_S16LE:
|
||||
|
|
|
|||
|
|
@ -129,6 +129,7 @@ pa_sdp_info *pa_sdp_parse(const char *t, pa_sdp_info *i, int is_goodbye) {
|
|||
i->origin = i->session_name = NULL;
|
||||
i->salen = 0;
|
||||
i->payload = 255;
|
||||
i->enable_opus = false;
|
||||
|
||||
if (!pa_startswith(t, PA_SDP_HEADER)) {
|
||||
pa_log("Failed to parse SDP data: invalid header.");
|
||||
|
|
|
|||
|
|
@ -1016,20 +1016,29 @@ size_t pa_sink_process_input_underruns(pa_sink *s, size_t left_to_play) {
|
|||
if (i->origin_sink) {
|
||||
size_t filter_result, left_to_play_origin;
|
||||
|
||||
/* The recursive call works in the origin sink domain ... */
|
||||
left_to_play_origin = pa_convert_size(left_to_play, &i->sink->sample_spec, &i->origin_sink->sample_spec);
|
||||
/* The combine sink sets i->origin sink but has a different threading model
|
||||
* than the filter sinks. Therefore the recursion below may not be executed
|
||||
* because pa_sink_process_input_underruns() was not called in the thread
|
||||
* context of the origin sink.
|
||||
* FIXME: It is unclear if some other kind of recursion would be necessary
|
||||
* for the combine sink. */
|
||||
if (!i->module || !pa_safe_streq(i->module->name, "module-combine-sink")) {
|
||||
|
||||
/* .. and returns the time to sleep before waking up. We need the
|
||||
* underrun duration for comparisons, so we undo the subtraction on
|
||||
* the return value... */
|
||||
filter_result = left_to_play_origin - pa_sink_process_input_underruns(i->origin_sink, left_to_play_origin);
|
||||
/* The recursive call works in the origin sink domain ... */
|
||||
left_to_play_origin = pa_convert_size(left_to_play, &i->sink->sample_spec, &i->origin_sink->sample_spec);
|
||||
|
||||
/* ... and convert it back to the master sink domain */
|
||||
filter_result = pa_convert_size(filter_result, &i->origin_sink->sample_spec, &i->sink->sample_spec);
|
||||
/* .. and returns the time to sleep before waking up. We need the
|
||||
* underrun duration for comparisons, so we undo the subtraction on
|
||||
* the return value... */
|
||||
filter_result = left_to_play_origin - pa_sink_process_input_underruns(i->origin_sink, left_to_play_origin);
|
||||
|
||||
/* Remember the longest underrun so far */
|
||||
if (filter_result > result)
|
||||
result = filter_result;
|
||||
/* ... and convert it back to the master sink domain */
|
||||
filter_result = pa_convert_size(filter_result, &i->origin_sink->sample_spec, &i->sink->sample_spec);
|
||||
|
||||
/* Remember the longest underrun so far */
|
||||
if (filter_result > result)
|
||||
result = filter_result;
|
||||
}
|
||||
}
|
||||
|
||||
if (uf == 0) {
|
||||
|
|
|
|||
|
|
@ -185,7 +185,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t length, pa_memchunk *chunk
|
|||
|
||||
tchunk.length = (size_t) n * fs;
|
||||
|
||||
pa_memblockq_push(u->memblockq, &tchunk);
|
||||
pa_memblockq_push_align(u->memblockq, &tchunk);
|
||||
pa_memblock_unref(tchunk.memblock);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2527,16 +2527,16 @@ static int parse_volume(const char *vol_spec, pa_volume_t *vol, enum volume_flag
|
|||
vs = pa_xstrdup(vol_spec);
|
||||
|
||||
*vol_flags = (pa_startswith(vs, "+") || pa_startswith(vs, "-")) ? VOL_RELATIVE : VOL_ABSOLUTE;
|
||||
if (strchr(vs, '.'))
|
||||
*vol_flags |= VOL_LINEAR;
|
||||
if (pa_endswith(vs, "%")) {
|
||||
*vol_flags |= VOL_PERCENT;
|
||||
vs[strlen(vs)-1] = 0;
|
||||
}
|
||||
if (pa_endswith(vs, "db") || pa_endswith(vs, "dB")) {
|
||||
else if (pa_endswith(vs, "db") || pa_endswith(vs, "dB")) {
|
||||
*vol_flags |= VOL_DECIBEL;
|
||||
vs[strlen(vs)-2] = 0;
|
||||
}
|
||||
else if (strchr(vs, '.'))
|
||||
*vol_flags |= VOL_LINEAR;
|
||||
|
||||
atod_input = vs;
|
||||
|
||||
|
|
@ -2597,7 +2597,7 @@ static int parse_volumes(char *args[], unsigned n) {
|
|||
|
||||
volume.channels = n;
|
||||
for (i = 0; i < volume.channels; i++) {
|
||||
enum volume_flags flags;
|
||||
enum volume_flags flags = 0;
|
||||
|
||||
if (parse_volume(args[i], &volume.values[i], &flags) < 0)
|
||||
return -1;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue