- 15 Nov, 2018 1 commit
-
-
Max Kellermann authored
-
- 14 Nov, 2018 17 commits
-
-
Max Kellermann authored
This fixes a problem which caused a failure with snd_pcm_writei() because snd_pcm_drain() had already been called in the previous iteration. This commit makes sure that snd_pcm_drain() is only called after the final snd_pcm_writei() call. This fixes discarded samples at the end of playback.
-
Max Kellermann authored
When a playback error has occurred, MPD would never recover until one restarts MPD.
-
Max Kellermann authored
MPD's default is 100ms, which is too long for the real-time I/O thread. The OutputThread has 100us, but the real-time I/O thread might have tighter deadlines. This change has currently no effect (I believe), because nobody uses timers on the RTIO thread.
-
Max Kellermann authored
-
Max Kellermann authored
-
Max Kellermann authored
-
Max Kellermann authored
-
Max Kellermann authored
CancelInternal() doesn't need to be protected because it is called synchronously from Cancel().
-
Max Kellermann authored
Fixes a theoretical race condition which could occur in Drain() (but was extremely unlikely).
-
Max Kellermann authored
If our `ring_buffer` is smaller than the ALSA-PCM buffer (if the latter has more than the 4 periods we allocate), it can happen that the start threshold is crossed and ALSA switches to `SND_PCM_STATE_RUNNING`, but the `ring_buffer` is empty. In this case, MPDD will generate silence, even though the ALSA-PCM buffer has enough data. This causes stuttering (#420). This commit amends an older workaround for a similar problem (commit e08598e7) by adding a snd_pcm_avail() check, and only generate silence if there is less than one period of data in the ALSA-PCM buffer. Fixes #420
-
Max Kellermann authored
The method Cancel() assumes that the `period_buffer` must be empty when `active==false`, but that is not the case when Play() fails. Of course the assertion in Cancel() is not 100% correct, but I decided to rather fix this in LockCaughtError() because the `period_buffer` should only be accessed from within the RTIO thread, and this is the only code path where `active` can be set to `false` with a non-empty `period_buffer`. Fixes #423
-
Max Kellermann authored
This implements real error handling, and avoids calling CancelInternal() from this code path.
-
Max Kellermann authored
alsa-lib doesn't set errno, it returns errors as negative integers.
-
Max Kellermann authored
-
Max Kellermann authored
-
Max Kellermann authored
This check was added 9 years ago in commit 4dc25d39 to work around a dmix bug which I assume has been fixed long ago. Removing this fixes another corner case: if draining is requested before the start threshold is reached, the PCM is still in SND_PCM_STATE_PREPARED but not yet SND_PCM_STATE_RUNNING, which means the submitted data will never be played. This corner case is realistic when playing songs shorter than the ALSA buffer (if the buffer is very large).
-
Max Kellermann authored
This fixes a corner case which has probably never occurred and probably never will: if Cancel() is called, and then Play() followed by Drain(), the plugin should really play that data. However currently, this never happens, because snd_pcm_prepare() is never called.
-
- 12 Nov, 2018 16 commits
-
-
Max Kellermann authored
-
Max Kellermann authored
-
Max Kellermann authored
-
Max Kellermann authored
-
Max Kellermann authored
-
Max Kellermann authored
-
Max Kellermann authored
-
Max Kellermann authored
-
Max Kellermann authored
Closes #410
-
Max Kellermann authored
I added this sentence in commit 5271e81e, but this was merely documented the legacy status quo, which has always been undocumented for old-style filters. But for new filters, using "==" for sub strings was a surprising "feature", which I removed in commit ac0852b4.
-
Max Kellermann authored
This fixes the assertion failure due to calling AudioOutputSource::Close() twice.
-
Max Kellermann authored
Fixes a crash bug with `always_on` outputs which occurs because the `AudioOutputSource` still has a pointer to an outdated `MusicChunk`. Fixes #415
-
Max Kellermann authored
With the new command, the decision to pause or close the output moves into the output thread.
-
Max Kellermann authored
-
Max Kellermann authored
-
Max Kellermann authored
-
- 11 Nov, 2018 5 commits
-
-
Max Kellermann authored
This feature requires `libpcre`.
-
Max Kellermann authored
This call was missing, causing very high CPU usage when the ALSA output plugin was used with dmix. Closes #391
-
Max Kellermann authored
-
Max Kellermann authored
-
-
- 08 Nov, 2018 1 commit
-
-
Max Kellermann authored
When `metadata_sent` is `false`, the plugin assumes there is metadata which must be sent, even if no metadata page was passed to the plugin. Initializing it to `true` avoids dereferencing this `nullptr`. Fixes #412
-