| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
| |
sticker_list_values() is only used internally in sticker.c. Remove
sticker_song_list_values() completely, it is superseded by
sticker_song_get().
|
| |
|
|
|
|
|
| |
The sticker struct can be used for enumerating values. This will
replace the sticker_list_values() function.
|
|
|
|
| |
Don't dump the volume of all mixers.
|
|
|
|
|
|
|
| |
In some rare cases, there was a race condition between the output
thread and the main thread: when you disable/enable an output device
in the main thread, this caused a crash in the output thread. Protect
the whole mixer struct with a GMutex to prevent that.
|
| |
|
|
|
|
|
|
| |
This patch allows the output plugins to import only mixer_list.h,
instead of the full mixer_api.h (which would expose internal
structures).
|
|
|
|
|
|
| |
mixer_control.h should provide the functions needed to manipulate a
mixer, without exposing the internal mixer API (which is provided by
mixer_api.h).
|
| |
|
| |
|
| |
|
|
|
|
|
| |
Return true/false on success/failure, instead of 0/-1. Pass
true/false instead of 1/0 for the "rel" boolean parameter.
|
|
|
|
| |
Check for NULL not necessary here
|
|
|
|
|
|
|
|
| |
This updates the copyright header to all be the same, which is
pretty much an update of where to mail request for a copy of the GPL
and the years of the MPD project. This also puts all committers under
'The Music Player Project' umbrella. These entries should go
individually in the AUTHORS file, for consistancy.
|
| |
|
|
|
|
|
|
|
|
| |
When the destination chunk was empty in cross_fade_apply(), it had no
audio_format attached (an attribute which is only used for assertion
in the debug build). cross_fade_apply() should assign it the
audio_format of the second chunk (if available), otherwise MPD will
crash.
|
|
|
|
|
|
|
|
| |
When there are chunks which are not yet finished,
audio_output_all_check() returned the size of its music pipe minus
one. I can't remember exactly why I subtracted 1 from the return
value, it must have had something to do with a former meaning of this
function. Now it induces assertion failures.
|
|
|
|
| |
When an audio output device is disabled, also disable its mixer.
|
|
|
|
|
| |
No caller must ever pass an invalid device number to
mixer_control_setvol() or mixer_control_getvol().
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
| |
Replaced both player_stop_decoder() invocations with player_dc_stop(),
which also cleans up the pipe.
|
|
|
|
|
| |
In the "CANCEL" command handler, the decoder is stopped twice: first
by player_dc_stop(), then by dc_stop(). Remove the latter.
|
|
|
|
| |
This function was part of a workaround which we don't need anymore.
|
|
|
|
|
|
|
| |
After adding the container_scan() method the update_regular_file() method was quite hard to read.
Now there's update_container_file() which deals with container files.
That way normal container files (i.e. without embedded tracks) are handled by the old code like a regular file.
This will fix some of the odd behaviour observed.
|
|
|
|
|
| |
snd_pcm_writei() returns the type snd_pcm_sframes_t, not int. Use the
correct variable type.
|
|
|
|
|
|
| |
If the PCM handle gets disconnected, don't close and clear it in
alsa_recover(). The MPD core will call alsa_close() anyway. This
way, we can always assume that alsa_data.pcm is always valid.
|
|
|
|
|
|
| |
After a seek, wait until enough new chunks are decoded before starting
playback. If this takes too long, send silence chunks to the audio
outputs meanwhile.
|
|
|
|
|
|
| |
When the audio outputs are closed, also clear the audio format. If we
don't do this, every call to audio_output_all_update() will open the
device, even if it's meant to be paused.
|
|
|
|
|
|
| |
Don't allow reopening an audio device after pause with
audio_format==NULL, force the caller to provide the audio_format each
time.
|
|
|
|
|
|
|
| |
When playback is unpaused, pass the audio_format to
audio_output_all_open(). Don't assume that output_all.c remembers the
previous audio format. Also check if there has been an audio format
yet.
|
| |
|
|
|
|
|
|
|
| |
Check audio_output.command after each sub-chunk has been played. It
discards the rest of the chunk, but since all commands make the device
stop anyway, this is not a problem, but part of the improvement. This
improves the latency of audio output commands.
|
|
|
|
|
|
| |
When seeking into a new song, and the decoder for the new song fails
to start up, MPD forgot to send the "command_finished" signal to the
main thread.
|
|
|
|
|
|
| |
When pc.next_song is reset due to a decoder failure, also reset the
player.queued flag. player.queued must not be true when there is no
pc.next_song.
|
|
|
|
|
|
| |
Reset player.xfade and player.buffering from within
player_seek_decoder(), not in the player_process_command() switch
statement.
|
|
|
|
|
|
|
|
| |
A larger chunk size means less overhead for managing them. 4 kB seems
to be a reasonable choice: it contains 23 ms of 44.1 kHz 16 bit stereo
data, or 3 ms of 192 kHz 24 bit stereo data. The original value of
1020 seemed to be too small, there were quite a lot of system calls
and context switches.
|
|
|
|
|
| |
The music_buffer is a global variable, and must not be freed until the
player thread exits.
|
|
|
|
|
|
|
|
| |
Instead of passing individual buffers to audio_output_all_play(), pass
music_chunk objects. Append all those chunks asynchronously to a
music_pipe instance. All output threads may then read chunks from
this pipe. This reduces MPD's internal latency by an order of
magnitude.
|
|
|
|
|
|
| |
When a PAUSE command is received while the decoder starts, don't open
the audio device when the decoder becomes ready. It's pointless,
because MPD will close if after that.
|
| |
|
|
|
|
| |
Moved some more cruft out of do_play().
|
|
|
|
| |
Moved some cruft out of do_play().
|
|
|
|
|
|
| |
Preparation for the next patch: since the output devices stay open
even when the player thread stops playing, we will need a persistent
music buffer.
|
|
|
|
|
| |
audio_output_open() is only called by audio_output_update(). Don't
export it.
|
|
|
|
|
| |
When a music chunk is freed (returned to the buffer), poison its
memory.
|
|
|
|
|
|
| |
If the header valgrind/memcheck.h is available, add
VALGRIND_MAKE_MEM_NOACCESS() and VALGRIND_MAKE_MEM_UNDEFINED()
support, which enables nice warnings in the valgrind memory checker.
|
|
|
|
|
| |
Memory poisoning is useful for marking memory regions as "undefined".
This poisoning only enabled in the debug build (!NDEBUG).
|