Tanu Kaskinen [Thu, 3 Dec 2009 11:22:05 +0000 (13:22 +0200)]
libpulse: Store pa_stream pointers to hashmaps instead of dynarrays.
Since the stream identifiers (channels) are monotonically growing integer, it
isn't a good idea to use them as index to a dynamic array, because the array
will grow all the time. This is not a problem with client connections that
don't create many streams, but, for example, long-running clients that use
libcanberra for playing event sounds, this means that the client connection
effectively leaks memory.
Colin Guthrie [Mon, 30 Nov 2009 14:55:57 +0000 (14:55 +0000)]
Merge remote branch 'tanuk/master'
Lennart Poettering [Mon, 23 Nov 2009 04:45:33 +0000 (05:45 +0100)]
Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio
Lennart Poettering [Mon, 23 Nov 2009 03:48:31 +0000 (04:48 +0100)]
Merge remote branch 'phish3/master'
Lennart Poettering [Sun, 22 Nov 2009 20:40:15 +0000 (21:40 +0100)]
Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio
Joe Marcus Clarke [Sat, 21 Nov 2009 00:13:35 +0000 (01:13 +0100)]
freebsd: implement pa_get_binary_name
Stolen from
http://www.freebsd.org/cgi/cvsweb.cgi/ports/audio/pulseaudio/files/patch-src_pulse_util.c?rev=1.1
and fixed for indentation.
Jason Newton [Fri, 20 Nov 2009 23:18:59 +0000 (15:18 -0800)]
src/utils/qpaeq: added more friendly error messages to common errors
Jason Newton [Fri, 20 Nov 2009 23:34:02 +0000 (15:34 -0800)]
Makefile.am: added qpaeq to installed scripts
Diego Elio 'Flameeyes' Pettenò [Fri, 20 Nov 2009 23:53:00 +0000 (00:53 +0100)]
Simplify Makefile.am handling of ALSA-related files.
Instead of declaring extra variables for the ALSA profiles and PATHS, and
using EXTRA_DIST for the udev rule, use the dist_ prefix when declaring
them for conditional installation.
This relies on the fact that automake *is* smart enough to know that there
exist *no* conditional dist, and will always distribute all of them.
Diego Elio 'Flameeyes' Pettenò [Fri, 20 Nov 2009 23:47:44 +0000 (00:47 +0100)]
Avoid using devname as a variable name.
On FreeBSD, devname() is a system function, and was overshadowed.
Diego Elio 'Flameeyes' Pettenò [Fri, 20 Nov 2009 23:30:46 +0000 (00:30 +0100)]
Rename all the signal parameters and variables to something more explicit.
Without this change, on FreeBSD you'll be bothered by tons of warnings
about overshadowing signal(2).
Diego Elio 'Flameeyes' Pettenò [Fri, 20 Nov 2009 23:27:35 +0000 (00:27 +0100)]
Since now we have FreeBSD atomic operations, don't require libatomic_ops.
This lets the original configure script to pass on FreeBSD.
Diego Elio 'Flameeyes' Pettenò [Fri, 20 Nov 2009 23:17:33 +0000 (00:17 +0100)]
Simplify handling of NetBSD atomic ops discovery.
Instead of having a parameter to enable/disable them (which was also
ignored by the source code side), simply identify NetBSD 5 (when the atomic
ops were implemented the first time) in a $host switch and ignore checking
for libatomic_ops.
Diego Elio 'Flameeyes' Pettenò [Fri, 20 Nov 2009 23:10:37 +0000 (00:10 +0100)]
Merge branch 'master' of git://git.0pointer.de/pulseaudio
Jason Newton [Fri, 20 Nov 2009 23:07:47 +0000 (15:07 -0800)]
remove .py extension from qpaeq
Lennart Poettering [Fri, 20 Nov 2009 23:05:02 +0000 (00:05 +0100)]
Merge remote branch 'phish3/master'
Joe Marcus Clarke [Fri, 20 Nov 2009 23:02:33 +0000 (00:02 +0100)]
freebsd: fix atomic ops implementations
Stole from
http://www.freebsd.org/cgi/cvsweb.cgi/ports/audio/pulseaudio/files/patch-src_pulsecore_atomic.h?rev=1.6
Jason Newton [Fri, 20 Nov 2009 22:56:07 +0000 (14:56 -0800)]
added qpaeq script for GUI equalizer control to src/util
Diego Elio 'Flameeyes' Pettenò [Fri, 20 Nov 2009 20:37:16 +0000 (21:37 +0100)]
Check for stow using AC_CHECK_PROG rather than type -p.
The type -p check is not compatible with POSIX shells, and indeed fails
when used with the FreeBSD 8 default shell. Instead the AC_CHECK_PROG macro
is written properly to look for the command.
Diego Elio 'Flameeyes' Pettenò [Fri, 20 Nov 2009 20:25:33 +0000 (21:25 +0100)]
Include sys/filio.h if present; this makes use of FIONREAD on Solaris.
FIONREAD on OpenSolaris is declared in sys/filio.h. The RTP modules already
rely on the presence of FIONREAD, and check for the header, so this brings
the pipe source and sink modules on par with them.
Diego Elio 'Flameeyes' Pettenò [Fri, 20 Nov 2009 20:24:46 +0000 (21:24 +0100)]
Don't declare the variable l if FIONREAD is not defined.
This avoids two warnings due to FIONREAD not being defined.
Diego Elio 'Flameeyes' Pettenò [Fri, 20 Nov 2009 20:22:24 +0000 (21:22 +0100)]
Fix build on Solaris: pass the third parameter to pa_cloexec_open.
Diego Elio 'Flameeyes' Pettenò [Fri, 20 Nov 2009 20:08:05 +0000 (21:08 +0100)]
Move the platform-specific defines after the compiler has been found.
Without this change, on OpenSolaris, it's possible that the compiler will
be reported, by default, as failing to produce executables, since
_XOPEN_SOURCE=600 requires a C99 compiler to compile even the simples of
the programs.
Lennart Poettering [Fri, 20 Nov 2009 19:27:03 +0000 (20:27 +0100)]
alsa: fix minor sampling rate deviations before adjusting the buffer size
Lennart Poettering [Fri, 20 Nov 2009 19:00:26 +0000 (20:00 +0100)]
alsa: fix log output when the audio device refuses to give us again the same period settings we had before
Lennart Poettering [Fri, 20 Nov 2009 18:55:47 +0000 (19:55 +0100)]
pulse: ask for timing updates both *before* and *after* triggering a stream state change so that in the STARTED/UNDERFLOW callbacks we accurate transport latency information
Lennart Poettering [Fri, 20 Nov 2009 18:48:08 +0000 (19:48 +0100)]
pulse: delay smoother update only when unpausing, not when pausing, since we don't want the timer to advance when we are supposedly already paused
Lennart Poettering [Fri, 20 Nov 2009 16:49:30 +0000 (17:49 +0100)]
pulse: try to fix inaccuracy with uncork timing for streams that are created in corked state
Lennart Poettering [Fri, 20 Nov 2009 16:48:04 +0000 (17:48 +0100)]
daemon: complain if user passes too many arguments
Jason Newton [Thu, 12 Nov 2009 06:52:52 +0000 (22:52 -0800)]
module-equalizer-sink: add latency of output_q and input_q to get latency calculation
Jason Newton [Thu, 12 Nov 2009 07:16:14 +0000 (23:16 -0800)]
module-equalizer-sink: switch back to reference dsp implementation - cpu usage doesn't really change and there may be
a bug in the vectorized version
Jason Newton [Fri, 30 Oct 2009 01:44:04 +0000 (18:44 -0700)]
module-equalizer-sink: (re)added output memblockq commented out timing debug statements
Lennart Poettering [Fri, 20 Nov 2009 00:02:01 +0000 (01:02 +0100)]
Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio
Lennart Poettering [Wed, 18 Nov 2009 20:41:38 +0000 (21:41 +0100)]
rygel: fix itemCount property for sources
Fixes http://pulseaudio.org/ticket/721
Colin Guthrie [Mon, 16 Nov 2009 23:36:44 +0000 (23:36 +0000)]
build-sys: Fix missing trailing slash in 14eaf2
Sjoerd Simons [Sat, 14 Nov 2009 22:23:10 +0000 (22:23 +0000)]
build-sys: Make sure all alsa path config files are installed
While all alsa path configuration files were in EXTRA_DIST not all of them were
in in alsapaths_DATA. Fixed by only defining the list in one place
Colin Guthrie [Wed, 11 Nov 2009 17:24:57 +0000 (17:24 +0000)]
device-manager: Update docs version -> 0.9.20
Third time is a charm... maybe.
Lennart Poettering [Wed, 11 Nov 2009 03:50:32 +0000 (04:50 +0100)]
core: make cpuid code compile cleanly with 32bit PIC
Lennart Poettering [Wed, 11 Nov 2009 03:18:10 +0000 (04:18 +0100)]
core: adjust volume only when there is actually a memory block
Fixes an assert that is hit in somne niche cases:
https://bugzilla.redhat.com/show_bug.cgi?id=533482
Wim Taymans [Tue, 10 Nov 2009 12:21:55 +0000 (13:21 +0100)]
protocol: use the right sample rate for sources
Use the correct sample rate for reporting about the timing.
Colin Guthrie [Mon, 9 Nov 2009 21:56:33 +0000 (21:56 +0000)]
device-manager: Update docs version -> 0.9.20
Lennart Poettering [Thu, 5 Nov 2009 21:55:14 +0000 (22:55 +0100)]
ramping: minor cleanups
Lennart Poettering [Thu, 5 Nov 2009 21:54:42 +0000 (22:54 +0100)]
Merge remote branch 'origin/merge-queue'
Conflicts:
src/pulsecore/sink-input.c
src/pulsecore/sink.c
Lennart Poettering [Thu, 5 Nov 2009 04:18:10 +0000 (05:18 +0100)]
jack: never try to autoconnect to MIDI ports
Original patch supplied by 'adi'
http://pulseaudio.org/ticket/669
Lennart Poettering [Thu, 5 Nov 2009 04:08:50 +0000 (05:08 +0100)]
man: fix build with --disable-manpages
http://pulseaudio.org/ticket/698
Vladimir Kokarev [Thu, 5 Nov 2009 03:55:21 +0000 (04:55 +0100)]
lirc,mmkvd: added module parameters volume_limit, volume_step
volume_limit sets maximum volume that can be set from the module
default is PA_VOLUME_NORM*3/2 (150%)
volume_step sets step in volume changing
default is PA_VOLUME_NORM/20
values are of raw pa_volume_t type
Vladimir Kokarev [Sat, 19 Sep 2009 15:43:24 +0000 (19:43 +0400)]
volume: add pa_cvolume_inc_clamp function
added function to increase volume not exceeding specified limit
simply changed PA_VOLUME_MAX to 'limit' in pa_cvolume_inc
pa_cvolume_inc now calls pa_cvolume_inc_clamp with PA_VOLUME_MAX limit
Lennart Poettering [Thu, 5 Nov 2009 02:23:08 +0000 (03:23 +0100)]
alsa: disable timer-based scheduling inside a VM
In virtual machines sound card clocks and OS scheduling tend to become
unreliable, adding various 'uneven' latencies. The adaptive algorithm
that handles drop-outs does not handle it this well: in contrast to
drop-outs on real machines that are evenly distributed, small and can
easily be encountered via the adpative algorithms, drop-outs in VMs tend
to happen abruptly, and massively, which is not easy to counter.
This patch simply disables timer based scheduling in VMs reverting to
classic IO based scheduling. This should help make PA perform better in
VMs.
https://bugzilla.redhat.com/show_bug.cgi?id=532775
Lennart Poettering [Thu, 5 Nov 2009 02:22:48 +0000 (03:22 +0100)]
daemon: during startup say whether we run in a VM
Lennart Poettering [Thu, 5 Nov 2009 02:22:15 +0000 (03:22 +0100)]
core-util: add call to detect if we are called from within a VM
Lennart Poettering [Thu, 5 Nov 2009 02:21:10 +0000 (03:21 +0100)]
alsa: introduce more standard path names
Lennart Poettering [Tue, 3 Nov 2009 23:15:47 +0000 (00:15 +0100)]
alsa: cover 'Analog Output' control
http://pulseaudio.org/ticket/702
Lennart Poettering [Sat, 31 Oct 2009 02:49:02 +0000 (03:49 +0100)]
Merge remote branch 'phish3/master'
Lennart Poettering [Sat, 31 Oct 2009 02:43:42 +0000 (03:43 +0100)]
alsa: create a seperate mixer path for Speaker elements
On some cards line-out is independant of Sepaker and it is a good idea
to cover that so that they can independantly be activated.
https://bugzilla.redhat.com/show_bug.cgi?id=520884
Lennart Poettering [Sat, 31 Oct 2009 02:42:42 +0000 (03:42 +0100)]
alsa: leave other headphone control enabled if possible
Lennart Poettering [Sat, 31 Oct 2009 02:41:21 +0000 (03:41 +0100)]
alsa: lower priority for Headphone2 path
Lennart Poettering [Sat, 31 Oct 2009 02:25:32 +0000 (03:25 +0100)]
alsa: cover Input Source:AUX IN
As seen on some HDA chips:
https://bugzilla.redhat.com/attachment.cgi?id=359804
Lennart Poettering [Sat, 31 Oct 2009 02:10:00 +0000 (03:10 +0100)]
alsa: cover Headphone2 mixer element
As seen on some drivers:
https://bugzilla.redhat.com/show_bug.cgi?id=498612
Lennart Poettering [Sat, 31 Oct 2009 01:56:57 +0000 (02:56 +0100)]
alsa: cover 'Digital Input Source' element
As used by some HDA devices:
https://bugzilla.redhat.com/attachment.cgi?id=365290
Lennart Poettering [Sat, 31 Oct 2009 01:49:44 +0000 (02:49 +0100)]
alsa: cover Mic Jack Mode element
As used by some HDA chips:
https://bugzilla.redhat.com/attachment.cgi?id=366816
Lennart Poettering [Sat, 31 Oct 2009 01:43:47 +0000 (02:43 +0100)]
daemon: make sure pa has its own session and process group, but is not its leader so that we cannot acquire a tty ever
Lennart Poettering [Sat, 31 Oct 2009 01:05:54 +0000 (02:05 +0100)]
bluetooth: do not hand out access to devices that are not fully configured yet
Daniel Mack [Sat, 31 Oct 2009 00:58:26 +0000 (01:58 +0100)]
configure.ac: enable check for CoreAudio
David Yoder [Fri, 30 Oct 2009 14:54:08 +0000 (09:54 -0500)]
daemon: realpath segfault fix
Lennart,
Apparently I was debugging this at the same time as you. I can't figure out
why my Fedora 11 install with glibc-2.10 has a glibc realpath that doesn't
match the gnu documentation and returns null. But it does.
Your commit
aa8ce5bb9b159abb2ffb0f43996340566fc2e9c6 almost fixed my
problem, but it needs a tweak.
Thanks,
David Yoder
Daniel Mack [Mon, 19 Oct 2009 10:48:00 +0000 (12:48 +0200)]
Mac OS X: add semaphore implementation
On Wed, Sep 16, 2009 at 11:57:04PM +0200, Lennart Poettering wrote:
> On Wed, 16.09.09 15:15, Daniel Mack (daniel@caiaq.de) wrote:
>
> > + s = pa_xnew(pa_semaphore, 1);
> > + MPCreateSemaphore(UINT_MAX, value, &(s->sema));
> > + pa_assert(s->sema != 0);
>
> Hmm, I'd prefer if the ret val of MPCreateSemaphore() would be checked
> here.
>
> Also I find it a bit weird checking for s->sema, though not
> initializing it to 0 in the beginning. If the call actually failed,
> then the assert will check uninitialized memory. Also, comparing
> pointers with 0 sucks. That should be NULL.
>
> Given that this can not realisitically fail, only in OOM or OOM-like
> situations in which case we abort anyway it mght be enough just writing:
>
> pa_assert_se(MPCreateSemaphore(UINT_MAX, value, &s->sema) == 0);
>
> (Assuming that success is signalled by retval == 0 on MacOSX)
>
> > +void pa_semaphore_free(pa_semaphore *s) {
> > + pa_assert(s);
> > + MPDeleteSemaphore(s->sema);
>
> Same here.
>
> > + pa_xfree(s);
> > +}
> > +
> > +void pa_semaphore_post(pa_semaphore *s) {
> > + pa_assert(s);
> > + MPSignalSemaphore(s->sema);
>
> And here.
>
> > +}
> > +
> > +void pa_semaphore_wait(pa_semaphore *s) {
> > + pa_assert(s);
> > + /* should probably check return value (-ve is error), noErr is ok. */
> > + MPWaitOnSemaphore(s->sema, kDurationForever);
>
> And here.
Ok, done. See the patch below.
Daniel
>From
26df2fbae6d9215a3ae084876fb5f79e4d9cf4f0 Mon Sep 17 00:00:00 2001
From: Kim Lester <kim@dfusion.com.au>
Date: Wed, 16 Sep 2009 09:23:39 +0800
Subject: [PATCH] Mac OS X: add semaphore implementation
Daniel Mack [Mon, 19 Oct 2009 10:45:30 +0000 (12:45 +0200)]
Wrap clock_gettime and friends
On Wed, Sep 16, 2009 at 11:48:58PM +0200, Lennart Poettering wrote:
> On Wed, 16.09.09 15:15, Daniel Mack (daniel@caiaq.de) wrote:
>
> > From: Kim Lester <kim@dfusion.com.au>
> >
> > OS X does not define clockid_t or clock_gettime() and friends.
> > Add a wrapper to fix this.
>
> Hmpf. I am not particularly happy with this. This adds a lot of
> unnecessary compat code. We don't actually need implementations of
> clock_getres(). All we need is some kind of check whether system
> timers are accurate or whether they are rounded up to scheduling
> slices. On Linux we do that check with clock_getres(), but all the
> information it returns is actually not intertesting at all. We just
> check if this is below some trheshold, that's all.
>
> clock_settime() we don't use at all! We shouldn't carry compat code
> for that.
>
> And clock_gettime we don't really need either. We need some kind of
> accurate system timers (preferably monotonic), and on Linux we use
> clock_gettime() for that. But we already have a fallback there for
> gettimeofday().
>
> Or in other words, the current APIs pa_rtclock_get(),
> pa_rtclock_hrtimer() is supposed to be the abstract API that has
> different backends on different systems. I'd very much prefer if any
> MacOS specific code would simply be plugged in there instead of
> creating various new abstraction interfaces!
Ok - what about the version below? I don't particularily like the
Daniel
>From
9f0a051953ec354ccdb8aa44a9845c408b26ae0b Mon Sep 17 00:00:00 2001
From: Kim Lester <kim@dfusion.com.au>
Date: Wed, 16 Sep 2009 14:40:01 +0800
Subject: [PATCH] Implement pa_rtclock_get() and pa_rtclock_hrtimer() for Darwin
OS X does not define clockid_t or clock_gettime() and friends.
Add wrappers to fix this. Based on a patch from Kim Lester
<kim@dfusion.com.au>.
Leszek Koltunski [Tue, 27 Oct 2009 11:57:43 +0000 (19:57 +0800)]
X11: attach X11 properties to Screen, not Display
Lennart Poettering [Fri, 30 Oct 2009 04:20:00 +0000 (05:20 +0100)]
git: ignore kde related files
Wim Taymans [Thu, 29 Oct 2009 13:49:52 +0000 (14:49 +0100)]
svolume: fix MMX error
We need to sign extend the lower part of the multiplication before adding it to
the higher part. Makes -1 * 0xffff work again.
Wim Taymans [Thu, 29 Oct 2009 11:47:42 +0000 (12:47 +0100)]
sink: simplify silence checks
Lennart Poettering [Fri, 30 Oct 2009 04:08:48 +0000 (05:08 +0100)]
daemon: don't crash if pa_realpath() fails
Lennart Poettering [Fri, 30 Oct 2009 03:55:13 +0000 (04:55 +0100)]
socket-util: drop redundant casts
Lennart Poettering [Fri, 30 Oct 2009 03:54:55 +0000 (04:54 +0100)]
socket-util: allocate at least sizeof(sockaddr_storage) space
Lennart Poettering [Fri, 30 Oct 2009 03:54:19 +0000 (04:54 +0100)]
use pa_fopen_cloexec() where applicable
Lennart Poettering [Fri, 30 Oct 2009 03:53:15 +0000 (04:53 +0100)]
tdb: use O_CLOEXEC if available
Lennart Poettering [Fri, 30 Oct 2009 03:20:24 +0000 (04:20 +0100)]
core-util: introduce pa_fopen_cloexec()
Lennart Poettering [Fri, 30 Oct 2009 03:16:59 +0000 (04:16 +0100)]
core-util: make sure to enable FD_CLOEXEC unconditionally to cope with kernels that silently accept but ignore O_CLOEXEC
Lennart Poettering [Fri, 30 Oct 2009 02:32:38 +0000 (03:32 +0100)]
use cloexec wrappers wherever applicable
Lennart Poettering [Fri, 30 Oct 2009 02:30:42 +0000 (03:30 +0100)]
core-util: introduce FD_CLOEXEC wrappers for open/socket/pipe/accept
Jason Newton [Fri, 30 Oct 2009 02:10:16 +0000 (19:10 -0700)]
module-equalizer-sink:
add premultipliar to sse2 dsp_logic implementation
Jason Newton [Mon, 26 Oct 2009 21:55:11 +0000 (14:55 -0700)]
module-equalizer-sink: try to limit buffering to mempool's max_block_size and disable debug output
Jason Newton [Sat, 24 Oct 2009 00:06:30 +0000 (17:06 -0700)]
drop redundant alloc call
Lennart Poettering [Thu, 29 Oct 2009 00:54:45 +0000 (01:54 +0100)]
Merge remote branch 'origin/master'
Lennart Poettering [Thu, 29 Oct 2009 00:52:39 +0000 (01:52 +0100)]
simd: update test cases
Lennart Poettering [Thu, 29 Oct 2009 00:49:40 +0000 (01:49 +0100)]
smoother: add comments about optimization recommendations from Jason Newton
Lennart Poettering [Wed, 28 Oct 2009 23:46:22 +0000 (00:46 +0100)]
libpulse: introduce PA_STREAM_RELATIVE_VOLUME
Lennart Poettering [Wed, 28 Oct 2009 22:50:42 +0000 (23:50 +0100)]
protocol-native: if a client set volume/mute/device store it since it is user input
Lennart Poettering [Wed, 28 Oct 2009 22:47:50 +0000 (23:47 +0100)]
libpulse: explain semantics of pa_stream_connect_playback() in more detail
Lennart Poettering [Wed, 28 Oct 2009 22:47:21 +0000 (23:47 +0100)]
protocol-native: declare that user configured volumes are always absolute
Lennart Poettering [Wed, 28 Oct 2009 22:28:12 +0000 (23:28 +0100)]
pactl: format cookie a little bit nicer
Lennart Poettering [Wed, 28 Oct 2009 22:27:50 +0000 (23:27 +0100)]
pactl: include information about client context in pactl stat output
Lennart Poettering [Wed, 28 Oct 2009 22:27:14 +0000 (23:27 +0100)]
clients: drop definition of BUFSIZE which is unused
Lennart Poettering [Wed, 28 Oct 2009 22:26:48 +0000 (23:26 +0100)]
libpulse: introduce pa_context_get_tile_size() call
Lennart Poettering [Wed, 28 Oct 2009 20:29:01 +0000 (21:29 +0100)]
memblock: decrease tile size to 64k again
Jason Newton [Tue, 20 Oct 2009 01:28:25 +0000 (18:28 -0700)]
module-equalizer-sink: drop source executable permissions configure.ac: add enable/disable + summary line for fftw
Jason Newton [Sun, 18 Oct 2009 21:52:32 +0000 (14:52 -0700)]
module-equalizer-sink:
*fixed SSE2 optimized dsp logic (default if available)
*cleaned up whitespace formatting (again)
Jason Newton [Fri, 9 Oct 2009 03:46:52 +0000 (20:46 -0700)]
module-equalizer-sink: fixed equalizer state save/restore
Jason Newton [Tue, 20 Oct 2009 01:28:25 +0000 (18:28 -0700)]
module-equalizer-sink: drop source executable permissions configure.ac: add enable/disable + summary line for fftw
Colin Guthrie [Mon, 19 Oct 2009 20:50:03 +0000 (21:50 +0100)]
device-manager: Fix compiler warning.
Do not use a variable called 'index' as it clashes with string.h
Jason Newton [Sun, 18 Oct 2009 21:52:32 +0000 (14:52 -0700)]
module-equalizer-sink:
*fixed SSE2 optimized dsp logic (default if available)
*cleaned up whitespace formatting (again)