| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
| |
The old code tried to recover, but what's the point of that? If a
directory is duplicate, something is wrong with the database file.
|
| |
|
|
|
|
| |
It's legal to pass decoder=NULL to decoder_read(). Add a check.
|
|
|
|
|
| |
Allocate a decoder_control object where needed, and pass it around.
This will allow more than one decoder thread one day.
|
|\
| |
| |
| |
| |
| |
| |
| | |
Conflicts:
NEWS
configure.ac
src/decoder/ffmpeg_plugin.c
src/update.c
|
| | |
|
| |
| |
| |
| |
| |
| | |
Convert the metadata with the libavformat function av_metadata_conv().
This ensures that canonical tag names are provided by libavformat, and
we can remove the "artist" vs "author" workaround.
|
| |
| |
| |
| |
| |
| | |
When you disable the "follow_outside_symlinks" or the
"follow_inside_symlinks" setting, the next update should remove the
now-ignored files from the database.
|
| |
| |
| |
| |
| | |
Basically the same as the 0.15.5 patch "check again if output is open
on CANCEL". Same race condition, same fix.
|
| | |
|
| |
| |
| |
| | |
Simply use "return" instead of g_thread_exit().
|
| |
| |
| |
| |
| | |
When the songs of two albums are in the same directory, all songs of
an album should be right next to each others.
|
| |
| |
| |
| |
| | |
Moved some code to tag_get_value_checked(), to eliminate several NULL
checks.
|
| |
| |
| |
| |
| |
| | |
Use GMutex/GCond instead of the notify library. Manually lock the
player_control object before accessing the protected attributes. Use
the GCond object to notify the player thread and the main thread.
|
| |
| |
| |
| |
| |
| |
| |
| | |
Right after seeking and song change, the elapsed_time shows old
information, because the output thread didn't finish a full chunk
yet. This patch re-adds a second elapsed_time variable, and keeps
track of a fallback value, in case the output thread can't provide a
reliable value.
|
| |
| |
| |
| |
| |
| | |
Return false when there was no chunk in the pipe. If the function
returns true, then audio_output_task() will not wait for a notify from
the player thread. This fixes a race condition.
|
| |
| |
| |
| |
| |
| | |
Don't set the error in play_chunk(); do all the error handling in the
caller. The errored_song attribute isn't set anymore; it doesn't make
sense for PLAYER_ERROR_AUDIO.
|
| |
| |
| |
| | |
Call a version of audio_output_close() which doesn't lock recursively.
|
| | |
|
| |
| |
| |
| |
| | |
Always keep the audio_output object locked within the output thread,
unless a plugin method is called. This fixes several race conditions.
|
| |
| |
| |
| |
| |
| |
| | |
drain() is the opposite of cancel(): it waits until all data in the
buffer has finished playing. Instead of implicitly draining in the
close() method like the ALSA plugin has been doing it forever, let the
output thread decide whether to drain or to cancel.
|
| |
| |
| |
| |
| |
| | |
The recovery is for nothing if we get CLOSE afterwards. Let's not
recover in the cancel() method, and let the next play() call sort it
out.
|
| |
| |
| |
| | |
Don't call filter_close() right after ao_close().
|
| |
| |
| |
| | |
This variable was uninitialized and led to crashes.
|
| |
| |
| |
| |
| | |
libavformat gives us the song artist in the "author" field. Since we
use av_metadata_conv(), we don't need to check for "artist".
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
| |
| |
| | |
Don't connect to JACK before MPD has daemonized.
|
| |
| |
| |
| | |
Don't connect to PulseAudio before MPD has daemonized.
|
| |
| |
| |
| |
| |
| |
| | |
With these methods, an output plugin can allocate some global
resources only if it is actually enabled. The method enable() is
called after daemonization, which allows for more sophisticated
resource allocation during that method.
|
| |
| |
| |
| |
| |
| | |
Don't let the mixer plugin "override" the libpulse callbacks.
Instead, add a "mixer" attribute to the pulse_output struct, and call
the mixer on all interesting events.
|
| |
| |
| |
| |
| | |
A mixer is useful enough if it can be read. Setting it may be
found unavailable at runtime.
|
| |
| |
| |
| |
| |
| | |
If the method get_volume() returns -1 and no error object is set, then
the volume is currently unavailable, but the mixer should not be
closed immediately.
|
| |
| |
| |
| |
| | |
It's possible to have a mixer implementation which does not explicitly
need the methods open() and close().
|
| |
| |
| |
| | |
Moved the check from pulse_mixer_open() to pulse_mixer_update().
|
| | |
|
| |
| |
| |
| | |
Don't clutter the top directory with *.o files.
|
| |
| |
| |
| | |
There's no point in clearing the audio format before exiting.
|
| |
| |
| |
| |
| | |
This way, the function call in the main() function does not need
another pair of #ifdef/#endif.
|
| | |
|
| |
| |
| |
| | |
Based on the XSPF playlist plugin.
|
| |
| |
| |
| | |
Added a missing "break".
|
| |
| |
| |
| |
| |
| | |
An asterisk means that this attribute should not be enforced, and
stays whatever it used to be. This way, some configuration values
work like masks.
|
| | |
|
| |
| |
| |
| | |
This allows more sophisticated audio format selection.
|
| |
| |
| |
| | |
It's a double pointer.
|
| |
| |
| |
| | |
The value is always non-NULL.
|