Commit Graph

3695 Commits

Author SHA1 Message Date
Rasmus Steinke
408f723701 decoder/vorbis: faster tag scanning with ov_test_callback()
using ov_test_callback with function CALLBACKS_STREAMONLY will cause
scanning to stop after the comment field.  ov_open (and ov_test)
default to CALLBACKS_DEFAULT which scans the file structure causing a
huge slowdown.  The speed improvement is huge: It scanned my files
around 10x faster This procedure has been recommended by monthy (main
vorbis developer) and was said to be safe for scanning files.
2009-08-24 22:14:22 +02:00
Igor Kuzmin
9d42f4e0ed update: don't re-read unchanged container files
MPD checks if every flac (possibly other types as well) file contains
cuesheet on every update, which produces unneeded I/O. My music
collection is on NFS share, so it's quite noticeable. IMHO, it
shouldn't re-read unchanged files, so I wrote simple patch to fix it.
2009-08-19 21:21:29 +02:00
Max Kellermann
fd8aa54a90 output_init: initialize the "pause" flag
Fix stuttering due to uninitialized variable.
2009-08-18 11:32:54 +02:00
Max Kellermann
f38ce5408b output/shout: minimize the unpause latency
During the pause loop, manually sleep for 500ms if shout_delay()
returns a value greater than that.  Don't exhaust libshout's buffer.
2009-08-14 11:52:36 +02:00
Max Kellermann
7133f560ec output: fixed shout stuck pause bug
Explicitly make the output thread leave the ao_pause() loop.  This
patch is a workaround, and the "pause" flag is not managed in a
thread-safe way, but that's good enough for now.
2009-08-14 11:52:12 +02:00
Max Kellermann
7dddd9beda directory: free empty directories after removing them (memleak)
dirvec_delete() does not free the object, we have to call
directory_free() afterwards.
2009-08-14 11:52:00 +02:00
Max Kellermann
5d6f7803e1 update: free temporary string in container scan (memleak)
The return value of map_directory_child_fs() must be freed.
2009-08-14 11:51:51 +02:00
Max Kellermann
1c4f407a6d decoder/flac: don't allocate cuesheet twice (memleak)
The function flac_cue_track() first calls FLAC__metadata_object_new(),
then overwrites this pointer with FLAC__metadata_get_cuesheet().  This
allocate two FLAC__StreamMetadata objects, but the first pointer is
lost, and never freed.
2009-08-14 11:51:42 +02:00
Max Kellermann
e44f313912 update: free empty path string (memleak)
When you pass an empty string to directory_update_init(), it was not
freed by update_task().
2009-08-14 11:51:35 +02:00
Max Kellermann
f4b39bc263 decoder/flac: fixed indentation of flac_comment_value() 2009-07-22 13:34:33 +02:00
Max Kellermann
47ed89bd4c decoder/flac: parse all replaygain tags
The FLAC replaygain parser used the "||" operator.  This made the code
stop after the first value which was found.
2009-07-22 13:31:48 +02:00
Max Kellermann
cf1fd2b0da decoder/flac: return early from flac_find_float_comment()
When one metadata check fails, return quickly.  This removes 2 levels
of indent.
2009-07-22 13:31:46 +02:00
Max Kellermann
8e2d987996 decoder/flac: removed misplaced authorship comment
This belongs into "git annotate" or AUTHORS.
2009-07-22 13:31:43 +02:00
Max Kellermann
322ef3cb80 mad: skip ID3 frames when libid3tag is disabled
When libid3tag is disabled, the libmad decoder plugin is unable to
identify ID3 frames.  If the file starts with an (unidentified) ID3
frame, it assumes that the file is not a valid MP3 song.  This patch
solves this by adding minimal stubs for the ID3 functions.
2009-07-22 12:57:03 +02:00
Max Kellermann
0ce727d5d4 ape: added protection against large memory allocations
The function tag_ape_load() retrieves a 32 bit unsigned integer from
the input file, and passes it to g_malloc().  This is dangerous, and
may be used for a denial of service attack on MPD.
2009-07-19 17:38:46 +02:00
Max Kellermann
e3ff0ab6d1 tag_ape: removed redundant length check
Extend the tagLen check after reading it.  Removed the second
(redundant) check after the subtraction.
2009-07-19 17:37:02 +02:00
Max Kellermann
a988b9b025 ape: check the tag size (fixes integer underflow)
The expression "tagLen - size > 0" may result in an integer underflow
and a buffer overflow, when "size" is larger than "tagLen".  "size" is
read from the input file, and must not be trusted.  This patch changes
the expression to "tagLen > size", which is a lot safer.
2009-07-18 22:45:56 +02:00
Max Kellermann
58dd6eee5d output/httpd: removed duplicate sys/types.h include
The first patch by Patrick didn't work, because his "#ifdef HAVE_OSX"
line would have required config.h.
2009-07-14 14:23:44 +02:00
Max Kellermann
c0c5119788 decoder/flac: fix assertion failure in tag_free() call
Initialize flac_data.tag right after flac_data_init().  This way, the
"goto fail" won't jump to the point where tag_free(NULL) can be
called.
2009-07-06 22:09:30 +02:00
Max Kellermann
64ca94c910 output/httpd: include sys/types.h
On Mac OS X, the httpd plugin cannot be compiled, because OS X's
system headers do nto include sys/types.h, although they use
u_int32_t.
2009-07-06 14:40:06 +02:00
Max Kellermann
00eea0e615 song: initialize mtime in song_alloc() 2009-07-06 11:50:05 +02:00
Max Kellermann
badb827712 log: fix double free() bug during shutdown
Don't free an internal configuration value in log_init().  Call
config_get_path() instead of manually calling parsePath().
2009-07-05 07:14:24 +02:00
Max Kellermann
15d4c841ce database: fixed NULL pointer dereference after charset change
When the filesystem_charset is changed in mpd.conf, MPD should discard
the old database.  In this error branch, MPD did not fill the GError
object properly, and logged a warning message instead, which caused a
segmentation fault.
2009-06-30 16:29:40 +02:00
Max Kellermann
1937d29228 output_thread: don't play next chunk after command==PAUSE
When the PAUSE loop ends, re-check the next command before calling
ao_play() again.
2009-06-29 22:20:46 +02:00
Max Kellermann
40851b7cac output_all: don't resume playback when stopping during pause
When MPD was paused, and the client sent the "stop" command (or
"clear"), a glitch caused MPD to continue playback for a split second.
This was because audio_output_all_cancel() calls
audio_output_all_update(), which reopens all output devices, and
re-ignites the playback loop.
2009-06-29 22:20:36 +02:00
Max Kellermann
2536b0da83 decoder_thread: reopen the stream after file_decode() has failed
When decoding a local file, the decoder thread tries to run all
matching decoders, until one succeeds.  Both file_decode() and
stream_decode() can decode a stream, but MPD closes the stream before
calling file_decode().  Problem is: when this decoder fails, and the
next's stream_decode() method is invoked, the input_stream is still
closed.  This patch reopens it.
2009-06-19 08:09:13 +02:00
Max Kellermann
d5ddecb15a listen: bind() failure on secondary address is non-fatal
Several users had problems with binding MPD to "localhost".  The cause
was duplicate /etc/hosts entries: the resolver library returns
127.0.0.1 twice, and of course, MPD attempts to bind to "both" of
them.  This patch makes failures non-fatal, given that at least one
address was bound successfully.  This is a workaround; users should
rather fix their /etc/hosts file.
2009-06-10 08:01:07 +02:00
Max Kellermann
5bb8a5eeef listen: renamed "error" to "error_r" in listen_add_host() 2009-06-10 07:51:14 +02:00
Max Kellermann
7dec2a9bcb listen: print debug message before bind()
Dump each socket address before binding to it.
2009-06-10 07:48:50 +02:00
Max Kellermann
74334a516c ffmpeg: moved code to ffmpeg_copy_metadata() 2009-06-08 08:45:54 +02:00
Max Kellermann
f5d4079d11 ffmpeg: removed "new metadata api" warning
This warning is useless.  I assume the author added it for debugging
purposes.
2009-06-08 08:41:07 +02:00
Max Kellermann
faaf9dafe1 client: check "expired" flag again in client_write_output()
When client_defer_output() aborts the connection to the client,
client_write_output() called client_write_deferred() anyway.  This
caused an assertion failure.  Fix it by checking for the "expired"
flag again after client_defer_output() returns.
2009-06-04 08:59:33 +02:00
Max Kellermann
427dd81678 client: added assertions on channel!=NULL
I'm hunting down a bug where client->channel==NULL during I/O
operations.  These new assertions help avoid this kind of bug in the
future.
2009-06-04 08:42:02 +02:00
Max Kellermann
ed475718e6 decoder_plugin: corrected outdated API documentation 2009-06-04 08:22:43 +02:00
Max Kellermann
70d7c79546 conf: make config_param.num_block_params unsigned 2009-06-03 06:55:09 +02:00
Max Kellermann
ddc2694419 conf: eliminated CamelCase
Renamed all remaining CamelCase functions.
2009-06-03 06:55:04 +02:00
Max Kellermann
9ee53bc76e player_thread: check pipe size again before exiting
When the decoder is finished, break out of the player loop only after
another player.pipe check.  We did check the pipe size a few lines
above, but that check was kind of racy.
2009-06-02 08:40:28 +02:00
Max Kellermann
aa7f5dec87 player_thread: don't leak empty music_chunks
When a music_chunk only contains a tag but no PCM data, play_chunk()
returns true without freeing the chunk.  The caller now assumes that
the chunk is moved into some music_pipe and does not bother to free it
either.
2009-06-02 08:40:28 +02:00
Max Kellermann
1800bde303 player_thread: reinitialize music_buffer in !NDEBUG
To check for leaked music_chunk objects, free the music buffer on
CLOSE_AUDIO.  This invokes an assertion check which ensures that all
chunks have been returned to the buffer.
2009-05-29 23:34:51 +02:00
Max Kellermann
a90c4e5184 output_all: explicitly return "true" from audio_output_all_play()
Instead of returning the local variable "ret" which is always true at
this point, hard-code the "true" return value, because that might be
more readable.
2009-05-29 23:04:45 +02:00
Mathieu Rochette
0dedfe7ddc input/file: log message on error
If a file is removed the library, next time mpd will try to play it it
will result in an error 'ERROR: problems decoding some/file.ogg'.
Nothing is written in log files (verbose mode or not)

[mk: append strerror(errno)]
2009-05-28 23:46:19 +02:00
Max Kellermann
535da8b797 volume: changed "default" to "DISABLED" in switch statement
Make gcc warn us if we add a new mixer type, and forget to add a new
"case" line.
2009-05-28 23:39:51 +02:00
Max Kellermann
68f1aed452 volume: converted volume_mixer_type to an enum
Don't use CPP macros when you can use C enums.
2009-05-28 23:37:26 +02:00
Max Kellermann
a54f14f31d volume: removed unused macro "VOLUME_MIXER_SOFTWARE_DEFAULT" 2009-05-28 23:34:45 +02:00
Max Kellermann
4e8208717b playlist: reset "current song" when playlist ends
Commit f78cddb4 introduced a regression: when the playlist reached its
end, MPD did not reset the "current song" pointer anymore after stop.
Add a "current = -1" code line.
2009-05-28 23:23:32 +02:00
Max Kellermann
d8ef153729 music_chunk: added more audio_format_valid() assertions
Check the validity of the audio_format during write operations.
2009-05-11 17:25:34 +02:00
Max Kellermann
1a9a65b23b music_pipe: added assertion on chunk->audio_format
Always assert that the audio format of the new chunk is valid.
2009-05-11 16:33:48 +02:00
Patrik Weiskircher
7e678d2ba9 latest git, httpd_output_plugin compile fix, mac os x
Hello,

While compiling latest git I've received a compile error in the
httpd_output_plugin.
Small patch attached.

Patrik
2009-05-10 21:15:53 +02:00
Max Kellermann
7c13249b59 pcm_resample: fixed typo in libsamplerate runtime check
The string comparison should be "!= 0", not "== 0".  Ouch.
2009-05-07 12:19:01 +02:00
Max Kellermann
a4c59943d1 player_control: assert that pc.next_song is NULL after seeking
The player thread must reset pc.next_song after seeking, even if that
operation has failed.  This patch adds an assertion.
2009-05-06 18:46:59 +02:00
Max Kellermann
438f3547cc player_control: removed pc.error check from pc_seek()
The only pc_seek() caller clears the error, rendering the check
useless.  Even if the previous PLAY command resulted in a player
error, this check is not very useful.
2009-05-06 18:46:52 +02:00
Max Kellermann
3083df5a5f player_control: renamed playerSeek(), return bool
Renamed playerSeek() to pc_seek() to get rid of CamelCase.  Convert
the return value to bool.
2009-05-06 18:35:22 +02:00
Max Kellermann
0935d85c69 tag_id3: added support for the UFID frame
If the UFID frame's owner is "http://musicbrainz.org", assume its
value is the MusicBrainz track id.
2009-05-06 14:42:07 +02:00
Max Kellermann
4818d38677 httpd_output: save the page generated by encoder_tag()
Flush the encoder before calling encoder_tag().  The first page
generated by the encoder after sending the tag will be the new
"header" page, which is sent to all HTTP clients when they connect.
This is a little bit specific to the vorbis encoder, but there are no
other encoders which support tags (yet).
2009-05-05 22:51:17 +02:00
Max Kellermann
e55e560d4e httpd_output: moved code to httpd_output_encoder_to_clients()
Moved some code from httpd_output_encode_and_play() into separate
functions httpd_output_broadcast_page() and
httpd_output_encoder_to_clients().
2009-05-05 22:43:28 +02:00
Max Kellermann
9080797025 httpd_output: disable Icy-Metadata when encoder supports tags
There's no reason to send both encoder tags and Icy-Metadata to the
client.  Let's disable Icy-Metadata when the encoder supports embedded
tags.
2009-05-05 22:41:36 +02:00
Max Kellermann
ebc1d3516c vorbis_encoder: start a new stream in tag()
When a new tag is set, end the current stream and begin a new one.
Use vorbis_analysis_headerout() to write a full ogg header.  This
fixes a problem with icecast: after a song change in MPD, icecast
stops forwarding ogg packets to its clients.
2009-05-05 22:40:51 +02:00
Max Kellermann
7875072d38 vorbis_encoder: moved code to vorbis_encoder_headerout() 2009-05-05 22:37:13 +02:00
Max Kellermann
795569208a httpd_output: assert that tag!=NULL
In the tag() method, MPD guarantees that it does not pass tag==NULL.
Converted the runtime check to an assertion.
2009-05-05 22:36:44 +02:00
Max Kellermann
7dcdb2ce39 archive/zip: pass NULL instead of 0 to zzip_dir_open()
The second parameter of zzip_dir_open() is a pointer.  Pass the NULL
pointer instead of 0 (with implicit conversion at compile time).
2009-05-04 09:46:15 +02:00
Max Kellermann
e710037760 output_init: added option to disable the hardware mixer
Added the per-device option "mixer_enabled" which allows users to
disable the hardware mixer of an audio output.
2009-04-28 20:33:06 +02:00
Max Kellermann
61b0835512 command: added "sticker delete" command 2009-04-28 20:25:07 +02:00
Max Kellermann
610940a06d sticker: added sticker_delete_value()
sticker_delete_value() deletes only one value in a sticker, while
the old function sticker_delete() deletes all values.
2009-04-28 20:23:27 +02:00
Max Kellermann
7d9316a52d song_save: don't call tag_free(NULL)
When a song was in the database twice (which shouldn't happen), and
the first song had no tag items, MPD calledd tag_free(NULL).  Add a
check to that source location, and an assertion to tag_free().
2009-04-28 19:57:49 +02:00
Max Kellermann
fd81e7e3b6 libsamplerate: use g_ascii_strncasecmp() instead of strncasecmp()
strncasecmp() is locale dependent, making it a bad choice for internal
string comparisons.
2009-04-28 09:42:05 +02:00
Max Kellermann
3db834f6b3 command: use g_ascii_strcasecmp() instead of strcasecmp()
strcasecmp() is locale dependent, making it a bad choice for internal
string comparisons.
2009-04-28 09:34:03 +02:00
Max Kellermann
b546cf65bc utils: use g_ascii_strcasecmp() instead of strcasecmp()
strcasecmp() is locale dependent, making it a bad choice for internal
string comparisons.
2009-04-28 09:33:44 +02:00
Max Kellermann
d3c93c1c77 tag: use g_ascii_strcasecmp() instead of strcasecmp()
strcasecmp() is locale dependent, making it a bad choice for internal
string comparisons.
2009-04-28 09:32:38 +02:00
Max Kellermann
b2924405ae conf: use g_ascii_strcasecmp() instead of strcasecmp()
strcasecmp() is locale dependent, making it a bad choice for internal
string comparisons.
2009-04-28 09:32:09 +02:00
Max Kellermann
b1c177528f locate: use g_ascii_strcasecmp() instead of strcasecmp()
strcasecmp() is locale dependent, making it a bad choice for internal
string comparisons.
2009-04-28 09:31:44 +02:00
Max Kellermann
0edfbc8a5f input_curl: use g_ascii_strcasecmp() instead of strcasecmp()
strcasecmp() is locale dependent, making it a bad choice for internal
string comparisons.
2009-04-28 09:30:12 +02:00
Max Kellermann
c434379d79 mad_decoder: use g_ascii_strcasecmp() instead of strcasecmp()
strcasecmp() is locale dependent, making it a bad choice for internal
string comparisons.
2009-04-28 09:29:39 +02:00
Max Kellermann
d5b3dd36fd mp4ff_decoder: use g_ascii_strcasecmp() instead of strcasecmp()
strcasecmp() is locale dependent, making it a bad choice for internal
string comparisons.
2009-04-28 09:29:11 +02:00
Max Kellermann
9038882d95 alsa_mixer: use g_ascii_strcasecmp() instead of strcasecmp()
strcasecmp() is locale dependent, making it a bad choice for internal
string comparisons.
2009-04-28 09:28:16 +02:00
Daniel Kahn Gillmor
05dfdfdb39 alsa_mixer: add mixer_index option
This allows you to select controls with duplicate names.
2009-04-28 09:15:48 +02:00
Max Kellermann
f4966ba42c decoder_api: removed dc.pipe assertion from decoder_read()
Database update was broken due to the dc.pipe!=NULL assertion.  This
assertion is only valid while MPD decodes a song, not during database
update.
2009-04-26 10:57:02 +02:00
Max Kellermann
ecb7f24b01 vorbis_encoder: reinitialize vorbis_dsp_state after flush
libvorbis goes into a very long loop if we try to add data after a
flush was invoked by vorbis_analysis_wrote(0).  This seems to be a
problem with the internal end-of-stream marker.  Thus, we cannot reuse
the vorbis_dsp_state object.
2009-04-25 18:27:39 +02:00
Max Kellermann
3888ef2f55 decoder_control: properly cancel an existing command in dc_stop()
When the decoder thread has a pending command, send the STOP command
to cancel this command.  Send STOP again if the decoder thread is
still running after that, just in case the decoder thread has executed
the previous command (which was overwritten).
2009-04-25 15:19:01 +02:00
Max Kellermann
ceb00f787e decoder: added assertions on dc.pipe
dc.pipe must be non-NULL while the decoder thread is running.  Ensure
that with a load of assertions.
2009-04-25 15:07:22 +02:00
Max Kellermann
d01d1ccad2 client: use GTimer to track timeouts 2009-04-25 14:16:24 +02:00
Max Kellermann
616dc9d465 playlist_control: use GTimer in previousSongInPlaylist()
To determine whether to rewind the current song or to go to the
previous song, use a GTimer instead of manually diffing time(NULL).
2009-04-25 14:08:31 +02:00
Max Kellermann
d2010c0289 pulse_mixer: use PULSE's mainloop lock instead of GMutex
Using two different kinds of locks may result in a race condition with
a deadlock.  The libpulse callbacks need no locks at all, because the
mainloop object can be assumed to be already locked.
2009-04-25 13:53:15 +02:00
Max Kellermann
11bcd7f013 curl: moved proxy settings to "input" block
The old global settings "http_proxy_host", "http_proxy_port",
"http_proxy_user" and "http_proxy_password" continue to work.
2009-04-25 13:35:04 +02:00
Max Kellermann
80de8fb93b fluidsynth: added "experimental" comments in the source file 2009-04-25 12:32:22 +02:00
Max Kellermann
472b994779 player_thread: pause when all audio outputs fail to play
When all audio outputs have been closed due to failures, pause the
playback instead of stopping it.  This way, the user may resume
at the current position after the problem has been dealt with.
2009-04-25 11:55:36 +02:00
Max Kellermann
70faf59275 player_thread: pause when output fails while seeking
When no audio outputs could be opened while seeking, leave MPD seeked
at that position and pause playback.  The user may continue from this
point at any time, as soon as the audio outputs are fixed.  The old
behaviour triggered an assertion failure: the failure wasn't passed
properly to the do_play() function, which attempted to play audio
chunks.
2009-04-25 11:36:45 +02:00
Max Kellermann
5ce625ea97 stored_playlist: don't close NULL file on error
spl_append_song() can crash when fopen() fails, because it attempts to
close the invalid file handle (NULL) in the error handler.
2009-04-24 08:57:01 +02:00
Max Kellermann
85658965c9 alsa_output: don't use atexit() to clean up the ALSA library
Call snd_config_update_free_global() manually in our finish() method,
don't use atexit().
2009-04-21 22:47:12 +02:00
Max Kellermann
eb059a789c alsa_mixer: call snd_config_update_free_global() in finish()
snd_config_update_free_global() frees cached ALSA configuration.  This
keeps valgrind a little bit more quiet.  This patch moves the call
from the open() method into the finish() method, which seems more
natural: it allows the use of the config cache, and improves the
cleanup phase.
2009-04-21 22:47:08 +02:00
Max Kellermann
c7c809ecba output_control: close mixer on pause
For non-global mixers (only "pulse" currently), close the mixer when
MPD playback is paused.
2009-04-21 22:17:52 +02:00
Max Kellermann
c9c0415d65 client: free the fifo buffer
This patch fixes a memory leak: the fifo_buffer object was not freed
when the client connection was closed.
2009-04-17 11:37:27 +02:00
Max Kellermann
2cbda895fb icy_server: don't export icy_server_metadata_string()
icy_server_metadata_string() is only called by
icy_server_metadata_page().
2009-04-13 19:39:33 +02:00
Max Kellermann
9919704be3 httpd: use C99 "bool" instead of GLib's gboolean
Plain "bool" consumes only one byte instead of four.
2009-04-13 19:39:19 +02:00
Max Kellermann
3f81f5b476 httpd: use g_ascii_strncasecmp() to compare headers
In HTTP, header names are case insensitive.
2009-04-13 19:39:16 +02:00
Hagen Schink
92ba754fc6 Implemented basic icy support for the httpd output
[mk: folded with patch "Put icy related functions in extra source
files"; moved icy_server.c from HAVE_CURL to ENABLE_HTTPD_OUTPUT;
removed an unused variable]
2009-04-13 19:35:02 +02:00
Max Kellermann
200be26371 decoder_api: submit the song tag to the music pipe
When a new song starts playing, send its tag (song->tag) to the music
pipe.  This allows output plugins to render tags for all songs, not
only those with embedded tags understood by the decoder plugin.
2009-04-13 19:25:53 +02:00
Max Kellermann
548e842799 log: removed "unused" attribute from log_level parameter 2009-04-10 09:14:21 +02:00
Avuton Olrich
0b36e7d944 decoder: prefer wildmidi over fluidsynth 2009-04-06 11:03:45 +02:00
Avuton Olrich
d38f72b902 vorbis: move #define out of function to top of sources 2009-04-02 16:07:52 -07:00
Avuton Olrich
fd90db35b7 decoder: Rename all main decoder plugins functions to *decoder_plugin. 2009-04-02 15:55:10 -07:00