| Commit message (Collapse) | Author | Files | Lines |
|
Similar to libmad, libmpcdec provides samples with higher quality than
16 bit. Send 24 bit samples to MPD, which allows MPD to apply
dithering just in case the output devices are only 16 bit capable.
|
|
Don't hard-code the "16 bits" or "2 bytes" in multiple locations.
|
|
The name "s16" implies 16 bit integers. To make the code more
generic, rename it to "dest".
|
|
The conversion of integer samples was completely broken, which
presumably didn't annoy anybody because libmpcdec provides float
samples on most installations.
|
|
When input_stream_seek() was converted to return a bool, this wasn't
adjusted in the musepack plugin.
|
|
Don't return 0/-1 on success/error, but true/false. Instead of int,
use bool for storing flags.
|
|
Its only caller in mp3_decode() just compared its value with
DECODE_BREAK. Convert that to bool, and return false if the loop
should be ended. Also eliminate some superfluous command checking
code, which was already done in the preceding while loop.
|
|
Since open() and play() close the device on error, we can simply check
audio_output.open instead of audio_output.result after a call.
|
|
When one of several output devices failed, MPD tried to reopen it
quite often, wasting a lot of resources. This patch adds a delay:
wait 10 seconds before retrying. This might be changed to exponential
delays later, but for now, it makes the problem go away.
|
|
Moved code from syncAudioDeviceStates() to audio_output_update().
|
|
Stopping an audio output device without cancelling its buffer doesn't
make sense. Combine the two operations, which saves several cancel
calls.
|
|
Don't allow users to open a file which is non-regular (e.g. pipes,
devices).
|
|
|
|
|
|
Prefer GLib over utils.h.
|
|
|
|
When an output plugin fails to play a chunk, close it. This replaces
various manual close() calls in nearly all plugins.
|
|
Don't return 0/-1 on success/error, but true/false. Instead of int,
use bool for storing flags.
|
|
Instead of implementing another loop which calls audio_output_close()
on all configured devices, simply call closeAudioDevice().
|
|
This variable is never read, and can be removed.
|
|
The pointer becomes invalid due to pa_simple_free(), which may lead to
segmentation faults when the output is reopened later.
|
|
Use GLib allocation and logging functions.
|
|
|
|
When the decoder exited before the buffer has grown big enough
("buffer_before_play"), the player thread waited forever. Add an
additional check which disables buffering as soon as the decoder
exits.
|
|
Don't accept 24 bit audio. Force MPD to use 16 bit if anything other
than 8 or 16 bit is selected.
|
|
The local variable "play_audio_format" is updated every time the
player starts playing a new song. This way, we always know exactly
which audio format is current. The old code broke when a new song had
a different format: ob.audio_format is the format of the next song,
not of the current one - using this caused breakage for the software
volume control.
|
|
A decoder_flush() invocation was missing in the FLAC plugin, resulting
in casual assertion failures due to a wrong assumption about the last
chunk's audio format. It's much easier to remove that decoder_flush()
function and make the decoder thread call ob_flush().
|
|
There are no callers which pass audio_format==NULL, and it shouldn't
be allowed.
|
|
Request the next song from the playlist (by clearing pc.next_song)
only if the player command is empty. If it is not, the player may be
clearing the song that has already been queued, leading to an
assertion failure.
|
|
Call ob_clear() in decoder_command_finished() instead of implementing
that call in every decoder plugin.
|
|
Remember the seek_where argument and call decoder_command_finished()
immediately. This way, the player thread can continue working, and we
can receive more commands.
This also fixes several issues which resulted in broken frames,
leading to erroneos "elapsed" values: frames weren't parsed properly,
since the code was checking for command!=NONE.
|
|
Previously, the function would only return when a STOP was issued. It
makes more sense to consider all possible commands.
|
|
Break the large function mp3_read() into smaller pieces.
|
|
Break the large function mp3_read() into smaller pieces.
|
|
Break the large function mp3_read() into smaller pieces.
|
|
Break the large function mp3_read() into smaller pieces.
|
|
Break the large function mp3_read() into smaller pieces.
|
|
dc_seek() won't send a SEEK command to the decoder thread unless the
stream is seekable. No need to do another check; convert that to an
assertion.
|
|
need_chunks() returns a decoder_command enum. Store its return value
as this type.
|
|
The function mp3_decode_first_frame() is too large. Move some code to
separate smaller functions.
|
|
http://xkcd.com/292/
|
|
This removes the need for util.h.
|
|
Use the C99 bool data type for boolean values.
|
|
Renamed all functions and variables. Also removed the mp3DecodeData
typedef.
|
|
|
|
Yet another superfluous buffering layer. input_file was using FILE*,
but we're better off with unbuffered I/O using open(), read(), ...
|
|
size_t and long aren't 64 bit safe (i.e. files larger than 2 GB on a
32 bit OS). Use off_t instead, which is a 64 bit integer if compiled
with large file support.
|
|
Remove duplicated code from MPD.
|
|
When the decoder failed to start, the function do_play() returned,
still having pc.command==PLAY. This is because pc.command was reset
only when the decoder started up successfully. Add another
player_command_finished() call in the error handler.
|
|
Don't attempt to open a HTTP URL as a local file, and don't send a
local path to libcurl.
|