| Commit message (Collapse) | Author | Files | Lines |
|
|
|
|
|
These are confusing, and since MixRamp development has ceased, not
useful to anybody.
|
|
Fixes crash.
|
|
|
|
|
|
|
|
|
|
Don't read song.start_ms and song.end_ms, let the player thread manage
this logic instead.
|
|
When playing a CUE track, the player thread waited for the decoder to
become ready, and then sent a SEEK command to the beginning of the CUE
track. If that is near the start of the song file, and the track is
short enough, the decoder could have finished decoding already at that
point, and seeking fails.
This commit makes this initial seek more robust: instead of letting
the player thread deal with the difficult timings, let the decoder API
emulate a SEEK command, and return it to the decoder plugin, as soon
as the plugin finishes its initialization.
|
|
Add GMutex, GCond attributes which will be used by callers to
conditionally wait on the stream.
Remove the (now-useless) plugin method buffer(), wait on GCond
instead. Lock the input_stream before each method call. Do the same
with the playlist plugins.
|
|
|
|
Don't finish the current command twice.
This bug was never noticed, but was revealed by a new assertion check.
|
|
Remove the decoder dependency on player_control. All player_control
was needed for is to signal the player thread, and we can do that with
a simple GCond as well.
|
|
|
|
Allocate a player_control object where needed, and pass it around.
Each "client" object is associated with a "player_control" instance.
This prepares multi-player support.
|
|
|
|
Replaced all occurrences of g_error() with MPD_ERROR() located in a new header
file 'mpd_error.h'. This macro uses g_critical() to print the error message
and then exits gracefully in contrast to g_error() which would internally call
abort() to produce a core dump.
The macro name is distinctive and allows to find all places with dubious error
handling. The long-term goal is to get rid of MPD_ERROR() altogether. To
facilitate the eventual removal of this macro it was added in a new header
file rather than to an existing header file.
This fixes #2995 and #3007.
|
|
|
|
Adds mixrampdb and mixrampdelay commands. Reads MIXRAP_START and
MIXRAMP_END tags from FLAC files and overlaps instead of crossfading.
|
|
Apply the replay gain in the output thread. This means a new setting
will be active instantly, without going through the whole music pipe.
And we might have different replay gain settings for each audio output
device.
|
|
When all plugins have failed, MPD used to fall back to the "mad"
decoder plugin, to handle those radio streams without a Content-Type
response header. This however leads to unexpected results (garbage
being played) when the stream isn't really mp3. Since we care little
about "bad" streams, we shouldn't have hacks which have bad side
effects.
Let's get rid of this hack now! Only try to "mad" plugin if there was
no match at all (Content-Type, path suffix) and no other plugin has
been tried.
|
|
Manage a linked list of plugins which were already tried.
|
|
The patch "input/file: don't fall back to parent directory" introduced
a regression: when trying to play a CUE track, decoder_run_song()
tries to open the file as a stream first, but this fails, because the
path is virtual.
This patch fixes decoder_run_song() (instead of reverting the previous
patch) to accept input_stream_open() failures if the song is a local
file. It passes the responsibility to handle non-existing files to
the decoder's file_decode() method.
|
|
|
|
|
|
The replay_gain_state struct holds the precalculated scale factor,
which is removed from struct replay_gain_info.
|
|
This function replaces the replay_gain_info parameter for
decoder_data(). This allows the decoder to announce replay gain
changes, instead of having to pass the same object over and over.
|
|
Major API redesign: don't let the caller allocate the input_stream
object. Let each input plugin allocate its own (derived/extended)
input_stream pointer. The "data" attribute can now be removed, and
all input plugins simply cast the input_stream pointer to their own
structure (with an "struct input_stream base" as the first attribute).
|
|
|
|
Remove the data_time parameter from decoder_data(). This patch
eliminates the timestamp counting in most decoder plugins, because the
MPD core will do it automatically by default.
|
|
|
|
After we've been hit by Large File Support problems several times in
the past week (which only occur on 32 bit platforms, which I don't
have), this is yet another attempt to fix the issue.
|
|
An input_stream_close() call was missing after today's code
reorganization.
|
|
Before calling the plugin's decode method, we should ensure that we
didn't receive a STOP command during initialization.
|
|
This function opens the stream and waits for it to become ready;
meanwhile it checks for STOP commands. It is code moved from
decoder_run_stream().
|
|
Simplify the expressions.
|
|
Remove the static integer hack, that's not thread safe and sucks.
|
|
Moved the global input stream opener to decoder_run_stream().
decoder_run_file() now opens the input stream each time a plugin
provides a stream decoder method.
|
|
Tame the large decoder_run_song() function.
|
|
If left uninitialized, then the decoder thread quits spuriously.
|
|
These two variables are redundant, we need only one of them.
|
|
This is only a slight change to the previous locking behaviour: keep
the decoder unlocked during the loop, and lock it only while checking
decoder_control.command.
|
|
Return the result to the caller more quickly. This unifies error
handling: no error can be reported before the command is finished.
|
|
They are just informational.
|
|
Allocate a decoder_control object where needed, and pass it around.
This will allow more than one decoder thread one day.
|
|
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.
|
|
Try to be as portable as possible, use GLib path name functions and
macros.
|
|
The while() clause resets the "plugin" variable. We don't need to
reset it at the end of the loop body.
|
|
When there is no Content-Type response header, try the "mad" decoder
plugin. It uesd to be named "mp3", and we forgot to change the
fallback name in decoder_thread.c.
|