| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
| |
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.
|
|
|
|
| |
Don't compile the sources of disabled output plugins at all.
|
|
|
|
|
| |
On some systems, string.h declares basename(). This emits a shadow
warning. Change the variable name.
|
|
|
|
|
| |
If the server sends the headers "icy-name", "ice-name",
"x-audiocast-name", set the stream title.
|
| |
|
|
|
|
|
|
| |
Replaced the local variable "colon" (which had only temporary meaning)
with the variable "value". It is a pointer to the first byte of the
header value.
|
|
|
|
| |
g_free() allows passing the NULL pointer.
|
|
|
|
|
| |
For boolean values and success flags, use bool instead of integer (1/0
for true/false, 0/-1 for success/failure).
|