| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
| |
|
|
|
|
|
|
|
| |
This mixer plugin may be used instead of the traditional global
software mixer. It integrates with the "volume" filter plugin, and
can control the software volume of an audio output which has no
hardware mixer.
|
|
|
|
|
| |
strcasecmp() is locale dependent, making it a bad choice for internal
string comparisons.
|
|
|
|
| |
This allows you to select controls with duplicate names.
|
|
|
|
|
|
| |
Using two different kinds of locks may result in a race condition with
a deadlock. The libpulse callbacks need no locks at all, because the
mainloop object can be assumed to be already locked.
|
|
|
|
|
|
|
|
| |
snd_config_update_free_global() frees cached ALSA configuration. This
keeps valgrind a little bit more quiet. This patch moves the call
from the open() method into the finish() method, which seems more
natural: it allows the use of the config cache, and improves the
cleanup phase.
|
|
|
|
|
| |
Added an assertion in mixer_set_volume(). Removed the range checks
from the ALSA and OSS plugins.
|
|
|
|
|
|
| |
There are numerous race conditions between the libpulse thread
(pulse_mixer.c callbacks) and the rest of MPD. Protect the volatile
attributes of the pulse_mixer struct with a mutex to fix that.
|
|
|
|
|
| |
Eliminate one indent level. Also remove several debug useless debug
messages.
|
|
|
|
| |
Those parameters are used after all.
|
|
|
|
|
|
| |
Don't mess with pulse_mixer.volume for setting the volume. This
variable should only be used to transfer the current volume from
sink_input_vol() to pulse_mixer_get_volume().
|
|
|
|
|
|
|
|
|
|
| |
The pa_context_get_sink_input_info() function is asynchronous, and
after it returns, libpulse does not guarantee that the operation has
completed yet; in fact, it is not likely. Explicitly wait for the
operation to complete.
The code for the new pulse_wait_for_operation() function was inspired
by mplayer and xine code.
|
|
|
|
| |
Use the same code style as the rest of MPD.
|
|
|
|
|
|
| |
Don't initialize attributes which are only used in an open mixer. As
long as nobody accesses them, their values are uninitialized and
undefined.
|
|
|
|
|
|
|
| |
The pm->volume attribute was allocated in pulse_mixer_init(), but is
never freed. This leaks memory. Instead of adding the g_free() call
to pulse_mixer_finish(), let's just make "volume" a static attribute
of the pulse_mixer struct. That is easier to deal with.
|
|
|
|
|
| |
When the MPD core knows that the pulse mixer is open, pm->mainloop and
pm->context must be non-NULL.
|
|
|
|
|
| |
The attributes "online" and "index" were not properly reinitialized
after a close/open cycle.
|
|
|
|
|
|
| |
Nobody needs to modify these strings. We can make them const, and
convert config_dup_block_string() to config_get_block_string(). This
also fixes memory leaks in the pulse mixer.
|
|
|
|
|
| |
The conf.h functions deal well with config_param==NULL and will return
the specified default value then.
|
|
|
|
|
| |
When the mixer initialization fails, we have to free the libpulse
objects we have already created, to prevent resource leaks.
|
|
|
|
|
| |
It's illegal to return from pulse_mixer_setup() without unlocking the
main loop. In the error handling, that unlock() call was missing.
|
|
|
|
| |
Prepare for adding proper error handling.
|
|
|
|
|
|
| |
"volume_set" is an attribute which becomes undefined when the mixer is
closed. That means, it must be initialized each time the mixer is
opened.
|
|
|
|
|
|
| |
The MPD core guarantees that methods are always invoked in a
consistent state. This means we can remove lots of checks from the
volume methods.
|
|
|
|
|
| |
Instead of replacing NULL with the default device in the open()
method, pass the default device to config_get_block_string().
|
|
|
|
| |
Use config_get_block_string() instead of config_dup_block_string().
|
|
|
|
| |
Detect misconfiguration during MPD startup.
|
|
|
|
|
|
| |
The MPD core guarantees that methods are always invoked in a
consistent state. This means we can remove lots of checks from the
volume methods.
|
|
|
|
| |
strncasecmp() is locale dependent, but we only need ASCII here.
|
|
|
|
|
| |
Instead of replacing NULL with the default path in the open() method,
pass the default path to config_get_block_string().
|
|
|
|
| |
Use config_get_block_string() instead of config_dup_block_string().
|
|
|
|
|
| |
When getting or setting the volume fails, the MPD core close the
mixer. Moved the duplicated code from the mixer plugins.
|
|
|
|
|
|
|
|
|
|
|
|
| |
Remember if a mixer object is open or closed. Don't call open() again
if it is already open. This guarantees that the mixer plugin is
always called in a consistent state, and we will be able to remove
lots of checks from the implementations.
To support mixers which are automatically opened even if the audio
output is still closed (to set the volume before playback starts),
this patch also adds the "global" flag to the mixer_plugin struct.
Both ALSA and OSS set this flag, while PULSE does not.
|
|
|
|
|
|
| |
The mixer state is defined as offline only if the associated stream is removed.
Signed-off-by: David Guibert <david.guibert@gmail.com>
|
|
|
|
|
|
|
|
|
| |
when the mixer is closed,
- the mainloop is stopped.
- the context is disconnected.
- then the mainloop is freed.
Signed-off-by: David Guibert <david.guibert@gmail.com>
|
|
|
|
|
|
|
|
| |
This updates the copyright header to all be the same, which is
pretty much an update of where to mail request for a copy of the GPL
and the years of the MPD project. This also puts all committers under
'The Music Player Project' umbrella. These entries should go
individually in the AUTHORS file, for consistancy.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This patch follows the commit 21bb10f4b.
>From Max Kellermann:
> I removed the daemonization changes in main.c. Please explain why you
> changed that. If you need it for some reason, make that a separate
> patch with a good description of your rationale.
> That's the biggest flaw of your code: it opens the mixer device in the
> init() method, while the open() method is empty. When the pulse
> daemon is not available (either during MPD startup or when it dies
> while MPD runs), the plugin will not even attempt to reconnect to
> pulse. Please move the code to the open() method, to make that work.
I changed the daemonize call as the fork losts the connection to the
pulse server. According to your remark, the init() method should be
moved to the open() ones.
With the modification, mpd is able to reconnect the pulse mixer after
restarting the pulseaudio daemon.
Signed-off-by: David Guibert <david.guibert@gmail.com>
Signed-off-by: Max Kellermann <max@duempel.org>
|
| |
|
|
|
|
| |
Shorten some log messages, let GLib add the "pulse_mixer" prefix.
|
|
|
|
|
| |
Don't include output_api.h - this is not an output plugin. Added
missing explicit conf.h and string.h includes.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This patch introduces the mixer for the pulse output.
Technically speaking, the pulse index is needed to get or set
the volume. You must define callback fonctions to get this index since
the pulse output in mpd is done using the simpe api. The pulse simple api
does not provide the index of the newly defined output.
So callback fonctions are associated to the pulse context.
The list of all the sink input is then retreived.
Then we select the name of the mpd pulse output and control
its volume by its associated index number.
Signed-off-by: Patrice Linel <patnathanael@gmail.com>
Signed-off-by: David Guibert <david.guibert@gmail.com>
[mk: fixed whitespace errors and broke long lines; removed
daemonization changes from main.c]
|
|
|
|
|
| |
The method control() is too complicated, and overengineered. Replace
it with two trivial functions: get_volume() and set_volume().
|
|
|
|
|
| |
The mixer plugins should re-use the mixer struct and incorporate it in
their object class.
|
|
|
|
|
|
|
| |
Both methods are always called together. There is no point in having
them separate. This simplifies the code, because the old configure()
method could be called more than once, and had to free old
allocations.
|
|
|
|
| |
Those have been superseded by the new legacy configuration code.
|
|
|
|
| |
The plugin structures must never be modified.
|
| |
|
|
|
|
|
|
|
|
| |
Return the default value in the conf_get_block_*() functions when
param==NULL was passed.
This simplifies a lot of code, because all initialization can be done
in one code path, regardless whether configuration is present.
|
|
|
|
|
| |
All config_get_block_*() functions should accept constant config_param
pointers.
|