| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
| |
Refuse to play audio formats which are not supported by MPD.
|
| |
|
|
|
|
|
| |
Pushing buffers with a zero length into the MPD core causes failures;
don't let them pass beyond the decoder plugi API.
|
| |
|
| |
|
| |
|
|
|
|
| |
Removed the superfluous my_usleep() call.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
When MPD quits in a non-clean way, the state file isn't written, and
on the next start, MPD time warps to the previous clean shutdown.
Save the state file every 5 minutes; this will probably be
configurable at a later time.
Note that we don't set a wakeup timer for that: when there is no MPD
traffic, MPD won't wake up to save the state file. This minor bug is
tolerated, because usually there is no change in MPD's state when the
main thread is idle.
|
|
|
|
|
|
| |
If the caller attempts to seek only a few bytes forward, chances are
good that the offset is already in the buffer. In this case, simply
fast-forward the buffer.
|
|
|
|
| |
Added some assertions.
|
|
|
|
|
|
|
| |
If someone calls seek() with an invalid (negative) offset, the curl
implementation of that method returned false, but left this invalid
offset in input_stream.offset. Move the calculation to a temporary
variable.
|
|
|
|
|
|
| |
While waiting for the input stream to become ready, ignore all
commands except STOP. This fixes seeking errors with (remote) songs
which the decoder has already finished.
|
| |
|
| |
|
|
|
|
|
|
| |
skip_symlinks() expects an UTF-8 encoded file name, but
updateDirectory() passed ent->d_name (in file system encoding) to it.
Convert it to UTF-8 first.
|
|
|
|
|
|
| |
In map_directory_child_fs(), the result of utf8_to_fs_charset() was
never used, because it passed the unmodified "name" parameter to
pfx_dir().
|
|
|
|
|
| |
g_convert() wants the destination character set first. This was mixed
up.
|
|
|
|
|
|
| |
The ov_info() return value may be corrupt when ov_read() did not
return a positive value. First check for success, then check
ov_info().
|
|
|
|
|
|
|
| |
HTTP servers respond with "416 Requested Range Not Satisfiable" when a
client attempts to seek to the end of the file. Catch this special
case in input_curl_seek(). This fixes a glitch in the ogg vorbis
decoder plugin.
|
|
|
|
|
|
| |
Since we are using curl_multi_info_read() / CURLMSG_DONE for detecting
end-of-response, we can remove all running_handles==0 checks. For
some reason, that has never worked correctly.
|
|
|
|
|
|
|
| |
curl_multi_info_read() is the authoritative source of the
"end-of-response" information. Always set c->eof when a CURLMSG_DONE
message is received, and check the result (success/failure) after
that.
|
|
|
|
| |
Somehow we lost 600e1322 after renaming some variables in ed6f6046.
|
|
|
|
|
|
|
|
| |
When a global audio format is configured (setting
"audio_output_format"), decoder_data() overwrote the "length"
parameter with the size of the output buffer (result of
pcm_convert_size()). Declare a separate variable for the output
buffer length.
|
|
|
|
|
| |
The ffmpeg library provides some of the song metadata in the
AVFormatContext struct. Pass it from there to MPD.
|
|
|
|
| |
[mk: by definition, tag_new() cannot fail - removed check]
|
|
|
|
|
| |
The chunk index passed to successor() must be valid, i.e. it must be
smaller than num_chunks.
|
|
|
|
|
|
| |
Define the special value "-1" as "unknown size". Previously, there
was no indicator for streams with unknown size, which might confuse
some decoders.
|
|
|
|
|
|
| |
With whence==AVSEEK_SIZE, the seek function should return the file
size, not the current offset. Check the return value of
input_stream_seek().
|
|
|
|
|
|
|
|
|
| |
neaacdec.h declares all arguments as "unsigned long", but internally
expects uint32_t pointers. This triggers gcc warnings on 64 bit
architectures. To avoid that, make configure.ac detect whether we're
using Debian's corrected headers or the original libfaad headers. In
any case, pass a pointer to an uint32_t, conditionally casted to
"unsigned long*".
|
|
|
|
|
| |
When the caller passes length==0, decoder_read() entered an endless
loop. Check that condition before entering the "while" loop.
|
| |
|
|
|
|
|
| |
In 432da18e a dynamic buffer was replaced by a static one but some
frees were accidently left there which caused some segfaults.
|
|
|
|
|
| |
The threshold was only checked in the deprecated logging functions
(ERROR(), WARNING(), ...). Add the check to the GLib logging handler.
|
|
|
|
|
|
| |
alloca() is not a portable function. Don't use it. Using
strncasecmp() is much more efficient anyway, because no memory needs
to be allocated and copied.
|
| |
|
|
|
|
|
|
|
|
|
| |
Don't send a "next song" request to the main thread when the current
song hasn't started playing yet, i.e. there are already two different
songs in the music pipe. This would erase information about the song
boundary within the music pipe, and thus triggered an assertion
failure. The bug could occur when playing very short songs which fit
into the pipe as a whole.
|
|
|
|
|
|
| |
Fix a deadlock: when the decoder waited for buffer space, the player
could enter a deadlock situation because it waits for more chunks for
crossfading chunks. Signal the decoder before entering notify_wait().
|
|
|
|
|
|
|
|
| |
The wavpack open function gives us an option called OPEN_STREAMING. This
provides more robust and error tolerant playback, but it automatically
disables seeking. (More exactly the wavpack lib will not return the
length information.) So, if the stream is already not seekable we can
use this option safely.
|
|
|
|
|
| |
Wavpack plugin doesn't stop decoding if a block couldn't be fully
decoded, rather it tries to go on.
|
| |
|
|
|
|
|
|
| |
mp3 seeking was broken, because the command==SEEK check was never
reached. Swap the command check order (==SEEK before !=NONE) to fix
that.
|
|
|
|
|
| |
When a command is sent while the decoder waits for a free chunk in the
music pipe, it was not returned by decoder_data().
|
|
|
|
| |
Prevent superfluous wakeups and a deadlock condition.
|
|
|
|
|
|
| |
Seeking was somewhat broken in some decoder plugins because they sent
empty chunks, and never got a command. Check the decoder command
before doing anything else in decoder_data().
|
|
|
|
|
|
| |
When a CANCEL command is received, the player should drop all chunks
of the next song. Added new funciton music_pipe_chop() which is used
for that.
|
|
|
|
|
| |
Provide a debug function which asserts on the sample format of all
chunks. Call this function in each iteration of the player main loop.
|
|
|
|
|
| |
When the decoder receives a SEEK during initialization, it should
ignore that for now. The old code made most decoders abort.
|
|
|
|
|
| |
Added an additional assertion which checks partial frames in the
existing tail chunk.
|
|
|
|
|
| |
When assigning the next_song_chunk variable, it must have been empty.
If not, there may be 3 songs overlapping in the music pipe.
|