- 05 Nov, 2010 4 commits
-
-
Max Kellermann authored
When one song is played twice, and the decoder is working on the second "instance", but the first should be seeked, the check in player_seek_decoder() may assume that it can reuse the decoder without exchanging pipes. The last thing was the mistake: the pipe pointer was different, which led to an assertion failure. This patch adds another check which exchanges the player pipe.
-
Max Kellermann authored
More abstraction for decoder_control.pipe.
-
Max Kellermann authored
Some abstraction for decoder_control.pipe access.
-
Max Kellermann authored
-
- 25 Sep, 2010 1 commit
-
-
Thomas Jansen authored
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.
-
- 08 May, 2010 1 commit
-
-
Tim Phipps authored
-
- 02 May, 2010 1 commit
-
-
Max Kellermann authored
Remove cross_fade_apply(), and call pcm_mix() in the output thread, mixing the chunk and chunk->other together.
-
- 21 Mar, 2010 1 commit
-
-
Tim Phipps authored
Adds mixrampdb and mixrampdelay commands. Reads MIXRAP_START and MIXRAMP_END tags from FLAC files and overlaps instead of crossfading.
-
- 17 Mar, 2010 1 commit
-
-
Max Kellermann authored
Previously, tags of the new song being cross-faded in were sent immediately. That can cause wrong information being displayed, because the "previous" song might send its tag at the end again, overriding the "next" song's tag. This patch saves & merges the tag of the next song, and sends it when cross-fading is finished, and the next song really starts.
-
- 10 Mar, 2010 1 commit
-
-
Max Kellermann authored
Did you ever accidently click "stop" while feeding a radio station? This option sets the output device to "pause" to disable the "close" method. It falls back to "pause" then, which is specific to the plugin. Some plugins implement it by feeding silence.
-
- 02 Jan, 2010 1 commit
-
-
Max Kellermann authored
Another quirk fixed: after the last chunk of a song has been played, the "elapsed_time" variable is set to the chunk's time stamp. When the client receives the PLAYER idle event and asks MPD for the current time stamp, MPD will return the last time stamp of the previous song when it hasn't played the first chunk of the current song yet.
-
- 01 Jan, 2010 1 commit
-
-
Avuton Olrich authored
-
- 27 Dec, 2009 1 commit
-
-
Max Kellermann authored
Seek the decoder to the start of the range before beginning with playback. Stop the decoder when the end of the range has been reached. Add the start position to the seek position. Expose the duration of the range, not the full song file.
-
- 26 Dec, 2009 1 commit
-
-
Max Kellermann authored
-
- 14 Dec, 2009 1 commit
-
-
Max Kellermann authored
-
- 13 Nov, 2009 1 commit
-
-
Max Kellermann authored
At this point, the function may be called from the SEEK handler.
-
- 12 Nov, 2009 2 commits
-
-
Max Kellermann authored
When waiting for the decoder to provide more data, the player thread generates silence chunks if needed. However, it forgot to initialize the chunk.times attribute, which had now an undefined value. This patch sets it to -1.0, meaning "value is undefined". Add a ">= 0.0" check to audio_output_all_check(). This fixes spurious relative seeking errors, because sometimes, the "elapsed" value falls back to 0.0.
-
Max Kellermann authored
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.
-
- 09 Nov, 2009 1 commit
-
-
Max Kellermann authored
When there's no queued song, and the current one has finished playing, first make sure that the hardware outputs have really finished playing the last chunk: call the drain() method in all audio outputs. Without this patch, MPD stopped playback shortly before the ALSA sound card had finished playing.
-
- 03 Nov, 2009 10 commits
-
-
Max Kellermann authored
If no song was queued, then player_control.next_song might contain the value for the next QUEUE command. We must not reset that.
-
Max Kellermann authored
When the decoder finishes the "queued" song very quickly (before the "current" song finishes playing), an assertion in do_play() fails because it thinks that it should start decoding the queued song, although that has in fact just finished.
-
Max Kellermann authored
Simplify several expressions.
-
Max Kellermann authored
Don't access attributes without the lock.
-
Max Kellermann authored
Don't access decoder_control attributes directly.
-
Max Kellermann authored
Lock the player_control object when modifying its attributes.
-
Max Kellermann authored
-
Max Kellermann authored
These two variables are redundant, we need only one of them.
-
Max Kellermann authored
It's not used if pc.error==PLAYER_ERROR_AUDIO.
-
Max Kellermann authored
The START command returns without blocking; we don't need the asynchronous decoder start anymore.
-
- 02 Nov, 2009 1 commit
-
-
Max Kellermann authored
While paused, the player thread re-locks its mutex and waits for a signal. This is racy: when the command is set while the thread is waiting for the lock, it may wait forever. This patch adds another command check before player_wait().
-
- 31 Oct, 2009 3 commits
-
-
Max Kellermann authored
Allocate a decoder_control object where needed, and pass it around. This will allow more than one decoder thread one day.
-
Max Kellermann authored
Simply use "return" instead of g_thread_exit().
-
Max Kellermann authored
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.
-
- 30 Oct, 2009 1 commit
-
-
Max Kellermann authored
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.
-
- 29 Oct, 2009 1 commit
-
-
Max Kellermann authored
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.
-
- 23 Oct, 2009 1 commit
-
-
Max Kellermann authored
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.
-
- 15 Oct, 2009 1 commit
-
-
Max Kellermann authored
When the audio output fails to open, MPD pauses playback, but doesn't reset player.play_audio_format. This leads to an assertion failure in audio_output_all_check() on the next REFRESH command, because no audio output is open.
-
- 13 Oct, 2009 1 commit
-
-
Max Kellermann authored
-
- 08 Oct, 2009 2 commits
-
-
Max Kellermann authored
Tracking the "elapsed" time from the chunks which we have sent to the output pipe is very imprecise: since we have implemented the music pipe, we're sending large number of chunks at once, giving the "elapsed" time stamp a resolution of usually more than a second. This patch changes the source of this information to the outputs. If a chunk has been played by all outputs, the "elapsed" time stamp is updated. The new command PLAYER_COMMAND_REFRESH makes the player thread update its status information: it tells the outputs to update the chunk time stamp. After that, player_control.elapsed_time is current.
-
Max Kellermann authored
pc.next_song might be non-NULL even if player.queued==true: when the decoder has started decoding the next song, but the result hasn't been read yet.
-