| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
| |
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).
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
| |
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
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
Consume mode removes each song played
|
|
|
|
|
|
| |
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.
|
|
|
|
|
| |
Added an assertion in mixer_set_volume(). Removed the range checks
from the ALSA and OSS plugins.
|
|
|
|
| |
The "mpcdec" plugin is based on the libmpcdec library.
|
| |
|
|
|
|
| |
Renamed variables and functions.
|
|
|
|
|
|
| |
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().
|
| |
|
| |
|
|
|
|
| |
socket, because there is no ioctl for non-sockets on Windows
|
| |
|
| |
|
|
|
|
| |
networking, select(), ntohl(), etc.
|
|
|
|
| |
Simplify initialization and finalization.
|
|
|
|
|
|
| |
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.
|
|
|
|
|
| |
Eliminate one indent level. Also remove several debug useless debug
messages.
|
|
|
|
| |
Those parameters are used after all.
|
|
|
|
|
|
| |
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().
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
| |
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.
|
|
|
|
|
| |
When single mode is enabled, after current song it stops playback,
or it replay same song if repeat mode is activated.
|
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
| |
Use the same code style as the rest of MPD.
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
| |
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().
|
|
|
|
|
|
|
|
|
|
|
| |
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]
|
|
|
|
|
|
| |
Don't initialize attributes which are only used in an open mixer. As
long as nobody accesses them, their values are uninitialized and
undefined.
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
| |
When the MPD core knows that the pulse mixer is open, pm->mainloop and
pm->context must be non-NULL.
|
|
|
|
|
| |
The attributes "online" and "index" were not properly reinitialized
after a close/open cycle.
|
|
|
|
|
|
| |
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.
|
|
|
|
|
| |
The conf.h functions deal well with config_param==NULL and will return
the specified default value then.
|
|
|
|
|
| |
When the mixer initialization fails, we have to free the libpulse
objects we have already created, to prevent resource leaks.
|
|
|
|
|
| |
It's illegal to return from pulse_mixer_setup() without unlocking the
main loop. In the error handling, that unlock() call was missing.
|
|
|
|
| |
Prepare for adding proper error handling.
|
|
|
|
|
|
| |
"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.
|
|
|
|
|
|
| |
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.
|