diff --git a/116b38c972942ccbbb8dae5dc0181da98096a0ce.patch b/116b38c972942ccbbb8dae5dc0181da98096a0ce.patch new file mode 100644 index 0000000..a47add9 --- /dev/null +++ b/116b38c972942ccbbb8dae5dc0181da98096a0ce.patch @@ -0,0 +1,272 @@ +diff --git a/src/Makefile.am b/src/Makefile.am +index 1fc8735..f5a1feb 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -1315,7 +1315,7 @@ endif + + if HAVE_DBUS + libalsa_util_la_SOURCES += modules/reserve.h modules/reserve.c modules/reserve-wrap.c modules/reserve-wrap.h +-libalsa_util_la_LIBADD += $(DBUS_LIBS) ++libalsa_util_la_LIBADD += $(DBUS_LIBS) libdbus-util.la + libalsa_util_la_CFLAGS += $(DBUS_CFLAGS) + endif + +@@ -1532,7 +1532,7 @@ libbluetooth_util_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) + + module_bluetooth_device_la_SOURCES = modules/bluetooth/module-bluetooth-device.c modules/bluetooth/rtp.h + module_bluetooth_device_la_LDFLAGS = $(MODULE_LDFLAGS) +-module_bluetooth_device_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la libdbus-util.la libbluetooth-ipc.la libbluetooth-sbc.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la ++module_bluetooth_device_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) libpulsecore-@PA_MAJORMINORMICRO@.la libdbus-util.la libbluetooth-util.la libbluetooth-ipc.la libbluetooth-sbc.la libpulsecommon-@PA_MAJORMINORMICRO@.la libpulse.la + module_bluetooth_device_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) + + # Apple Airtunes/RAOP +diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c +index dbd95b6..0aef1bd 100644 +--- a/src/modules/alsa/alsa-sink.c ++++ b/src/modules/alsa/alsa-sink.c +@@ -61,10 +61,11 @@ + /* #define DEBUG_TIMING */ + + #define DEFAULT_DEVICE "default" +-#define DEFAULT_TSCHED_BUFFER_USEC (2*PA_USEC_PER_SEC) /* 2s */ +-#define DEFAULT_TSCHED_WATERMARK_USEC (20*PA_USEC_PER_MSEC) /* 20ms */ +-#define TSCHED_MIN_SLEEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */ +-#define TSCHED_MIN_WAKEUP_USEC (4*PA_USEC_PER_MSEC) /* 4ms */ ++#define DEFAULT_TSCHED_BUFFER_USEC (2*PA_USEC_PER_SEC) /* 2s -- Overall buffer size */ ++#define DEFAULT_TSCHED_WATERMARK_USEC (20*PA_USEC_PER_MSEC) /* 20ms -- Fill up when only this much is left in the buffer */ ++#define TSCHED_WATERMARK_STEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms -- On underrun, increase watermark by this */ ++#define TSCHED_MIN_SLEEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms -- Sleep at least 10ms on each iteration */ ++#define TSCHED_MIN_WAKEUP_USEC (4*PA_USEC_PER_MSEC) /* 4ms -- Wakeup at least this long before the buffer runs empty*/ + + struct userdata { + pa_core *core; +@@ -86,7 +87,16 @@ struct userdata { + pa_bool_t mixer_seperate_channels:1; + pa_cvolume hardware_volume; + +- size_t frame_size, fragment_size, hwbuf_size, tsched_watermark, hwbuf_unused, min_sleep, min_wakeup; ++ size_t ++ frame_size, ++ fragment_size, ++ hwbuf_size, ++ tsched_watermark, ++ hwbuf_unused, ++ min_sleep, ++ min_wakeup, ++ watermark_step; ++ + unsigned nfragments; + pa_memchunk memchunk; + +@@ -205,10 +215,11 @@ static void adjust_after_underrun(struct userdata *u) { + pa_usec_t old_min_latency, new_min_latency; + + pa_assert(u); ++ pa_assert(u->use_tsched); + + /* First, just try to increase the watermark */ + old_watermark = u->tsched_watermark; +- u->tsched_watermark *= 2; ++ u->tsched_watermark = PA_MIN(u->tsched_watermark * 2, u->tsched_watermark + u->watermark_step); + fix_tsched_watermark(u); + + if (old_watermark != u->tsched_watermark) { +@@ -219,7 +230,8 @@ static void adjust_after_underrun(struct userdata *u) { + + /* Hmm, we cannot increase the watermark any further, hence let's raise the latency */ + old_min_latency = u->sink->thread_info.min_latency; +- new_min_latency = PA_MIN(old_min_latency * 2, u->sink->thread_info.max_latency); ++ new_min_latency = PA_MIN(old_min_latency * 2, old_min_latency + TSCHED_WATERMARK_STEP_USEC); ++ new_min_latency = PA_MIN(new_min_latency, u->sink->thread_info.max_latency); + + if (old_min_latency != new_min_latency) { + pa_log_notice("Increasing minimal latency to %0.2f ms", +@@ -1484,7 +1496,7 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca + + struct userdata *u = NULL; + const char *dev_id = NULL; +- pa_sample_spec ss; ++ pa_sample_spec ss, requested_ss; + pa_channel_map map; + uint32_t nfrags, hwbuf_size, frag_size, tsched_size, tsched_watermark; + snd_pcm_uframes_t period_frames, tsched_frames; +@@ -1503,6 +1515,7 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca + goto fail; + } + ++ requested_ss = ss; + frame_size = pa_frame_size(&ss); + + nfrags = m->core->default_n_fragments; +@@ -1674,12 +1687,14 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca + u->fragment_size = frag_size = (uint32_t) (period_frames * frame_size); + u->nfragments = nfrags; + u->hwbuf_size = u->fragment_size * nfrags; +- u->tsched_watermark = tsched_watermark; ++ u->tsched_watermark = pa_usec_to_bytes_round_up(pa_bytes_to_usec_round_up(tsched_watermark, &requested_ss), &u->sink->sample_spec); + pa_cvolume_mute(&u->hardware_volume, u->sink->sample_spec.channels); + + if (use_tsched) { + fix_min_sleep_wakeup(u); + fix_tsched_watermark(u); ++ ++ u->watermark_step = pa_usec_to_bytes(TSCHED_WATERMARK_STEP_USEC, &u->sink->sample_spec); + } + + u->sink->thread_info.max_rewind = use_tsched ? u->hwbuf_size : 0; +diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c +index 39df4a9..671df3f 100644 +--- a/src/modules/alsa/alsa-source.c ++++ b/src/modules/alsa/alsa-source.c +@@ -64,6 +64,7 @@ + #define DEFAULT_DEVICE "default" + #define DEFAULT_TSCHED_BUFFER_USEC (2*PA_USEC_PER_SEC) /* 2s */ + #define DEFAULT_TSCHED_WATERMARK_USEC (20*PA_USEC_PER_MSEC) /* 20ms */ ++#define TSCHED_WATERMARK_STEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */ + #define TSCHED_MIN_SLEEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */ + #define TSCHED_MIN_WAKEUP_USEC (4*PA_USEC_PER_MSEC) /* 4ms */ + +@@ -88,7 +89,16 @@ struct userdata { + + pa_cvolume hardware_volume; + +- size_t frame_size, fragment_size, hwbuf_size, tsched_watermark, hwbuf_unused, min_sleep, min_wakeup; ++ size_t ++ frame_size, ++ fragment_size, ++ hwbuf_size, ++ tsched_watermark, ++ hwbuf_unused, ++ min_sleep, ++ min_wakeup, ++ watermark_step; ++ + unsigned nfragments; + + char *device_name; +@@ -202,10 +212,12 @@ static void adjust_after_overrun(struct userdata *u) { + pa_usec_t old_min_latency, new_min_latency; + + pa_assert(u); ++ pa_assert(u->use_tsched); + + /* First, just try to increase the watermark */ + old_watermark = u->tsched_watermark; +- u->tsched_watermark *= 2; ++ u->tsched_watermark = PA_MIN(u->tsched_watermark * 2, u->tsched_watermark + u->watermark_step); ++ + fix_tsched_watermark(u); + + if (old_watermark != u->tsched_watermark) { +@@ -216,7 +228,8 @@ static void adjust_after_overrun(struct userdata *u) { + + /* Hmm, we cannot increase the watermark any further, hence let's raise the latency */ + old_min_latency = u->source->thread_info.min_latency; +- new_min_latency = PA_MIN(old_min_latency * 2, u->source->thread_info.max_latency); ++ new_min_latency = PA_MIN(old_min_latency * 2, old_min_latency + TSCHED_WATERMARK_STEP_USEC); ++ new_min_latency = PA_MIN(new_min_latency, u->source->thread_info.max_latency); + + if (old_min_latency != new_min_latency) { + pa_log_notice("Increasing minimal latency to %0.2f ms", +@@ -1331,7 +1344,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p + + struct userdata *u = NULL; + const char *dev_id = NULL; +- pa_sample_spec ss; ++ pa_sample_spec ss, requested_ss; + pa_channel_map map; + uint32_t nfrags, hwbuf_size, frag_size, tsched_size, tsched_watermark; + snd_pcm_uframes_t period_frames, tsched_frames; +@@ -1349,6 +1362,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p + goto fail; + } + ++ requested_ss = ss; + frame_size = pa_frame_size(&ss); + + nfrags = m->core->default_n_fragments; +@@ -1515,12 +1529,14 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p + u->fragment_size = frag_size = (uint32_t) (period_frames * frame_size); + u->nfragments = nfrags; + u->hwbuf_size = u->fragment_size * nfrags; +- u->tsched_watermark = tsched_watermark; ++ u->tsched_watermark = pa_usec_to_bytes_round_up(pa_bytes_to_usec_round_up(tsched_watermark, &requested_ss), &u->source->sample_spec); + pa_cvolume_mute(&u->hardware_volume, u->source->sample_spec.channels); + + if (use_tsched) { + fix_min_sleep_wakeup(u); + fix_tsched_watermark(u); ++ ++ u->watermark_step = pa_usec_to_bytes(TSCHED_WATERMARK_STEP_USEC, &u->source->sample_spec); + } + + pa_source_set_latency_range(u->source, +diff --git a/src/pulse/proplist.h b/src/pulse/proplist.h +index d30dc3b..fa44c42 100644 +--- a/src/pulse/proplist.h ++++ b/src/pulse/proplist.h +@@ -156,7 +156,7 @@ PA_C_DECL_BEGIN + /** For devices: device class. One of "sound", "modem", "monitor", "filter" */ + #define PA_PROP_DEVICE_CLASS "device.class" + +-/** For devices: form factor if applicable. One of "laptop-speakers", "external-speakers", "telephone", "tv-capture", "webcam-capture", "microphone-capture", "headset", "headphones", "hands-free", "car", "hifi", "computer", "portable" */ ++/** For devices: form factor if applicable. One of "internal-speakers", "external-speakers", "handset", "tv-capture", "webcam", "microphone", "headset", "headphones", "hands-free", "car", "hifi", "computer", "portable" */ + #define PA_PROP_DEVICE_FORM_FACTOR "device.form_factor" + + /** For devices: connector of the device if applicable. One of "isa", "pci", "usb", "firewire", "bluetooth" */ +diff --git a/src/pulsecore/core.c b/src/pulsecore/core.c +index eef967a..c064e67 100644 +--- a/src/pulsecore/core.c ++++ b/src/pulsecore/core.c +@@ -250,3 +250,14 @@ int pa_core_exit(pa_core *c, pa_bool_t force, int retval) { + c->mainloop->quit(c->mainloop, retval); + return 0; + } ++ ++void pa_core_maybe_vacuum(pa_core *c) { ++ pa_assert(c); ++ ++ if (!pa_idxset_isempty(c->sink_inputs) || ++ !pa_idxset_isempty(c->source_outputs)) ++ return; ++ ++ pa_log_debug("Hmm, no streams around, trying to vacuum."); ++ pa_mempool_vacuum(c->mempool); ++} +diff --git a/src/pulsecore/core.h b/src/pulsecore/core.h +index 7660bd3..093fa8f 100644 +--- a/src/pulsecore/core.h ++++ b/src/pulsecore/core.h +@@ -171,4 +171,6 @@ void pa_core_check_idle(pa_core *c); + + int pa_core_exit(pa_core *c, pa_bool_t force, int retval); + ++void pa_core_maybe_vacuum(pa_core *c); ++ + #endif +diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c +index 544bb33..34de9bb 100644 +--- a/src/pulsecore/sink-input.c ++++ b/src/pulsecore/sink-input.c +@@ -468,6 +468,8 @@ void pa_sink_input_unlink(pa_sink_input *i) { + i->sink = NULL; + } + ++ pa_core_maybe_vacuum(i->core); ++ + pa_sink_input_unref(i); + } + +diff --git a/src/pulsecore/source-output.c b/src/pulsecore/source-output.c +index d8a2363..d99f79c 100644 +--- a/src/pulsecore/source-output.c ++++ b/src/pulsecore/source-output.c +@@ -335,6 +335,8 @@ void pa_source_output_unlink(pa_source_output*o) { + o->source = NULL; + } + ++ pa_core_maybe_vacuum(o->core); ++ + pa_source_output_unref(o); + } + diff --git a/pulseaudio.spec b/pulseaudio.spec index af577e3..81c964d 100644 --- a/pulseaudio.spec +++ b/pulseaudio.spec @@ -3,7 +3,7 @@ Name: pulseaudio Summary: Improved Linux sound server Version: 0.9.15 -Release: 2.test3%{?dist} +Release: 3.test3%{?dist} License: GPLv2+ Group: System Environment/Daemons Source0: http://0pointer.de/lennart/projects/pulseaudio/pulseaudio-%{version}-test3.tar.gz @@ -47,6 +47,7 @@ BuildRequires: libasyncns-devel Obsoletes: pulseaudio-devel Obsoletes: pulseaudio-core-libs Provides: pulseaudio-core-libs +Patch0: 116b38c972942ccbbb8dae5dc0181da98096a0ce.patch %description PulseAudio is a sound server for Linux and other Unix like operating @@ -184,6 +185,7 @@ This package contains command line utilities for the PulseAudio sound server. %prep %setup -q -T -b0 -n pulseaudio-0.9.15-test3 +%patch0 -p1 -b .116b38c972942ccbbb8dae5dc0181da98096a0ce %build CFLAGS="-ggdb" %configure --disable-static --disable-rpath --with-system-user=pulse --with-system-group=pulse --with-realtime-group=pulse-rt --with-access-group=pulse-access @@ -405,6 +407,9 @@ groupadd -r pulse-access &>/dev/null || : %{_mandir}/man1/pax11publish.1.gz %changelog +* Fri Feb 27 2009 Lennart Poettering 0.9.15-3.test3 +- Steal patch from git master to fix .so dependencies + * Wed Feb 25 2009 Lennart Poettering 0.9.15-2.test3 - Add more missing X11 dependencies