aboutsummaryrefslogtreecommitdiffstats
path: root/src/PlayerThread.cxx (unfollow)
Commit message (Collapse)AuthorFilesLines
2013-11-28include cleanup using iwyuMax Kellermann1-1/+0
2013-11-08PlayerThread: fix stuck MPD after song change (0.18.2 regression)Max Kellermann1-4/+8
Commit 77c63511 caused MPD to become stuck right after a song change. The problem was that at some point, the MusicBuffer became full, and the DecoderThread working on the next song waits for the PlayerThread. However, the PlayerThread was stuck in a loop of g_usleep() calls, and never bothered to tell the DecoderThread that the MusicBuffer is not full anymore. This bug is very old, but its chance to occur went from nearly 0% to nearly 100%. The fix is to wake up the DecoderThread before waiting for it. As a side effect, I replaced the g_usleep() call with a Cond::Wait() call.
2013-11-06PlayerThread: reduce the number of DecoderThread wakeupsMax Kellermann1-2/+14
After the number of decoded chunks has fallen below the threshold, the PlayerThread woke up the DecoderThread over and over. This commit adds a boolean flag that avoids these duplicate wakeups, and thus reduces the number of system calls.
2013-11-06PlayerThread: enable buffering when starting playbackMax Kellermann1-1/+1
For some reason, this got lost in commit 975deca8. Re-enabling this fixes stuttering at the beginning of radio streams.
2013-11-04Log: add level "DEFAULT"Max Kellermann1-1/+1
Map LogLevel::INFO to G_LOG_LEVEL_INFO, and LogLevel::DEFAULT to G_LOG_LEVEL_MESSAGE. Now client connect/disconnect message are only logged on log_level "secure".
2013-10-30PcmMix: use negative value instead of NaN for additionMax Kellermann1-3/+1
Avoid NaN to allow -ffast-math.
2013-10-30CrossFade: use negative value for invalid mixramp_delayMax Kellermann1-1/+1
Avoid NaN to allow -ffast-math.
2013-10-29PlayerControl: move attributes to struct CrossFadeSettingsMax Kellermann1-12/+10
2013-10-28DecoderControl: convert mutex and client_cond to a referenceMax Kellermann1-19/+12
Share the Mutex between the DecoderThread and the PlayerThread. This simplifies synchronization between the two threads and fixes a freeze problem: while the PlayerThread waits for the DeocderThread, it cannot answer requests from the main thread, and the main thread will block until the DecoderThread finishes.
2013-10-28player_control: rename to PlayerControlMax Kellermann1-9/+9
2013-10-28decoder_control: rename to DecoderControlMax Kellermann1-4/+4
2013-10-26DecoderControl: add MixRamp gettersMax Kellermann1-2/+2
2013-10-22Playlist: copy stream tags from the PlayerThreadMax Kellermann1-2/+8
Finally restores an important feature that has been broken for several months when the PlayerThread started working with Song copies instead of pointers to the Queue's Song instances (commit e96779d).
2013-10-21Song: pass reference to song_equals()Max Kellermann1-1/+1
2013-10-19*: use references instead of pointersMax Kellermann1-3/+3
2013-10-19PlayerThread: Only drop 0 length packets without tagsBen Boeckel1-1/+1
Fixes a regression from 752dfb3d95482c562e5d24c6ea839c4815de9a6d which caused the current chunk to be flushed as soon as new replaygain information was found. If this occurs on a tag chunk, it has no data (length 0) and is then skipped before pushing it to all of the outputs. This change allows 0-length chunks through if they contain a tag and they are now appearing in mplayer and mpv properly.
2013-10-17Thread/Thread: replacement library for GThreadMax Kellermann1-13/+8
2013-10-17Song: GetURI() returns std::stringMax Kellermann1-7/+6
2013-10-02Log: new logging library APIMax Kellermann1-9/+11
Prepare to migrate away from GLib. Currently, we're still using GLib as a backend.
2013-09-27PlayerThread: convert struct player to a classMax Kellermann1-14/+17
2013-09-27PlayerThread: use strictly typed enumMax Kellermann1-14/+14
2013-09-27PlayerControl: use strictly typed enumsMax Kellermann1-44/+44
2013-09-27PlayerThread: move code to player_control::CommandFinished()Max Kellermann1-21/+12
2013-09-27PlayerThread: use nullptr instead of NULLMax Kellermann1-37/+37
2013-09-26PlayerThread: unlock/lock in player_task()Max Kellermann1-8/+3
2013-09-26PlayerThread: move code into the player classMax Kellermann1-269/+277
2013-09-26PlayerThread: use player referencesMax Kellermann1-116/+115
2013-09-26PlayerThread: use {decoder,player}_control referencesMax Kellermann1-214/+214
2013-09-26PlayerThread: allocate decoder_control on the stackMax Kellermann1-5/+5
2013-09-26PlayerThread: move global MusicBuffer variable into the player objectMax Kellermann1-24/+27
2013-09-26PlayerThread: simplify "buffer empty" assertionMax Kellermann1-7/+1
2013-09-26MusicBuffer: expose the C++ APIMax Kellermann1-19/+18
2013-09-26MusicPipe: expose the C++ APIMax Kellermann1-25/+24
2013-09-05Tag, ...: move to libtag.aMax Kellermann1-1/+1
2013-09-04util/Error: new error passing libraryMax Kellermann1-21/+19
Replaces GLib's GError.
2013-08-07Makefile.am: move sources to libsystem.aMax Kellermann1-1/+1
2013-08-07FatalError: new library to replace mpd_error.hMax Kellermann1-2/+2
2013-08-04*: use gcc.h macros instead of GLibMax Kellermann1-1/+1
2013-08-03audio_format: convert to C++Max Kellermann1-14/+13
2013-07-30tag: convert to C++Max Kellermann1-12/+12
2013-07-28song: convert header to C++Max Kellermann1-21/+21
2013-04-17use g_thread_new() if GLib is recent enoughMax Kellermann1-0/+4
Fixes deprecation warnings.
2013-01-25PlayerControl: add second Cond objectMax Kellermann1-1/+1
This fixes a deadlock bug introduced by 18076ac9. After all, the second Cond was necessary. The problem: two threads can wait for a signal at the same time. The player thread waits for the output thread to finish playback. The main thread waits for the player thread to complete a command. The output thread finishes playback, and sends a signal, which unfortunately does not wake up the player thread, but the main thread. The main thread sees that the command is still not finished, and waits again. The signal is lost forever, and MPD is deadlocked.
2013-01-21DecoderControl: move functions into the classMax Kellermann1-31/+31
2013-01-20PlayerControl: move functions into the classMax Kellermann1-61/+61
2013-01-10PlayerControl: switch to the Mutex/Cond classesMax Kellermann1-1/+1
2013-01-10PlayerThread: use pc.cond instead of main_condMax Kellermann1-1/+1
The main_cond variable was completely unnecessary. The pc.cond object can be used for both main->pc and pc->main.
2013-01-10DecoderControl: take ownership of client_condMax Kellermann1-1/+1
Don't let the "client" pass its own GCond. This was not used consistently.
2013-01-09EventPipe: rename to GlobalEventsMax Kellermann1-5/+5
2013-01-09event_pipe.h: convert to C++Max Kellermann1-4/+1