Daniel Mack [Sun, 20 Mar 2011 16:57:49 +0000 (17:57 +0100)]
osx: add routines for real-time thread scheduling
Code sniplets are based on examples provided by Apple. See
http://developer.apple.com/library/mac/#documentation/Darwin/Conceptual/KernelProgramming/scheduler/scheduler.html
Tanu Kaskinen [Thu, 17 Mar 2011 10:23:41 +0000 (12:23 +0200)]
alsa-mixer: Implement constant volume.
This change makes it possible to configure an arbitrary constant volume for a
volume element in the path configuration, which is applied when the path is
selected. Note: this is only useful when the exact hardware and driver are
known beforehand.
Maarten Bosmans [Sat, 19 Mar 2011 15:26:47 +0000 (16:26 +0100)]
Get rid of some warnings
Mostly warnings about unused stuff.
Furthermore, the first hunk is a fix for the change in 177948a6.
Finally, comment in AEC_dtd was translated and the code simplified slightly.
CC module_bluetooth_device_la-module-bluetooth-device.lo
modules/bluetooth/module-bluetooth-device.c: In function ‘a2dp_process_render’:
modules/bluetooth/module-bluetooth-device.c:1335:30: warning: pointer targets in passing argument 6 of ‘sbc_encode’
differ in signedness [-Wpointer-sign]
../src/modules/bluetooth/sbc/sbc.h:92:9: note: expected ‘ssize_t *’ but argument is of type ‘size_t *’
CC module_rygel_media_server_la-module-rygel-media-server.lo
modules/module-rygel-media-server.c:383:13: warning: ‘append_property_dict_entry_object_array’ defined but not used [-Wunused-function]
CC module_echo_cancel_la-adrian-aec.lo
modules/echo-cancel/adrian-aec.h:360:15: warning: ‘AEC_getambient’ defined but not used [-Wunused-function]
modules/echo-cancel/adrian-aec.h:368:14: warning: ‘AEC_setgain’ defined but not used [-Wunused-function]
modules/echo-cancel/adrian-aec.h:374:14: warning: ‘AEC_setaes’ defined but not used [-Wunused-function]
modules/echo-cancel/adrian-aec.h:377:16: warning: ‘AEC_max_dotp_xf_xf’ declared ‘static’ but never defined [-Wunused-function]
CC module_echo_cancel_la-module-echo-cancel.lo
modules/echo-cancel/module-echo-cancel.c: In function ‘time_callback’:
modules/echo-cancel/module-echo-cancel.c:266:12: warning: variable ‘fs’ set but not used [-Wunused-but-set-variable]
CC module-virtual-sink.lo
modules/module-virtual-sink.c: In function ‘sink_input_pop_cb’:
modules/module-virtual-sink.c:206:15: warning: variable ‘current_latency’ set but not used [-Wunused-but-set-variable]
Maarten Bosmans [Sat, 19 Mar 2011 12:59:16 +0000 (13:59 +0100)]
Get rid of some warnings: -Wunsafe-loop-optimizations
pulsecore/core-util.c: In function ‘pa_hexstr’:
pulsecore/core-util.c:1858: warning: cannot optimize loop, the loop counter may overflow [-Wunsafe-loop-optimizations]
modules/alsa/alsa-mixer.c: In function ‘pa_alsa_decibel_fix_dump’:
modules/alsa/alsa-mixer.c:3678: warning: cannot optimize possibly infinite loops [-Wunsafe-loop-optimizations]
modules/alsa/alsa-mixer.c: In function ‘pa_alsa_path_set_new’:
modules/alsa/alsa-mixer.c:2640: warning: cannot optimize loop, the loop counter may overflow [-Wunsafe-loop-optimizations]
Maarten Bosmans [Sat, 19 Mar 2011 12:59:15 +0000 (13:59 +0100)]
Get rid of some warnings: -Wunused-result
modules/module-default-device-restore.c: In function ‘load’:
modules/module-default-device-restore.c:67: warning: ignoring return value of ‘fgets’,
declared with attribute warn_unused_result [-Wunused-result]
modules/module-default-device-restore.c:88: warning: ignoring return value of ‘fgets’,
declared with attribute warn_unused_result [-Wunused-result]
pulsecore/authkey.c: In function ‘generate’:
pulsecore/authkey.c:58: warning: ignoring return value of ‘ftruncate’,
declared with attribute warn_unused_result [-Wunused-result]
pulsecore/core-util.c: In function ‘pa_make_secure_dir’:
pulsecore/core-util.c:261: warning: ignoring return value of ‘fchown’,
declared with attribute warn_unused_result [-Wunused-result]
Maarten Bosmans [Tue, 15 Mar 2011 20:06:46 +0000 (21:06 +0100)]
Fix pa_rtclock_from_wallclock
The HAVE_CLOCK_GETTIME macro protects timespec and related functions, nothing of which is used in
pa_rtclock_from_wallclock. And silently just not converting was not the proper solution anyway.
Also add an assert in pulse/mainloop.c to report the integer overflow that was triggered by the wrong
pa_rtclock_from_wallclock. Without the assert, debugging was painful.
Maarten Bosmans [Mon, 14 Mar 2011 15:27:03 +0000 (16:27 +0100)]
Make pulse compile with clang
This fixes the checking of supported compiler flags and the following error message for svolume_mmx:
pulsecore/svolume_mmx.c:157:76: error: invalid use of a cast in a inline asm context requiring an l-value:
remove the cast or build with -fheinous-gnu-extensions
: "+r" (samples), "+r" (volumes), "+r" (length), "=D" ((pa_reg_x86)channel), "=&r" (temp)
~~~~~~~~~~~~^~~~~~~
Siarhei Siamashka [Mon, 14 Mar 2011 18:37:42 +0000 (15:37 -0300)]
sbc: add iwmmxt optimization for sbc for pxa series cpu
Benchmarked on ARM PXA platform:
=== Before (4 bands) ====
$ time ./sbcenc_orig -s 4 long.au > /dev/null
real 0m 2.44s
user 0m 2.39s
sys 0m 0.05s
=== After (4 bands) ====
$ time ./sbcenc -s 4 long.au > /dev/null
real 0m 1.59s
user 0m 1.49s
sys 0m 0.10s
=== Before (8 bands) ====
$ time ./sbcenc_orig -s 8 long.au > /dev/null
real 0m 4.05s
user 0m 3.98s
sys 0m 0.07s
=== After (8 bands) ====
$ time ./sbcenc -s 8 long.au > /dev/null
real 0m 1.48s
user 0m 1.41s
sys 0m 0.06s
=== Before (a2dp usage) ====
$ time ./sbcenc_orig -b53 -s8 -j long.au > /dev/null
real 0m 4.51s
user 0m 4.41s
sys 0m 0.10s
=== After (a2dp usage) ====
$ time ./sbcenc -b53 -s8 -j long.au > /dev/null
real 0m 2.05s
user 0m 1.99s
sys 0m 0.06s
Siarhei Siamashka [Mon, 14 Mar 2011 18:35:03 +0000 (15:35 -0300)]
sbc: ARMv6 optimized version of analysis filter for SBC encoder
The optimized filter gets enabled when the code is compiled
with -mcpu=/-march options set to target the processors which
support ARMv6 instructions. This code is also disabled when
NEON is used (which is a lot better alternative). For additional
safety ARM EABI is required and thumb mode should not be used.
Benchmarks from ARM11:
== 8 subbands ==
$ time ./sbcenc -b53 -s8 -j test.au > /dev/null
real 0m 35.65s
user 0m 34.17s
sys 0m 1.28s
$ time ./sbcenc.armv6 -b53 -s8 -j test.au > /dev/null
real 0m 17.29s
user 0m 15.47s
sys 0m 0.67s
== 4 subbands ==
$ time ./sbcenc -b53 -s4 -j test.au > /dev/null
real 0m 25.28s
user 0m 23.76s
sys 0m 1.32s
$ time ./sbcenc.armv6 -b53 -s4 -j test.au > /dev/null
Siarhei Siamashka [Mon, 14 Mar 2011 18:36:07 +0000 (15:36 -0300)]
sbc: added "cc" to the clobber list of mmx inline assembly
In the case of scale factors calculation optimizations, the inline
assembly code has instructions which update flags register, but
"cc" was not mentioned in the clobber list. When optimizing code,
gcc theoretically is allowed to do a comparison before the inline
assembly block, and a conditional branch after it which would lead
to a problem if the flags register gets clobbered. While this is
apparently not happening in practice with the current versions of
gcc, the clobber list needs to be corrected.
Regarding the other inline assembly blocks. While most likely it
is actually unnecessary based on quick review, "cc" is also added
there to the clobber list because it should have no impact on
performance in practice. It's kind of cargo cult, but relieves
us from the need to track the potential updates of flags register
in all these places.
Siarhei Siamashka [Mon, 14 Mar 2011 18:31:30 +0000 (15:31 -0300)]
sbc: faster 'sbc_calculate_bits' function
By using SBC_ALWAYS_INLINE trick, the implementation of 'sbc_calculate_bits'
function is split into two branches, each having 'subband' variable value
known at compile time. It helps the compiler to generate more optimal code
by saving at least one extra register, and also provides more obvious
opportunities for loops unrolling.
Siarhei Siamashka [Mon, 14 Mar 2011 18:29:38 +0000 (15:29 -0300)]
sbc: slightly faster 'sbc_calc_scalefactors_neon'
Previous variant was basically derived from C and MMX implementations.
Now new variant makes use of 'vmax' instruction, which is available in
NEON and can do this job faster. The same method for calculating scale
factors is also used in 'sbc_calc_scalefactors_j_neon'.
Benchmarked without joint stereo on ARM Cortex-A8:
Siarhei Siamashka [Mon, 14 Mar 2011 18:16:30 +0000 (15:16 -0300)]
sbc: new 'sbc_calc_scalefactors_j' function added to sbc primitives
The code for scale factors calculation with joint stereo support has
been moved to a separate function. It can get platform-specific
SIMD optimizations later for best possible performance.
But even this change in C code improves performance because of the
use of __builtin_clz() instead of loops similar to what was done
to sbc_calc_scalefactors earlier. Also technically it does loop
unrolling by processing two channels at once, which might be either
good or bad for performance (if the registers pressure is increased
and more data is spilled to memory). But the benchmark from 32-bit
x86 system (pentium-m) shows that it got clearly faster:
$ time ./sbcenc.old -b53 -s8 -j test.au > /dev/null
real 0m1.868s
user 0m1.808s
sys 0m0.048s
$ time ./sbcenc.new -b53 -s8 -j test.au > /dev/null
Siarhei Siamashka [Mon, 14 Mar 2011 18:07:38 +0000 (15:07 -0300)]
sbc: added saturated clipping of decoder output to 16-bit
This prevents overflows and audible artefacts for the audio files which
originally had loudness maximized. Music from audio CD disks is an
example of such files, see http://en.wikipedia.org/wiki/Loudness_war
Siarhei Siamashka [Mon, 14 Mar 2011 18:01:19 +0000 (15:01 -0300)]
sbc: ensure 16-byte buffer position alignment for 4 subbands encoding
Buffer position in X array was not always 16-bytes aligned.
Strict 16-byte alignment is strictly required for powerpc altivec
simd optimizations because altivec does not have support for
unaligned vector loads at all.
Luiz Augusto von Dentz [Fri, 14 Jan 2011 12:18:08 +0000 (14:18 +0200)]
bluetooth: add proper handling for bluetooth.nrec property
NREC stands for Noise Reduction and Echo Cancelation, it can be changed
at any point by the headset.
When set to "1" indicates that those algorithms shall be enabled by
default and "0" means the headset probably have them active so they
should be disabled in PA side.
Luiz Augusto von Dentz [Thu, 23 Dec 2010 13:24:39 +0000 (15:24 +0200)]
bluetooth: fix a2dp_process_push
Use minimum bitpool configured to get the maximum block_size possible,
also remove checks for how much has been written when decoding sbc frames
since the block size may change due to bitpool changes.
Luiz Augusto von Dentz [Thu, 23 Dec 2010 11:13:44 +0000 (13:13 +0200)]
bluetooth: reduce bitpool if audio start skipping
When audio skips it could be that there is some bandwidth limitation in
the link e.g. headset doesn't support EDR (< 2.0), and by reducing
the bitpool it may find a better rate that either prevent the skips
completely or at least reduce them.
Luiz Augusto von Dentz [Thu, 2 Dec 2010 12:11:13 +0000 (14:11 +0200)]
bluetooth: handle Acquire API change
Acquire now return input and output MTU of the file descriptor so it is
no longer necessary to get those after acquiring the fd, which less round
trips and faster response time when switching profiles.
Colin Guthrie [Mon, 14 Mar 2011 16:31:00 +0000 (16:31 +0000)]
build-sys: No need to create folder for echo-cancel module.
The ORCC stage does this anyway (and this was buggy anyway as it had an extra
'src/' prefix so never worked properly when it was introduced in d6cdd80).
Colin Guthrie [Thu, 10 Mar 2011 11:11:51 +0000 (11:11 +0000)]
cork-on-phone: Only cork (and subsequently uncork) streams that are not already corked.
Although by "cork" I really mean "cork+mute" as that's what the module
does.
If e.g. Rhythmbox is paused when a phone call comes in, the current
stream state will be corked and thus we should not track it for future
uncorking when the phone call ends.
Likewise if the stream is just muted (manually) we will not take any
action either when the phone stream is seen first, nor when it
disappears.
Tanu Kaskinen [Fri, 11 Mar 2011 11:41:28 +0000 (13:41 +0200)]
alsa-mixer: When figuring out the max_dB of a path, use only channels that are used by the path elements.
Without this, p->max_dB could never be less than 0 dB, because the loop at the
end of pa_alsa_path_probe() would reset p->max_dB to 0 as soon as the loop
encountered a channel that wasn't touched by any element.
There was a similar issue for p->min_dB too (it could never be more than 0 dB),
which is also fixed by this patch.
Tanu Kaskinen [Fri, 11 Mar 2011 11:40:51 +0000 (13:40 +0200)]
alsa-mixer: Implement support for setting element specific upper limits for volume.
This feature is mainly useful in embedded systems that have built-in speakers.
In such situations the full audio path is known beforehand, so it's possible to
know what is the maximum sensible volume, and any higher volume can be
disabled.
The volume limit is set in path configuration files in the [Element] section,
using option "volume-limit". The value is the desired maximum volume step of
the volume element.
Arun Raghavan [Mon, 25 Oct 2010 16:59:08 +0000 (17:59 +0100)]
volume: Add Orc-based optimised volume scaling
This adds volume scaling for 1- and 2-channel software volume scaling
using Orc. While testing the MMX and SSE backends on a Core2, I see an
~2x performance benefit over the hand-rolled MMX and SSE code. Since I
haven't been able to test on other architectures, the Orc code is only
used when MMX/SSE* is present. This can be changed in the future after
testing on AMD and ARM machines.
Arun Raghavan [Wed, 27 Oct 2010 10:30:14 +0000 (11:30 +0100)]
volume: Fix sample array size for tests
Somewhere in the history of the MMX tests, the number of channels was
changed from 1 to 2, but the number of samples was not increased to make
it even (multiple of the frame size).
It seems git managed to mess up a git-am with a patch from
David which moved where this function was called element_probe
to within itself (recursive which could normally lead to an
infinite loop, but as it was now never called from anywhere else,
this didn't happen).
Thank you to Maarten for spotting and following up the issue.
Colin Guthrie [Thu, 3 Mar 2011 12:04:31 +0000 (12:04 +0000)]
volume: Add a PA_VOLUME_UI_MAX define for the recommended max volume to show in UIs
This value is not a technical upper limit, it's just a 'sensible'
value that is not crazy high, but also allows software amplification
above 0dB (aka 100%) for very quiet audio sources.
We recommend that a comprehensive volume control UI should allow
users to set volumes up to this limit, although of course should
deal gracefully if the user has set the volume even higher than this
without resulting in a feedback loop that effectively limits the
upper volume.
The value chosen is +11dB. This was selected somewhat subjectively
and is very similar to the current 150% that gnome-volume-control
uses (which is ~+10.57dB).
On the plus side, we now recommend that everyone allows
'Volumes up to 11' which is pretty awesome.
http://en.wikipedia.org/wiki/Up_to_eleven
Colin Guthrie [Tue, 1 Mar 2011 18:15:28 +0000 (18:15 +0000)]
x11: Make pax11publish -r remove PULSE_SESSION_ID
This is not set by pax11publish, but module-x11-publish does so this tool
should tidy that up. It is only removed when passing -r and is
ignored when actually setting up it's own properties from the conf
files/guesswork.
Tanu Kaskinen [Thu, 24 Feb 2011 14:16:43 +0000 (16:16 +0200)]
virtual-sink: Fix a crash when moving the sink to a new master right after setup.
If the virtual sink is moved to a new master right after it has been created,
then the virtual sink input's memblockq can be rewound to a negative read
index. The data written prior to the move starts from index zero, so after the
rewind there's a bit of silence. If the memblockq doesn't have a silence
memchunk set, then pa_memblockq_peek() will return zero in such case, and the
returned memchunk's memblock pointer will be NULL.
That scenario wasn't taken into account in the implementation of
sink_input_pop_cb. Setting a silence memchunk for the memblockq solves this
problem, because pa_memblock_peek() will now return a valid memblock if the
read index happens to point to a hole in the memblockq.
I believe this isn't the best possible solution, though. It doesn't really make
sense to rewind the sink input's memblockq beyond index 0 in the first place,
because now when the stream starts to play to the new master sink, there's some
unnecessary silence before the actual data starts. This is a small problem,
though, and I don't grok the rewinding system well enough to know how to fix
this issue properly.
I went through all files that call pa_memblockq_peek() to see if there are more
similar bugs. play-memblockq.c was the only one that looked to me like it might
be broken in the same way. I didn't try reproducing the bug with
play-memblockq.c, though, so I just added a FIXME comment there.