aboutsummaryrefslogtreecommitdiff
path: root/src/player_thread.c
Commit message (Collapse)AuthorAge
* player_thread: implement missing "idle" events on output errorsMax Kellermann2013-02-04
| | | | | | When all outputs fail, MPD automatically pauses playback, but did not emit the IDLE_PLAYER event. Thus, clients were not woken up. (Mantis 3665)
* player_thread: disable cross-fading in "single" modeMax Kellermann2012-08-25
| | | | | | | | | | | | | This commit reimplements the core of the "single" mode. Instead of doing the detection in the playlist code from the outside, it is moved to the player thread, which gets a new option called "border_pause". It will now pause playback exactly at the beginning of the new song, making the feature more reliable. Now that the player thread knows what will happen, it can suppress cross-fading. Fixes mantis tickets 0003055 and 0003166.
* player_thread: add local variable "start_ms"Max Kellermann2012-08-15
| | | | Just in case "song" becomes invalid at some point.
* Merge branch 'v0.16.x'Max Kellermann2011-10-06
|\ | | | | | | | | | | | | | | Conflicts: configure.ac src/player_control.c src/player_thread.c src/playlist_song.c
| * player_thread: add flag "output_open", fixes assertion failureMax Kellermann2011-10-06
| | | | | | | | | | | | | | Previously, the condition "defined(play_audio_format)" was used to see if an output device has been opened, but if the device had failed on startup, an assertion failure could occur. This patch adds a separate flag.
| * player_thread: move code to player_open_output()Max Kellermann2011-10-06
| | | | | | | | | | Common function that manages "player" attributes after audio_output_all_open() has returned.
| * player_thread: handle SEEK while not playingMax Kellermann2011-10-06
| |
| * decoder_control: add attributes start_ms, end_msMax Kellermann2011-10-05
| | | | | | | | | | Don't read song.start_ms and song.end_ms, let the player thread manage this logic instead.
* | Merge branch 'v0.16.x'Max Kellermann2011-09-22
|\| | | | | | | | | Conflicts: src/player_thread.c
| * decoder_api: emulate SEEK command for initial seek to CUE trackMax Kellermann2011-09-22
| | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* | Merge branch 'v0.16.x'Max Kellermann2011-07-20
|\| | | | | | | | | | | Conflicts: src/player_thread.c src/playlist_control.c
| * player_thread: lock the player while setting the bite_rateMax Kellermann2011-07-20
| |
* | fix common misspellingsJonathan Neuschäfer2011-03-31
| | | | | | | | | | | | | | These fixes were mostly generated with `codespell' [0] and manually reviewed. [0] http://git.profusion.mobi/cgit.cgi/lucas/codespell/
* | copyright year 2011Max Kellermann2011-01-29
| |
* | decoder_control: store GCond object, not a player_controlMax Kellermann2011-01-10
| | | | | | | | | | | | 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.
* | decoder_control: replace dc_init() with dc_new()Max Kellermann2011-01-10
| | | | | | | | | | dc_new() allocates the object and returns it. dc_free() frees it (replaces dc_deinit()).
* | player_control: removed the global variable "pc"Max Kellermann2011-01-10
|/ | | | | | | 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.
* player_thread: discard empty chunks while cross-fadingMax Kellermann2011-01-07
| | | | | | When a music_chunk to be crossfaded consists only of a tag, cross-fading is not possible, and led to an assertion failure. This patch just discards those, as if cross-fading was not enabled.
* player_thread: fix assertion failure due to early seekMax Kellermann2011-01-07
| | | | | | | Until the decoder plugin has called decoder_initialized(), the player may not submit seek commands. This however could occur with a slow decoder and a CUE file with a virtual song offset. This patch adds another check.
* player_thread: make variables more localMax Kellermann2011-01-07
|
* Merge release 0.15.14 from branch 'v0.15.x'Max Kellermann2010-11-07
|\ | | | | | | | | | | | | | | | | | | | | | | Conflicts: NEWS configure.ac src/decoder_control.c src/decoder_control.h src/input/rewind_input_plugin.c src/output_control.c src/output_thread.c src/player_thread.c
| * player_thread: fix assertion failure due to wrong music pipe on seekMax Kellermann2010-11-05
| | | | | | | | | | | | | | | | | | 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.
| * decoder_control: pass music_pipe to dc_start()Max Kellermann2010-11-05
| | | | | | | | More abstraction for decoder_control.pipe.
| * player_thread: add helper function player_dc_at_next_song()Max Kellermann2010-11-05
| | | | | | | | Some abstraction for decoder_control.pipe access.
| * pipe: add helper function music_pipe_empty()Max Kellermann2010-11-05
| |
* | eliminate g_error() usageThomas Jansen2010-09-25
| | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* | mixramp: Adjust MixRamp threshold to account for ReplayGain.Tim Phipps2010-05-08
| |
* | player_thread: move cross-fading to output threadMax Kellermann2010-05-02
| | | | | | | | | | Remove cross_fade_apply(), and call pcm_mix() in the output thread, mixing the chunk and chunk->other together.
* | Merge release 0.15.9 from branch 'v0.15.x'Max Kellermann2010-03-28
|\| | | | | | | | | | | | | | | | | Conflicts: NEWS configure.ac src/cue/cue_tag.c src/decoder/mpcdec_decoder_plugin.c src/player_thread.c
| * player_thread: postpone song tags during cross-fadeMax Kellermann2010-03-17
| | | | | | | | | | | | | | | | | | 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.
* | Add support for MixRamp tagsTim Phipps2010-03-21
| | | | | | | | | | Adds mixrampdb and mixrampdelay commands. Reads MIXRAP_START and MIXRAMP_END tags from FLAC files and overlaps instead of crossfading.
* | output: added option "always_on" for radio stationsMax Kellermann2010-03-10
| | | | | | | | | | | | | | 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.
* | output_all: reset elapsed_time at song borderMax Kellermann2010-01-02
| | | | | | | | | | | | | | | | 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.
* | Update copyright notices.Avuton Olrich2009-12-31
| |
* | decoder, player: support song rangesMax Kellermann2009-12-27
| | | | | | | | | | | | | | 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.
* | song: added function song_get_duration()Max Kellermann2009-12-26
| |
* | fixed several gcc warnings on unused debug variablesMax Kellermann2009-12-14
| |
* | player_thread: corrected two assertions on "queued"Max Kellermann2009-11-14
| | | | | | | | At this point, the function may be called from the SEEK handler.
* | player_thread: initialize chunk->times in silence generatorMax Kellermann2009-11-12
| | | | | | | | | | | | | | | | | | | | 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.
* | include config.h in all sourcesMax Kellermann2009-11-12
| | | | | | | | | | | | 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.
* | player_thread: drain audio outputs at the end of the playlistMax Kellermann2009-11-09
| | | | | | | | | | | | | | | | 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.
* | player_thread: on return, reset next_song only if queuedMax Kellermann2009-11-03
| | | | | | | | | | If no song was queued, then player_control.next_song might contain the value for the next QUEUE command. We must not reset that.
* | player_thread: detect finished queued songMax Kellermann2009-11-03
| | | | | | | | | | | | | | 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.
* | player_thread: moved code to decoding_next_song()Max Kellermann2009-11-03
| | | | | | | | Simplify several expressions.
* | player_thread: lock player in player_check_decoder_startup()Max Kellermann2009-11-03
| | | | | | | | Don't access attributes without the lock.
* | decoder_control: pass pipe and buffer to dc_start()Max Kellermann2009-11-03
| | | | | | | | Don't access decoder_control attributes directly.
* | player_thread: lock inside player_wait_for_decoder()Max Kellermann2009-11-03
| | | | | | | | Lock the player_control object when modifying its attributes.
* | player_thread: moved code to player_dc_start()Max Kellermann2009-11-03
| |
* | decoder_control: merge next_song and current_songMax Kellermann2009-11-03
| | | | | | | | These two variables are redundant, we need only one of them.
* | player_thread: don't set errored_song on audio errorMax Kellermann2009-11-03
| | | | | | | | It's not used if pc.error==PLAYER_ERROR_AUDIO.