- 27 Mar, 2009 2 commits
-
-
Romain Bignon authored
When single mode is enabled, after current song it stops playback, or it replay same song if repeat mode is activated.
-
Romain Bignon authored
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
-
- 26 Mar, 2009 30 commits
-
-
Max Kellermann authored
Use the same code style as the rest of MPD.
-
Max Kellermann authored
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.
-
Max Kellermann authored
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().
-
Jeffrey Middleton authored
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]
-
Jeffrey Middleton authored
Clearly specified the format (song1:song2) for range argumentst, and added the range capability of the playlistinfo command.
-
Jeffrey Middleton authored
moveid uses an index, not a songid, for its second argument
-
Max Kellermann authored
Added g_strerror() and dlopen() suppressions.
-
Max Kellermann authored
Don't initialize attributes which are only used in an open mixer. As long as nobody accesses them, their values are uninitialized and undefined.
-
Max Kellermann authored
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.
-
Max Kellermann authored
When the MPD core knows that the pulse mixer is open, pm->mainloop and pm->context must be non-NULL.
-
Max Kellermann authored
The attributes "online" and "index" were not properly reinitialized after a close/open cycle.
-
Max Kellermann authored
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.
-
Max Kellermann authored
The conf.h functions deal well with config_param==NULL and will return the specified default value then.
-
Max Kellermann authored
When the mixer initialization fails, we have to free the libpulse objects we have already created, to prevent resource leaks.
-
Max Kellermann authored
It's illegal to return from pulse_mixer_setup() without unlocking the main loop. In the error handling, that unlock() call was missing.
-
Max Kellermann authored
Prepare for adding proper error handling.
-
Max Kellermann authored
"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.
-
Max Kellermann authored
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.
-
Max Kellermann authored
Instead of replacing NULL with the default device in the open() method, pass the default device to config_get_block_string().
-
Max Kellermann authored
Use config_get_block_string() instead of config_dup_block_string().
-
Max Kellermann authored
Detect misconfiguration during MPD startup.
-
Max Kellermann authored
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.
-
Max Kellermann authored
strncasecmp() is locale dependent, but we only need ASCII here.
-
Max Kellermann authored
Instead of replacing NULL with the default path in the open() method, pass the default path to config_get_block_string().
-
Max Kellermann authored
Use config_get_block_string() instead of config_dup_block_string().
-
Max Kellermann authored
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.
-
Max Kellermann authored
When getting or setting the volume fails, the MPD core close the mixer. Moved the duplicated code from the mixer plugins.
-
Max Kellermann authored
Remember if a mixer object is open or closed. Don't call open() again if it is already open. This guarantees that the mixer plugin is always called in a consistent state, and we will be able to remove lots of checks from the implementations. To support mixers which are automatically opened even if the audio output is still closed (to set the volume before playback starts), this patch also adds the "global" flag to the mixer_plugin struct. Both ALSA and OSS set this flag, while PULSE does not.
-
Max Kellermann authored
As a side effect, the previous patch added the mixer==NULL checks. It is now illegal to call mixer functions with a NULL argument. Convert the runtime checks to assertions.
-
Max Kellermann authored
The mixer core library is now responsible for creating and managing the mixer object. This removes duplicated code from the output plugins.
-
- 25 Mar, 2009 5 commits
-
-
Max Kellermann authored
When the decoder initialization has not been completed yet, all calls to dc_seek() will fail, because dc.seekable is not initialized yet. Wait for the decoder to complete its initialization, i.e. until it has called decoder_initialized().
-
Max Kellermann authored
Don't start playback as soon as the "current" song is being loaded from the state file. That is unclean, and leads to an obscure bug: in repeat mode, when the song is started (which is yet the last song in the list), the playlist code marked the very first song in the playlist as "next" song, because the end of the playlist was wrapped. It's easier to set up the playback after all songs have been loaded, and after the random/repeat mode has been set.
-
Max Kellermann authored
Use audio_output_client_notify instead of g_usleep(1ms) in audio_output_all_wait() to synchronize with the output_thread. Signal the audio_output_client_notify object in ao_play().
-
Max Kellermann authored
Synchronization with the output thread will be implemented in output_all.c, not in player_thread.c. Currently, that's just a simple g_usleep(1ms).
-
Max Kellermann authored
There was a deadlock between the output thread and the player thread: when the output thread failed (and closed itself) while the player thread worked with the audio_output object, MPD could crash.
-
- 21 Mar, 2009 1 commit
-
-
Viliam Mateicka authored
-
- 20 Mar, 2009 2 commits
-
-
Max Kellermann authored
To prevent a race condition, close the output thread before assigning the new audio format.
-
Max Kellermann authored
The config_audio_format used to contain the configured audio format, which is copied to out_audio_format. Let's convert the former to a boolean, which indicates whether out_audio_format was already set. This simplifies some code and saves a few bytes.
-