Commit Graph

3622 Commits

Author SHA1 Message Date
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
Max Kellermann
a7685780ed configure.ac: renamed --enable-mod to --enable-mikmod 2009-04-01 22:48:06 +02:00
Max Kellermann
cd6182862a httpd: don't pass uninitialized page to httpd_client_check_queue()
The httpd_client_check_queue() callback function does not use its
"user_data" argument.  Don't pass any, and fix the gcc warning.
2009-04-01 22:45:21 +02:00
Max Kellermann
5242305a90 configure.ac: renamed --enable-oggvorbis to --enable-vorbis 2009-04-01 22:45:17 +02:00
Max Kellermann
e720b5bdf8 command: added command "sticker find"
This command allows clients to search for stickers with a specified
name.
2009-04-01 18:53:02 +02:00
Eric Wollesen
c95fa4b441 Move db_get_song into sub-handlers. (FReq 2112)
db_get_song was being called once for all sub-handlers, but with the
addition of the find command, we don't have a URI coming in, so doing
db_get_song once won't work anymore.

[mk: fixed initialization order]
2009-04-01 18:44:39 +02:00
Max Kellermann
c51e1bf1c0 song_sticker: added song_sticker_find()
This is a wrapper for sticker_find(), which looks up the song object.
2009-04-01 18:44:26 +02:00
Max Kellermann
3a4d20faa2 sticker: added sticker_find()
sticker_find() finds stickers with the specified name.
2009-04-01 18:42:06 +02:00
Max Kellermann
7f38c3fc78 directory: added directory_lookup_song()
Moved code from db_get_song().
2009-04-01 18:41:37 +02:00
Max Kellermann
36ec2edacf directory: renamed directory_get_directory()
Renamed directory_get_directory() to directory_lookup_directory().
Added API documentation.
2009-04-01 18:41:33 +02:00
Max Kellermann
cb35d6e687 sticker_print: new library for sending stickers to a client 2009-04-01 17:30:56 +02:00
Max Kellermann
efcf40f55b sticker: pass const sticker to sticker_foreach() 2009-04-01 17:27:59 +02:00
Max Kellermann
8ce2ec7aed client, event_pipe: explicitly ignore the write() result
On both locations, the result of write() can be ignored safely.  In
event_pipe_emit_fast(), that can only be "EAGAIN", which means that
the pipe buffer is full - no further notification required.  In
client_init(), that would be a fatal connection error, which would be
caught by the next event.

This patch fixes gcc warnings.
2009-04-01 17:14:25 +02:00
Max Kellermann
a96bec3655 socket_util: fixed format warning
g_set_error() is a printf-like function, and expects a format string.
Using the return value of gai_strerror() is unsafe.
2009-04-01 16:45:03 +02:00
Max Kellermann
6419cc54ac flac: fixed "unused variable" warning without libcue
Move the declaration of "i" into the "for" loop.
2009-04-01 16:44:27 +02:00
Jochen Keil
4bfbdfe5c5 Tag subtracks according to "cuesheet" vorbis comment value
Cuesheets are often saved as vorbis comment
flac files (CUESHEET=.. case doesn't matter).
We can parse this now and use the information to
tag the subtracks (from the embedded cuesheets).
2009-03-31 22:17:56 +02:00
Jochen Keil
d7b0c768b0 track length is computed correctly now 2009-03-31 22:17:56 +02:00
Jochen Keil
6720a0a940 free previously allocated flac metadata object 2009-03-31 22:17:56 +02:00
Jochen Keil
a1bde6b99d remove old commented code 2009-03-31 22:17:56 +02:00
Jochen Keil
d41e7f7cec Build tags from information in cue sheets
With these methods a tag struct can be created
from the cdtext information in a cue sheet.
The methods depend on a cue parsing library.
Reading from strings (char*) as well as from
a file (FILE*) is supported.
2009-03-31 22:17:56 +02:00
Romain Bignon
62a72a5e4d do not consider single mode with "next" command
This is a little ugly, but as nextSongInPlaylist is both called when
queued is update (in case playlist ended) and for user "next" command,
there isn't any other (simple) solution
2009-03-31 14:15:33 +02:00
Avuton Olrich
98e81287e3 client: group static function declarations together. 2009-03-30 19:21:42 +02:00
Avuton Olrich
ee7369a8f1 queue_print: queue_print_song_info() is not necessry for export. 2009-03-30 19:21:41 +02:00
Avuton Olrich
68a4bb90da queue: queue_generate_id() is not necessary for export. 2009-03-30 19:21:41 +02:00
Avuton Olrich
ed96db3fae player_control: remove unused function playerCurrentDecodeSong(). 2009-03-30 19:21:41 +02:00
Avuton Olrich
6405db931b conf: config_param_free() not necessary for export. 2009-03-30 19:21:41 +02:00
Avuton Olrich
96ab110b44 command: command_error() is not necessary for export. 2009-03-30 19:21:41 +02:00
Avuton Olrich
215cdda08d client: client_write() does not necessary for export. 2009-03-30 19:21:41 +02:00
Romain Bignon
e81f683a18 implemented the 'consume' mode
Consume mode removes each song played
2009-03-30 17:37:55 +02:00
Jochen Keil
80e2aaf379 Bugfix for time/offset in flac plugin
Previous cast to float didn't have any effect because one value is uint
and the other is a floating type but the number itself is even..
This caused some tracks to end before they were really at an end.
2009-03-28 10:13:44 +01:00
Max Kellermann
43864762ee mixer: assert that the new volume value is valid
Added an assertion in mixer_set_volume().  Removed the range checks
from the ALSA and OSS plugins.
2009-03-27 20:10:39 +01:00
Max Kellermann
49e548e773 mpcdec: changed plugin name to "mpcdec"
The "mpcdec" plugin is based on the libmpcdec library.
2009-03-27 19:58:50 +01:00
Max Kellermann
f5548a8654 mpcdec: support the new libmpcdec SV8 API 2009-03-27 19:51:59 +01:00
Max Kellermann
0e18fab655 mpcdec: no CamelCase
Renamed variables and functions.
2009-03-27 19:37:08 +01:00
Max Kellermann
86827fc63e tag_pool: use memcmp() instead of strcmp() for non-terminated string
The strings passed to tag_pool_get_item() are not null-terminated, and
the caller passes the string length.  Don't assume it is
null-terminated anyway by using strcmp().
2009-03-27 19:36:24 +01:00
Max Kellermann
51894725ec tag_pool: use size_t for string length 2009-03-27 19:36:03 +01:00
Sean McNamara
94479ca40f event_pipe can only be non-blocking if !WIN32 2009-03-27 18:03:46 +01:00
Sean McNamara
f5ff243a8b More debugging for Win32 ioctlsocket: complain if it's not a Winsock
socket, because there is no ioctl for non-sockets on Windows
2009-03-27 18:03:10 +01:00
Sean McNamara
37531f6f1e Add winsock2 headers for curl's use of select() on sockets 2009-03-27 18:03:03 +01:00
Sean McNamara
b1e0bde529 Uniform getaddrinfo() on WIN32 or POSIX, because MinGW now supports it 2009-03-27 18:02:56 +01:00
Sean McNamara
9c63ffa546 Winsock2 is needed on MinGW (or other pure Win32 toolchains) for
networking, select(), ntohl(), etc.
2009-03-27 18:02:31 +01:00
Max Kellermann
b91517e761 sticker: move SQLite statements into an array
Simplify initialization and finalization.
2009-03-27 17:05:04 +01:00
Max Kellermann
7d3921bb88 pulse_mixer: protect the struct with a mutex
There are numerous race conditions between the libpulse thread
(pulse_mixer.c callbacks) and the rest of MPD.  Protect the volatile
attributes of the pulse_mixer struct with a mutex to fix that.
2009-03-27 16:55:17 +01:00
Max Kellermann
7f762a5cec pulse_mixer: return if mixer is offline
Eliminate one indent level.  Also remove several debug useless debug
messages.
2009-03-27 16:44:37 +01:00
Max Kellermann
13319e0b70 pulse_mixer: removed superfluous G_GNUC_UNUSED attributes
Those parameters are used after all.
2009-03-27 16:44:36 +01:00
Max Kellermann
d448392f25 pulse_mixer: use local pa_cvolume variable for set_volume()
Don't mess with pulse_mixer.volume for setting the volume.  This
variable should only be used to transfer the current volume from
sink_input_vol() to pulse_mixer_get_volume().
2009-03-27 16:44:36 +01:00
Max Kellermann
8258457b43 pulse_mixer: wait for get_volume() operation to complete
The pa_context_get_sink_input_info() function is asynchronous, and
after it returns, libpulse does not guarantee that the operation has
completed yet; in fact, it is not likely.  Explicitly wait for the
operation to complete.

The code for the new pulse_wait_for_operation() function was inspired
by mplayer and xine code.
2009-03-27 16:44:36 +01:00
Max Kellermann
1a411b1ced mixer_control: don't lock the mutex twice in mixer_failed()
The function mixer_failed() expects the mixer mutex to be already
locked, yet it calls mixer_close(), which attempts to lock the mutex
again, deadlocking itself.
2009-03-27 16:44:31 +01:00
Romain Bignon
e7519829ac renamed smartstop to single and changed behavior
When single mode is enabled, after current song it stops playback,
or it replay same song if repeat mode is activated.
2009-03-27 15:28:49 +01:00
Romain Bignon
e46722b2eb implements the smartstop feature
The smartstop feature is a way to tell mpd to stop playing after
current song.
This patche provides:
- 'state' command returns 'smartstop' state (1 or 0)
- 'smartstop' can activate or not the smartstop state
- when song is terminated, mpd stops playing and smartstop is set to 0
2009-03-27 14:58:31 +01:00
Max Kellermann
929c200c38 pulse_mixer: adapted code style
Use the same code style as the rest of MPD.
2009-03-27 00:43:47 +01:00
Max Kellermann
207786ffb1 output_all: synchronize playback with player_control.notify
This patch fixes a longer delay when moving around songs in the
playlist.  The main thread wants to enqueue a new "next" song into the
player thread, but the player thread is waiting inside
audio_output_all_wait() for the output threads.  Use
player_control.notify there, so audio_output_all_wait() gets woken up
by the main thread, too.
2009-03-26 23:40:50 +01:00
Max Kellermann
ed4837662a playlist_state: fix playback restore in random mode
The functions playPlaylist() and seekSongInPlaylist() expect a song
position, not a song order number.  Don't convert the "current"
variable with queue_position_to_order().
2009-03-26 22:16:51 +01:00
Jeffrey Middleton
13208bf5a7 queue/playlist/command: move range
The move command now accepts a range for the first argument, in the same
form as other range commands, e.g. move 15:17 3.  The first song in the
range is placed at the destination position. Note that as with other
range commands, the range is inclusive on the left only; this example
would move only songs 15 and 16, not 17.

[mk: fixed signed/unsigned warnings; use G_MAXUINT instead of
UINT_MAX]
2009-03-26 22:02:56 +01:00
Max Kellermann
4343c108b3 pulse_mixer: removed superfluous initializations
Don't initialize attributes which are only used in an open mixer.  As
long as nobody accesses them, their values are uninitialized and
undefined.
2009-03-26 19:50:31 +01:00
Max Kellermann
239e6da442 pulse_mixer: allocate "volume" statically
The pm->volume attribute was allocated in pulse_mixer_init(), but is
never freed.  This leaks memory.  Instead of adding the g_free() call
to pulse_mixer_finish(), let's just make "volume" a static attribute
of the pulse_mixer struct.  That is easier to deal with.
2009-03-26 19:50:27 +01:00
Max Kellermann
6c480d7db4 pulse_mixer: removed superfluous NULL checks in close()
When the MPD core knows that the pulse mixer is open, pm->mainloop and
pm->context must be non-NULL.
2009-03-26 19:50:23 +01:00
Max Kellermann
8cf206f2ee pulse_mixer: initialize "online" and "index" in open()
The attributes "online" and "index" were not properly reinitialized
after a close/open cycle.
2009-03-26 19:50:15 +01:00
Max Kellermann
52575d1b9d pulse: make configuration strings const
Nobody needs to modify these strings.  We can make them const, and
convert config_dup_block_string() to config_get_block_string().  This
also fixes memory leaks in the pulse mixer.
2009-03-26 19:50:10 +01:00
Max Kellermann
cd4964cdee pulse: don't check config_param!=NULL
The conf.h functions deal well with config_param==NULL and will return
the specified default value then.
2009-03-26 19:50:02 +01:00
Max Kellermann
74273d419a pulse_mixer: free libpulse objects on failure
When the mixer initialization fails, we have to free the libpulse
objects we have already created, to prevent resource leaks.
2009-03-26 19:49:58 +01:00
Max Kellermann
3d2c8b001a pulse_mixer: unlock the mainloop on failure
It's illegal to return from pulse_mixer_setup() without unlocking the
main loop.  In the error handling, that unlock() call was missing.
2009-03-26 19:49:55 +01:00
Max Kellermann
d113c07190 pulse_mixer: moved code to pulse_mixer_setup()
Prepare for adding proper error handling.
2009-03-26 19:49:39 +01:00
Max Kellermann
3be1850744 alsa_mixer: initialize "volume_set" in the open() method
"volume_set" is an attribute which becomes undefined when the mixer is
closed.  That means, it must be initialized each time the mixer is
opened.
2009-03-26 19:49:36 +01:00
Max Kellermann
0c9799babe alsa_mixer: removed superfluous checks
The MPD core guarantees that methods are always invoked in a
consistent state.  This means we can remove lots of checks from the
volume methods.
2009-03-26 19:49:31 +01:00
Max Kellermann
331b714a7a alsa_mixer: pass default device to config_get_block_string()
Instead of replacing NULL with the default device in the open()
method, pass the default device to config_get_block_string().
2009-03-26 19:49:26 +01:00
Max Kellermann
f06f049cd8 alsa_mixer: make "device" and "control" const
Use config_get_block_string() instead of config_dup_block_string().
2009-03-26 19:48:55 +01:00
Max Kellermann
c552d17c03 oss_mixer: call oss_find_mixer() in init() method
Detect misconfiguration during MPD startup.
2009-03-26 19:48:21 +01:00
Max Kellermann
881026623c oss_mixer: removed superfluous checks
The MPD core guarantees that methods are always invoked in a
consistent state.  This means we can remove lots of checks from the
volume methods.
2009-03-26 19:48:13 +01:00
Max Kellermann
dd8c6d6738 oss_mixer: use g_ascii_strncasecmp() instead of strncasecmp()
strncasecmp() is locale dependent, but we only need ASCII here.
2009-03-26 19:47:52 +01:00
Max Kellermann
114d5982bb oss_mixer: pass default path to config_get_block_string()
Instead of replacing NULL with the default path in the open() method,
pass the default path to config_get_block_string().
2009-03-26 19:47:47 +01:00
Max Kellermann
aec4fe06b5 oss_mixer: make "device" and "control" const
Use config_get_block_string() instead of config_dup_block_string().
2009-03-26 19:46:46 +01:00
Max Kellermann
69759b573f mixer: don't reopen failed mixer automatically
If a (global) mixer has been closed due to failure, don't reopen it
with every volume get/set.  Leave it closed until it is explicitly
opened.
2009-03-26 19:46:39 +01:00
Max Kellermann
1fcf09a816 mixer_control: close mixer on failure
When getting or setting the volume fails, the MPD core close the
mixer.  Moved the duplicated code from the mixer plugins.
2009-03-26 19:46:33 +01:00