Commit graph

1565 commits

Author SHA1 Message Date
Arun Raghavan
4fb68b91ac core: Factor out passthrough checks into their own functions
Since we currently have two mechanisms to signal a passthrough
connection (non-PCM format or PA_SINK_INPUT_PASSTHROUGH flag), we move
all the related checks into functions and use those everywhere.

This makes things more consistent, and should we decide to get rid of
the flag, we only need to change pa_sink_input_*_is_passthrough()
accordingly.
2011-05-02 11:55:39 +05:30
Arun Raghavan
7aa84e8208 introspect: Get format of sink input
This gets the negotiated format of sink inputs in
pa_context_get_sink_input*(). Also prints the format in 'pactl list'.
2011-05-02 11:55:39 +05:30
Arun Raghavan
322980e2e3 introspect: Get formats for sinks
This gets the list of supported formats for a sink in
pa_context_get_sink_info*(). Also prints these in 'pactl list'.
2011-05-02 11:55:39 +05:30
Arun Raghavan
f94bcae6bd core: Suspend monitor when a sink enters passthrough mode
In most cases it is expected that clients cannot consume compressed
data from monitor sources, so we suspend the monitor source when the
sink goes into passthrough mode.

Eventually, when the extended API includes client notifications for
changed formats, we should emit a notification on the monitor so that
clients can decide what they want to do when this happens (disconnect or
consume the data anyway).
2011-05-02 11:55:38 +05:30
Arun Raghavan
4c9d53f3f5 sink: Trivial typo fix in comment 2011-05-02 11:55:38 +05:30
Arun Raghavan
e11770b64f core: Fix some FIXMEs for the extended API
This adds some checks that I'd postponed and adds a
"should-be-good-enough" guess for tlength when using a compressed
format.
2011-05-02 11:55:35 +05:30
Arun Raghavan
658a9153f0 sink-input: Kill passthrough streams if moving to an unsupported sink
This will eventually be replaced by a hook to let clients know that the
stream has moved so that they can gracefully reconnect and renegotiate a
supported format.
2011-05-02 11:54:48 +05:30
Arun Raghavan
8b3e68a202 sink: Fix leak in pa_sink_check_formats()
We weren't freeing the sink formats idxset.
2011-05-02 11:54:48 +05:30
Arun Raghavan
e418e49ecb format: Avoid some code duplication
We frequently need to free an idxset containing pa_format_infos, so
define an internal free function that can be used directly with this
(instead of defining it once-per-file).
2011-05-02 11:54:48 +05:30
Arun Raghavan
13229fb39e sink-input: Don't assert on bad formats
Handles bad format input more gracefully and returns an error instead.
2011-05-02 11:54:48 +05:30
Arun Raghavan
8ec0548f5f sink-input: Return NOTSUPPORTED if format negotiation fails
This is easier for clients to grok than INVALID.
2011-05-02 11:54:48 +05:30
Arun Raghavan
5d5523604f sink-input: Minor cleanups
Removes a couple of warnings and simplifies the assertion logic that
verifies format negotiation was successful.
2011-05-02 11:54:48 +05:30
Arun Raghavan
71ec9577cf sink: Remove PASSTHROUGH flag
This removes the passthrough flag from sinks since we will drop
exclusively passthrough sinks in favour of providing a list of formats
supported by each sink. We can still determine whether a sink is in
passthrough mode by checking if any non-PCM streams are attached to it.
2011-05-02 11:54:48 +05:30
Arun Raghavan
0ac2cfce6d core: Add extended stream API to support compressed formats
This is the beginning of work to support compressed formats natively in
PulseAudio. This adds a pa_stream_new_extended() that takes a format
structure, sends it to the server (=> protocol extension) and has the
server negotiate with the appropropriate sink to figure out what format
it should use.

This is work in progress, and works only with PCM streams. Actual
compressed format support in some sink needs to be implemented, and
extensive testing is required.

More details on how this is supposed to work is available at:
http://pulseaudio.org/wiki/PassthroughSupport
2011-05-02 11:54:43 +05:30
Arun Raghavan
47e0f91aa2 sink: Extend API for compressed formats support
This adds a get_formats() vfunc for sinks to provide a list of formats
they can support. pa_sink_check_formats() can be used during or after
routing to determine what formats from a stream the sink can support.
2011-05-02 10:17:20 +05:30
Arun Raghavan
c3839c7637 core: Add a pa_format_info structure
This will be used to represent the format of data provided by the client
for both compressed and PCM formats in a new extended API.
2011-05-02 10:17:20 +05:30
Arun Raghavan
f4d1f2bdcf sink: Trivial typo fix 2011-05-02 10:17:20 +05:30
Pierre-Louis Bossart
881074907e sink-input: Don't resample passthrough inputs 2011-05-02 10:17:20 +05:30
Arnaud Fontaine
adb16f9ff4 x11: More XCB fixes.
Commit 65ef80b fixed building with xcb-util >= 0.3.8, but the reply is never
checked (possible SIGSEGV if the reply is NULL) nor freed (memory leak at each
call of the functions).

Also, remove include and dependencies on xcb-atom, as it was only meaningful
for xcb_atom_get() and STRING, and depend instead on xcb >= 1.6 for
XCB_ATOM_STRING.
2011-04-30 14:26:45 +01:00
Antti-Ville Jansson
495c1ed236 core: Drop empty gaps in the memblockq when playing data from it.
It's possible that the memblockq of a sink input is rewound to a negative read
index if the sink input is moved between sinks shortly after its creation. When
this happens, pa_memblockq_peek() returns a memchunk whose 'memblock' field is
NULL and whose 'length' field indicates the length of the gap caused by the
negative read index. This will trigger an assert in play-memblockq.c.

If the memblockq had a silence memchunk, pa_memblockq_peek() would return
silence for the duration of the gap and the assert would be avoided. However,
this approach would prevent the sink input from being drained and is thus not
possible. Instead, we handle the aforementioned situation by dropping the gap
indicated by the 'length' field of the memchunk and by peeking the actual data
that comes after the gap.

This scenario seems to be quite rare in everyday use, but it causes a severe
bug in the handheld world. The assert can be triggered e.g. by loading two null
sinks, playing a sample from the cache to one of them and then moving the
created sink input between the two sinks. The rewinds done by the null sinks
seem to be quite long (I don't know if this is normal behaviour or something
fishy in module-null-sink).

See also:

    6bd34156b1
    virtual-sink: Fix a crash when moving the sink to a new master right after setup.

    https://tango.0pointer.de/pipermail/pulseaudio-discuss/2011-February/009105.html

Reproduce:

This problem can be reproduced with the following script:

SAMPLE_PATH="/usr/share/sounds/alsa/"
SAMPLE="Front_Left"

pactl remove-sample $SAMPLE 2> /dev/null
pactl upload-sample $SAMPLE_PATH$SAMPLE.wav

mod1=`pactl load-module module-null-sink sink_name=null1`
mod2=`pactl load-module module-null-sink sink_name=null2`

pactl play-sample $SAMPLE null1

input=`pactl list | grep "Sink Input #" | tail -n 1 | cut -d# -f2`

echo "Sample $SAMPLE playing as Sink Input #$input"

pactl move-sink-input $input null2
pactl move-sink-input $input null1

pactl unload-module $mod1
pactl unload-module $mod2
2011-04-28 14:05:42 +01:00
Maciej Grela
88e6078f3b x11: Fix build errors with newest xcb-util.
The xcb_atom_get functions were removed from xcb-util. Changed these to
xcb_intern_atom/xcb_intern_atom_reply. Also, STRING is now
XCB_ATOM_STRING.
2011-04-28 09:52:41 +01:00
Tanu Kaskinen
dcab6e1561 protocol-dbus: Fix some memory management bugs.
There were several memory leaks. In addition to those,
pa_dbus_protocol_add_interface() used a string from the
caller as a key to a hashmap, instead of a copy of the
string. This caused trouble when the caller freed the
string while the key was still in use in the hashmap.
2011-04-23 18:23:38 +01:00
Daniel Mack
2411d9accd thread-posix: Use pthread_(get|set)name_np() if available
Newer generations of libpthread have functions to set and get the thread
names. If available, use them.
2011-04-23 18:23:37 +01:00
Daniel Mack
98f2209663 pulsecore:: Define _POSIX_C_SOURCE locally for rtclock on OSX
Defining this macro on a global level is disadvantageous for other APIs,
and as we need it for clock_gettime() only on Mac OS X, define it
locally in pulsecore/core-rtclock.c only.
2011-04-23 18:23:37 +01:00
Lennart Poettering
575ba65714 memblockq: decode unset chunks as NULL chunks again
This fixes asserts beeing hit when see requests are posted via the
native protocol.
2011-04-21 21:05:58 +02:00
Arun Raghavan
0b2457432a volume: Get more data from volume tests
This makes the volume tests run in two loops and print the minimum,
maximum and standard deviation of readings from the inner loop. This
makes it easier to reason out performance drops (i.e. algorithmic
problems vs. other system issues such as processor contention).
2011-04-18 10:31:51 +02:00
Daniel Mack
a44092d39d pa_poll(): Simplify detection of invalid fds in select() emulation mode
For systems which have a fcntl() implementation, we can simplify the
code which determines whether a file selector is valid in pa_poll().

The old code, which is harder to read and more expensive, stays around
for all platforms we need to emulate poll() for using select(), and
which don't provide fcntl(). IOW, for Windows.

On Mac OS X, however, the detection for bad fds via more select() calls
doesn't work, resulting in hung main loops, so the patch fixes a real
bug there.
2011-04-18 10:31:51 +02:00
Tanu Kaskinen
a2581e6688 sink-input: Check flat volume with pa_sink_flat_volume_enabled().
Checking just the flag doesn't work if the sink uses volume sharing, because
such sinks never have PA_SINK_FLAT_VOLUME set.
2011-04-18 10:31:51 +02:00
Tanu Kaskinen
e72e75570c sink-input: Add volume_writable to pa_sink_input.
This is pretty cosmetic change; there's no actual functionality added.
Previously the volume_writable information was available through the
pa_sink_input_is_volume_writable() function, but I find it cleaner to have a
real variable.

The sink input introspection variable name was also changed from
read_only_volume to volume_writable for consistency.
2011-03-29 21:18:06 +01:00
Tanu Kaskinen
77da2c4bcf alsa-mixer: Get rid of a compiler warning.
On 64-bit systems LONG_MAX is greater than the largest possible value of a
uint32_t variable, which caused the compiler to warn about a comparison that is
always false. On 32-bit systems pa_atou() can return a value that will overflow
when assigned to e->volume_limit, which has type long, so the comparison was
necessary.

This dilemma is resolved by using pa_atol() instead of pa_atou().
2011-03-28 09:52:55 +01:00
Colin Guthrie
1e381fbffc dbus: Do not refcnt the core.
We should not call pa_core_ref() anywhere in the code. Doing so
will prevent proper daemon shutdown as the only call (in daemon/main.c)
to pa_core_unref() should always call free_core() and perform a normal
shutdown (i.e. unload all modules gracefully).
2011-03-25 23:43:26 +00:00
Maarten Bosmans
93348331bb Move compile-time checks around pa_run_from_build_tree to core-util
To make the code cleaner and have the checks all in one place.
2011-03-24 09:12:27 +00:00
Colin Guthrie
ae35ec1ed5 Merge remote-tracking branch 'zonique/osx' 2011-03-24 09:08:05 +00:00
Daniel Mack
fc339a608e 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
2011-03-21 00:32:30 +01:00
Maarten Bosmans
7c011e7688 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]
2011-03-20 11:29:25 +00:00
Maarten Bosmans
33a88fbfde 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]
2011-03-20 11:22:28 +00:00
Colin Guthrie
d7ce59de88 Merge remote-tracking branch 'mkbosmans/mingw32-build' 2011-03-20 11:18:19 +00:00
Maarten Bosmans
b599d3c836 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.
2011-03-19 13:41:05 +01:00
Maarten Bosmans
c470680e1b Use pulsecore/arpa-inet.h to make arpa/inet.h functionality available
Automatically use replacement function on platforms (win32) where not all arpa/inet.h is available natively.
2011-03-19 13:41:05 +01:00
Maarten Bosmans
eb833da570 Find modules and config files relative to the installed libraries.
Do not use replace %PULSE_ROOT% from the environment.
2011-03-19 13:38:37 +01:00
Vincent Becker
f7acd4bdab log: Add a new log target to a file descriptor
This patch enables logging of text debug messages (pa_log feature) into a file or a device driver.
Example : pulseaudio --log-target=file:./mylog.txt

(Minor tweaks by Colin + Arun)
2011-03-18 12:32:51 +00:00
Maarten Bosmans
1afd233630 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)
                                                               ~~~~~~~~~~~~^~~~~~~
2011-03-18 09:22:07 +00:00
Maarten Bosmans
684b89c639 Fix up some double spaces 2011-03-18 09:20:07 +00:00
Maarten Bosmans
b3721a12c5 Fixup #include directives according to Coding Style
Use #include "header.h" if functionality of header.h is implemented
and #include <header.h> if functionality of header.h is used.
2011-03-11 11:49:39 +00:00
Maarten Bosmans
ecf09f2cd6 Fix up according to Coding Style
Only whitespace changes in here
2011-03-11 11:49:35 +00:00
Arun Raghavan
4cd90d9e32 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.
2011-03-05 14:38:28 +05:30
Arun Raghavan
516dd169b4 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).
2011-03-05 13:18:01 +05:30
Arun Raghavan
50448e1130 volume: Make tests use only valid volumes 2011-03-05 13:18:01 +05:30
Maarten Bosmans
9cbf19b59b Various fixes for build warnings 2011-03-02 15:02:42 +00:00
Maarten Bosmans
53695b83dc Get rid of some unused-function compiler warnings 2011-03-02 14:52:46 +00:00