Commit graph

157 commits

Author SHA1 Message Date
David Henningsson
b7fab75fdd sink-input/source-output: Prevent filter sink/source cycles
Misbehaving clients can try to set a filter sink to output to
itself, leading to crashes later on. This patch protects us from that.

Thanks to Roman Beslik for testing and finding an error in the first
version of this patch.

Tested-by: Roman Beslik <rabeslik@gmail.com>
BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=44397
Signed-off-by: David Henningsson <david.henningsson@canonical.com>
2012-03-28 13:19:47 +02:00
Arun Raghavan
a0706e7c84 format: Allow format->sample spec conversion for compressed formats
This allows clients to get a "fake" sample space for compressed formats
that we can support. This should make size/time conversion for things
like calculating buffer attributes simpler.
2012-03-05 20:30:33 +05:30
Arun Raghavan
c60f698f1e format: Expose pa_format_info<->pa_sample_spec conversion functions
These utility functions could be handy to clients.
pa_format_info_to_sample_spec_fake() isn't made public, but the return
value is changed to keep in sync with pa_format_info_to_sample_spec().
2012-03-05 20:00:31 +05:30
Arun Raghavan
0521db6cf7 sink-input,source-output: Handle devices going away in unlink hooks
If a *_UNLINK_POST hook causes a sink-input/source-output's sink/source
to go away, the subsequent attempt to update the sink/source status will
cause an assert. We deal with this by checking the sink/source status
before trying to update it.
2012-02-09 16:55:48 +05:30
Peter Meerwald
e33aeaa7fb core: fix typo in logging 2011-12-20 10:22:01 +05:30
Peter Meerwald
638b0264e0 core: sample_spec.rate is in Hz, not kHz; change logging output 2011-12-20 10:21:39 +05:30
Arun Raghavan
efbfe5fecb core: Make debugging a bit simpler
This takes out a bunch of commented debug prints and puts them in
defines. Makes it easier to turn them all on/off at a single point.
2011-11-10 12:43:09 +05:30
Arun Raghavan
a813e85503 sink,source: Update sample rate if possible on stream uncork
If a stream is being uncorked and no other stream is running, we try to
update the sink/source sample rate to match it and avoid resampling.
2011-11-07 15:38:31 +05:30
Arun Raghavan
8616f82a67 sink-input,source-output: Add an update_rate() function
This factors out the resampler updating code from finish_move() and
makes a separate function for use from other points.
2011-11-07 15:38:30 +05:30
Pierre-Louis Bossart
f0ec495938 sink,source: support for rate update
Avoid resampling or use integer resampling when supported by the
sinks/sources

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
2011-10-17 20:09:46 +05:30
Tanu Kaskinen
666261ece8 memblockq: Improve debuggability by storing a name and a sample spec.
These are not used for anything at this point, but this
makes it easy to add ad-hoc debug prints that show the
memblockq name and to convert between bytes and usecs.
2011-10-01 13:25:16 +01:00
Arun Raghavan
cae3235369 sink,source: Handle missing in the shared volume case
This makes sure that when we're traversing the device chain for sources
and sinks with shared volume, we handle the case that a sink-input or
source-output of one of these might be unlinked (while unloading a
module, for example).
2011-09-21 23:00:02 +05:30
Arun Raghavan
0dea35a818 sink-input: Ensure no volumes are applied for passthrough streams
This forces passthrough sink-inputs and their corresponding sinks to 0dB
gain so that the data is sent unaltered to the receiver.
2011-08-18 12:46:46 +05:30
Arun Raghavan
b08237b6c6 passthrough: We must not plug in a resampler on stream move 2011-08-18 12:45:58 +05:30
Arun Raghavan
358d92170a formats: Fix bad passsthrough check
Fixes breakage from commit adbdb6259b
2011-08-18 10:10:22 +05:30
Arun Raghavan
adbdb6259b formats: Use correct API to check for passthrough streams 2011-08-17 23:08:37 +05:30
Wang Xingchao
2f55da5baa sink-input: Avoid fake rewind in corked state
sink_input_request_rewind() does nothing if we are in the corked state.
Thus do not set the new state untill we have issued the rewind request.
2011-08-15 09:41:55 +01:00
Colin Guthrie
a8f20e8d95 sink-input: Drop redundant assert (PA_SINK_INPUT_IS_LINKED() checked already) 2011-08-12 20:31:52 +02:00
Maarten Bosmans
dd9265ac78 Remove unnecessary #includes 2011-06-22 23:12:20 +01:00
Colin Guthrie
ec4fa4c668 esound,streams: Fix some crashes.
After the rework to the add pa_sink_input_new_data_set_sink() (and
the source equiv) calling with a NULL sink object will hit an assert.

This caused crashes with the esd protocol and there was the potential
(albeit unlikely) for a crash when creating a sink input without any
sinks available (module-always-sink mitigates this risk but it's still
a potential crasher).
2011-06-22 22:45:28 +01:00
Colin Guthrie
dc6c272625 alsa-sink: Some trivial tidyups
Mostly typo fixes but also a change to make a function relating
to sink inputs use more generic variable names.
2011-06-22 21:53:19 +01:00
Colin Guthrie
51d53016f3 streams: Fix the actual resampler method shown in debug messages. 2011-06-02 11:44:21 +02:00
Arun Raghavan
117c714594 format: Fix channel map handling
Channel map handling in the extended API was broken. Thanks for Milos_SD
for pointing this out on IRC.
2011-05-20 19:21:02 +05:30
Colin Guthrie
e59fc6c6bc sink-input: Fix memory leak of proplist when sending format-changed events 2011-05-16 09:59:19 +01:00
Arun Raghavan
62f56a9f6b sink-input: Provide more information to client when format is lost
When the sink format changes and we kill the stream, clients need a way
to know (a) what device they should reconnect to, and (b) what the
stream running time was when the stream got killed (pa_stream_get_time()
won't work after the stream has been killed). This adds these two bits
of information in the event callback's proplist parameter.
2011-05-15 10:09:35 +05:30
Arun Raghavan
53091cc5f0 sink-input: Add a format-lost event
This event is emitted if the sink-input could not be moved to a new sink
because it doesn't support the format of the sink-input. Clients can
reconnect their stream with a different format if they wish or
gracefully exit.
2011-05-15 10:09:34 +05:30
Arun Raghavan
cb3dcb14f8 sink-input: Don't restore volume for passthrough streams 2011-05-15 10:09:34 +05:30
Arun Raghavan
a199bfb765 sink-input: Don't print an error if a passthrough connection fails
The assertion message is misleading, since the passthrough connection
can fail for reasons the client has no control over (like other sink
inputs being connected).
2011-05-15 10:09:06 +05:30
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
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
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
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
Pierre-Louis Bossart
881074907e sink-input: Don't resample passthrough inputs 2011-05-02 10:17:20 +05:30
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
Maarten Bosmans
684b89c639 Fix up some double spaces 2011-03-18 09:20:07 +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
8401572fd5 Revert "Add volume ramping feature - sink-input modification"
This reverts commit 5318eb35ef.

Conflicts:

	src/pulsecore/sink-input.c

(part of a patch series removing all ramping code)
2011-02-28 17:13:13 +05:30
Arun Raghavan
4cf12b91a4 Revert "ramping: minor cleanups"
This reverts commit f202af17b7.

(part of a patch series removing all ramping code)
2011-02-28 17:11:31 +05:30
Arun Raghavan
8745eccb45 Revert "core: volume ramping fix"
This reverts commit aa9348441d.

(part of a patch series removing all ramping code)
2011-02-28 17:11:31 +05:30
Tanu Kaskinen
c9c88fb8dc Implement the "volume sharing" feature.
When we have a filter sink that does some processing, currently the
benefits of the flat volume feature are not really available. That's
because if you have a music player that is connected to the filter sink,
the hardware sink doesn't have any idea of the music player's stream
volume.

This problem is solved by this "volume sharing" feature. The volume
sharing feature works so that the filter sinks that want to avoid the
previously described problem declare that they don't want to have
independent volume, but they follow the master sink volume instead.
The PA_SINK_SHARE_VOLUME_WITH_MASTER sink flag is used for that
declaration. Then the volume logic is changed so that the hardware
sink calculates its real volume using also the streams connected to the
filter sink in addition to the streams that are connected directly to
the hardware sink. Basically we're trying to create an illusion that
from volume point of view all streams are connected directly to the
hardware sink.

For that illusion to work, the volumes of the filter sinks and their
virtual streams have to be managed carefully according to a set of
rules:

If a filter sink follows the hardware sink volume, then the filter sink's
 * reference_volume always equals the hw sink's reference_volume
 * real_volume always equals the hw sink's real_volume
 * soft_volume is always 0dB (ie. no soft volume)

If a filter sink doesn't follow the hardware sink volume, then the filter
sink's
 * reference_volume can be whatever (completely independent from the hw sink)
 * real_volume always equals reference_volume
 * soft_volume always equals real_volume (and reference_volume)

If a filter sink follows the hardware sink volume, and the hardware sink
supports flat volume, then the filter sink's virtual stream's
 * volume always equals the hw sink's real_volume
 * reference_ratio is calculated normally from the stream volume and the hw
   sink's reference_volume
 * real_ratio always equals 0dB (follows from the first point)
 * soft_volume always equals volume_factor (follows from the previous point)

If a filter sink follows the hardware sink volume, and the hardware sink
doesn't support flat volume, then the filter sink's virtual stream's
 * volume is always 0dB
 * reference_ratio is always 0dB
 * real_ratio is always 0dB
 * soft_volume always equals volume_factor

If a filter sink doesn't follow the hardware sink volume, then the filter
sink's virtual stream is handled as a regular stream.

Since the volumes of the virtual streams are controlled by a set of rules,
the user is not allowed to change the virtual streams' volumes. It would
probably also make sense to forbid changing the filter sinks' volume, but
that's not strictly necessary, and currently changing a filter sink's volume
changes actually the hardware sink's volume, and from there it propagates to
all filter sinks ("funny" effects are expected when adjusting a single
channel in cases where all sinks don't have the same channel maps).

This patch is based on the work of Marc-André Lureau, who did the
initial implementation for Pulseaudio 0.9.15.
2011-02-26 10:37:20 +00:00
Tanu Kaskinen
99ddca89cd Allow read-only or non-existing sink input volume.
There are two known cases where read-only or non-existing sink input volume is
relevant: passthrough streams and the planned volume sharing logic.
Passthrough streams don't have volume at all, and the volume sharing logic
requires read-only sink input volume. This commit is primarily working towards
the volume sharing feature, but support for non-existing sink input volume is
also added, because it is so closely related to read-only volume.

Some unrelated refactoring in iface-stream.c creeped into this commit too (new
function: stream_to_string()).
2011-02-22 20:12:31 +00:00
Tanu Kaskinen
969c7c80fe core: Link virtual sinks and sources to their streams.
This change doesn't add any functionality in itself, but it will be useful in
the future for operating on chains of sinks or sources that are piggy-backing
on each other.

For example, the PA_PROP_DEVICE_MASTER_DEVICE property could
be handled in the core so that each virtual device doesn't have to maintain it
separately. By using the origin_sink and destination_source pointers the core
is able to see at stream creation time that the stream is created by a virtual
device, and then update that device's property list using the name of the
master device that the stream is being connected to. The same thing can be done
also when the stream is being moved from a device to another, in which case the
_MASTER_DEVICE property needs updating.
2011-02-22 10:10:48 +00:00
Colin Guthrie
340729d66f log: Totally trivial spelling 'correction' (for en-US) 2010-10-17 21:05:39 +01:00
Colin Guthrie
3de129f3ac introspect: Include whether a stream is corked in the info callback. 2010-10-06 09:17:01 +01:00