Age | Commit message (Collapse) | Author | |
---|---|---|---|
2019-07-03 | net/AllocatedSocketAddress: import std::swap | Max Kellermann | |
2019-07-03 | net/{Allocated,Static}SocketAddress: use IPv[46]Address::SetPort() | Max Kellermann | |
2019-07-03 | net/ToString: move UnmapV4() to class IPv6Address | Max Kellermann | |
2019-07-03 | net/ToString: UnmapV4() returns IPv4Address | Max Kellermann | |
2019-07-03 | net/SocketAddress: use IPv[46]Address::Cast() | Max Kellermann | |
2019-07-03 | Merge tag 'v0.21.11' | Max Kellermann | |
release v0.21.11 | |||
2019-07-01 | Merge branch 'runtime_enumeration' of git://github.com/eugene2k/MPD | Max Kellermann | |
2019-07-01 | Add runtime enumeration of supported schemas. | Eugene Gorodinsky | |
Fix src/ls.cxx to only print unique schemas. Refactor src/ls.cxx to use src/input/InputPlugin functionality. Add dynamic enumeration support to curl plugin. | |||
2019-06-28 | output/alsa: log when generating silence due to slow decoder | Max Kellermann | |
MPD used to do that when this code lived in the player thread, but it was removed by commit 98a7c62d7a4f716d90af6d78e18d1a3b10bc54b3; and the replacement code in the ALSA output plugin didn't have it. | |||
2019-06-28 | output/alsa: schedule a timer to generate silence | Max Kellermann | |
Without this timer, DispatchSockets() may disable the MultiSocketMonitor and if Play() doesn't get called soon, it never gets a chance to generate silence. However if Play() gets called, generating silence isn't necessary anymore... Resulting from this misdesign (added by commit ccafe3f3cf3 in 0.21.3), the silence generator didn't work reliably. | |||
2019-06-28 | output/alsa: add a new flag "waiting" for xrun management | Max Kellermann | |
In DispatchSockets(), when there was not enough data, but enough for current playback, the method would disable the "active" flag so the next Play() call would re-enable the MultiSocketMonitor. This was an abuse of the flag which could result in a crash in Cancel(), because that method asserts that the period_buffer is empty, which it may be not. The solution is to add anther flag called "waiting" which shares some behavior with the old flag. | |||
2019-06-28 | output/alsa: Cancel() also affects "active" (documentation) | Max Kellermann | |
2019-06-28 | output/alsa: fix comment typo | Max Kellermann | |
2019-06-28 | output/alsa: fix comment typo | Max Kellermann | |
2019-06-28 | output/alsa: more assertions in class PeriodBuffer | Max Kellermann | |
2019-06-28 | output/alsa: use IsCleared() instead of IsDrained() in DrainInternal() | Max Kellermann | |
Really drain all data from the period_buffer in any case. | |||
2019-06-28 | output/alsa: replace PeriodBuffer::IsEmpty() with IsCleared() | Max Kellermann | |
This assertion is not about whether all data has been consumed, but about whether there has been any data at all. | |||
2019-06-28 | Merge branch 'v0.21.x' | Max Kellermann | |
2019-06-28 | output/alsa: always redo DrainInternal() after writing | Max Kellermann | |
Draining isn't finished just because the period_buffer has run empty. It is only finished after snd_pcm_drain() has succeeded. | |||
2019-06-28 | output/alsa: check PCM state before calling snd_pcm_drain() | Max Kellermann | |
Apparently, if snd_pcm_drain() returns EAGAIN, it does not actually want to be called again; the next call will snd_pcm_drain() will also return EAGAIN, forever, even though the PCM state has meanwhile switched to SND_PCM_STATE_SETUP. This causes a busy loop; to fix this, we should always check snd_pcm_state() to see if draining is really required. | |||
2019-06-27 | output/alsa: check GetFrames()>0 instead of IsEmpty() in WriteFromPeriodBuffer() | Max Kellermann | |
2019-06-27 | output/alsa: DrainInternal() ignores postponed partial frame | Max Kellermann | |
2019-06-27 | output/alsa: add "full" assertion to WriteFromPeriodBuffer() | Max Kellermann | |
2019-06-27 | output/alsa: add full check before calling FillWithSilence() | Max Kellermann | |
2019-06-27 | output/alsa: improve silence generator test in DrainInternal() | Max Kellermann | |
There cannot be partial frames in the buffer, so we don't need GetPeriodPosition(); it's enough to check whether head has been moved in this period. | |||
2019-06-27 | output/alsa: hold back snd_pcm_writei() until period_buffer is full | Max Kellermann | |
This gives MPD more control, because attempts to avoid having partial periods in the ALSA period buffer. For example, this means that DrainInternal() doesn't need to generate silence to fill the partial period. | |||
2019-06-27 | lib/alsa/PeriodBuffer: add missing include | Max Kellermann | |
2019-06-27 | lib/alsa/PeriodBuffer: add API documentation | Max Kellermann | |
2019-06-27 | Merge branch 'v0.21.x' | Max Kellermann | |
2019-06-26 | input/tidal: deprecated because Tidal has changed the protocol | Max Kellermann | |
See https://github.com/MusicPlayerDaemon/MPD/issues/545 | |||
2019-06-26 | decoder/wildmidi: add fallbacks for libwildmidi<0.4 | Max Kellermann | |
Fix build breakage from commit ea639269d8b0ae3db06c46d546d54896a8d8c89e | |||
2019-06-26 | decoder/wildmidi: remove unused variable wildmidi_domain | Max Kellermann | |
2019-06-26 | decoder/wildmidi: throw PluginUnavailable on WildMidi_Init() error | Max Kellermann | |
Closes https://github.com/MusicPlayerDaemon/MPD/issues/589 | |||
2019-06-26 | decoder/wildmidi: throw PluginUnavailable if config file does not exist | Max Kellermann | |
This makes the configuration error more visible, possibly addressing one part of https://github.com/MusicPlayerDaemon/MPD/issues/589 | |||
2019-06-26 | decoder/List: handle exception PluginUnavailable | Max Kellermann | |
2019-06-26 | decoder/List: annotate exceptions thrown by DecoderPlugin::Init() | Max Kellermann | |
2019-06-26 | pcm/Export: add GetSilence() | Max Kellermann | |
2019-06-26 | pcm/Export: add GetInputBlockSize(), GetOutputBlockSize() | Max Kellermann | |
2019-06-26 | pcm/Export: add GetInputFrameSize() | Max Kellermann | |
2019-06-26 | pcm/Export: rename GetFrameSize() to GetOutputFrameSize() | Max Kellermann | |
2019-06-26 | pcm/Export: rename CalcSourceSize() to CalcInputSize() | Max Kellermann | |
2019-06-26 | pcm/Export: eliminate the AudioFormat parameter from GetFrameSize() | Max Kellermann | |
2019-06-26 | pcm/Export: use the "channels" attribute in GetFrameSize() | Max Kellermann | |
2019-06-26 | pcm/RestBuffer: make internal methods private | Max Kellermann | |
2019-06-18 | pcm/Export: split src_sample_format from alsa_channel_order | Max Kellermann | |
Combining these two in one single value saves some memory, but is complicated and we may need the src_sample_format for new features later. | |||
2019-06-18 | pcm/Export: update API documentation | Max Kellermann | |
2019-06-18 | Revert "MusicChunk: pad MusicChunkInfo to a multiple of 8 bytes" | Max Kellermann | |
This reverts commit 2c3eeb7194b4871ed7227a2c0b7bfae90b05d17f. This workaround has been obsoleted by commits bf26adf55546771e92fcfd2cc192c70c7eb5f1cd and 32380d1db046dc596e9f8198d22050b2beab8a41 | |||
2019-06-18 | pcm/Dsd{16,32}: stash odd frames away for the next call | Max Kellermann | |
Similar to commit 32380d1db046dc596e9f8198d22050b2beab8a41, these are the final parts for really fixing https://github.com/MusicPlayerDaemon/MPD/issues/469 | |||
2019-06-18 | pcm/Dsd{16,32}: convert public function to stateful class | Max Kellermann | |
2019-06-18 | pcm/Export: update API documentation | Max Kellermann | |