Age | Commit message (Collapse) | Author | |
---|---|---|---|
2016-12-28 | output/Plugin: delay() returns std::chrono::steady_clock::duration | Max Kellermann | |
2016-12-28 | thread/Cond: add timed_wait() overload with std::chrono support | Max Kellermann | |
2016-12-28 | Stats: use std::chrono | Max Kellermann | |
2016-12-28 | Stats: initialize start_time automatically | Max Kellermann | |
2016-12-28 | output/Timer: pass size_t to Add() | Max Kellermann | |
2016-12-28 | output/Timer: use C++11 initializers | Max Kellermann | |
2016-12-28 | output/Timer: no "time" initialization if !started | Max Kellermann | |
2016-12-28 | system/PeriodClock: indent with tabs | Max Kellermann | |
2016-12-28 | event/Loop: use std::chrono | Max Kellermann | |
2016-12-28 | config/Global: add std::chrono::steady_clock::duration overload | Max Kellermann | |
2016-12-27 | event/Loop: use C++11 initializers | Max Kellermann | |
2016-12-27 | StateFile: use C++11 initializers | Max Kellermann | |
2016-12-27 | output/Thread: move software_mixer_set_filter() call to Open() | Max Kellermann | |
.. and remove the obsolete method OpenFilter(). | |||
2016-12-27 | output/Thread: fix assertion failure in CLOSE handler | Max Kellermann | |
Convert assertion to runtime check; this assertion could fail when the output was closed due to an error before CLOSE arrived. | |||
2016-12-27 | output/Thread: use "true" instead of "1" | Max Kellermann | |
2016-12-26 | output/Source: add assertion | Max Kellermann | |
2016-12-26 | output/SharedPipeConsumer: add thread-safety documentation | Max Kellermann | |
2016-12-26 | output/Source: release the mutex while the filter runs | Max Kellermann | |
The filter can take some time to finish, even more so on a weak machine with a saturated CPU. By not holding the mutex during that time, we can reduce PlayerThread latency a lot, because that thread needs to synchronize a lot with all outputs. | |||
2016-12-26 | output/Source: add Fill(), ReadTag(), PeekData(), ConsumeData() | Max Kellermann | |
Don't expose MusicChunk instances, provide higher-level access to chunk contents. | |||
2016-12-26 | output/Thread: move code to new class AudioOutputSource | Max Kellermann | |
2016-12-26 | configure.ac: use MPD_AUTO for libsndio and Haiku | Max Kellermann | |
2016-12-24 | outputThread: optimize Command::OPEN | Max Kellermann | |
Try harder to skip steps (reopen filter, reopen output) if the AudioOutput is already open. | |||
2016-12-22 | output/Internal: add method ClearTailChunk() | Max Kellermann | |
2016-12-22 | output/Control: move pipe initialization to the OutputThread | Max Kellermann | |
Un-protect the SharedPipeConsumer instance, and make it available in the OutputThread only. This gives more well-defined mutex protection. | |||
2016-12-22 | output/Control: use Command::OPEN to unpause, remove special case | Max Kellermann | |
2016-12-22 | output/Thread: update in_audio_format before ReopenFilter() | Max Kellermann | |
2016-12-21 | output/Thread: keep the device open if the audio format hasn't changed | Max Kellermann | |
Add another condition to Reopen() which allows keeping it open. | |||
2016-12-21 | output/Internal: add attribute request.audio_format | Max Kellermann | |
Make in_audio_format accessible only from within the OutputThread, and add a new one for inter-thread communication. | |||
2016-12-20 | output/Thread: ao_filter_chunk() throws exception on error | Max Kellermann | |
Move the error logging to AudioOutput::PlayChunk(). | |||
2016-12-20 | output/Thread: use ConstBuffer::skip_front() | Max Kellermann | |
2016-12-20 | output/Thread: convert pointer to reference | Max Kellermann | |
2016-12-20 | output/SharedPipeConsumer: update API documentation | Max Kellermann | |
2016-12-19 | input/curl: wrap CURLM* in new class CurlMulti | Max Kellermann | |
2016-12-19 | input/curl: rename class CurlMulti to CurlGlobal | Max Kellermann | |
2016-12-19 | input/curl: wrap CURL* in new class CurlEasy | Max Kellermann | |
2016-12-19 | input/curl: remove duplicate InitEasy() call | Max Kellermann | |
2016-12-14 | output/Client: new interface to replace direct access to class PlayerControl | Max Kellermann | |
2016-12-14 | player/Thread: reduce unlock/lock overhead in PlayerCommand::PAUSE handler | Max Kellermann | |
2016-12-14 | player/Thread: mutex must be locked inside OpenOutput() | Max Kellermann | |
2016-12-14 | player/Thread: mutex must be locked inside CheckDecoderStartup() | Max Kellermann | |
2016-12-14 | output/Multiple: move Wait() to struct PlayerControl | Max Kellermann | |
Eliminate a dependency from MultipleOutputs on PlayerControl. | |||
2016-12-14 | player/Thread: use class ScopeLock | Max Kellermann | |
2016-12-14 | player/Control: add method LockApplyBorderPause() | Max Kellermann | |
2016-12-14 | player/Control: add method LockSetOutputError() | Max Kellermann | |
2016-12-14 | output/MultipleOutputs: parallelize EnableDisable() | Max Kellermann | |
2016-12-14 | output/MultipleOutputs: parallelize AudioOutput destruction | Max Kellermann | |
Reduce latency by stopping all AudioOutputs asynchronously. | |||
2016-12-14 | output/Thread: KILL implicitly closes and disables the AudioOutput | Max Kellermann | |
Reduce shutdown latency by two commands per output. | |||
2016-12-14 | output/MultipleOutputs: move code to AudioOutput::EnableDisableWait() | Max Kellermann | |
2016-12-14 | output/MultipleOutputs: reduce lock/unlock calls in EnableDisable() | Max Kellermann | |
Use ScopeLock to manage the lock; don't unlock after obtaining the "really_enabled" flag; keep the same lock during EnableWait() / DisableWait(). | |||
2016-12-13 | output/Thread: wake up the player thread periodically while playing | Max Kellermann | |
Without this, the pipe would run empty very often, which may result in an xrun if the roundtrip to the PlayerThread and back takes too long. By waking up the PlayerThread before the pipe runs empty, we make MPD much more latency tolerant, which is a major optimization. |