Commit Graph

118 Commits

Author SHA1 Message Date
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
209c8a540c player_thread: wait for decoder before seeking
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().
2009-03-25 19:48:14 +01:00
Max Kellermann
933fcf4232 output_all: moved code to audio_output_all_wait()
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).
2009-03-25 18:00:31 +01:00
Max Kellermann
47bbb73ee1 player_thread: ignore time stamp on empty chunks
If a music_chunk does not contain any PCM data, then the "times" and
"bit_rate" attributes are undefined.
2009-03-17 20:28:37 +01:00
Avuton Olrich
0aee49bdf8 all: Update copyright header.
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.
2009-03-13 11:51:55 -07:00
Max Kellermann
bc3702a4fd player_thread: added comments 2009-03-11 09:35:16 +01:00
Max Kellermann
13cd6b2834 player_thread: removed player_stop_decoder()
Replaced both player_stop_decoder() invocations with player_dc_stop(),
which also cleans up the pipe.
2009-03-11 09:20:34 +01:00
Max Kellermann
903a07b80e player_thread: don't call dc_stop() twice
In the "CANCEL" command handler, the decoder is stopped twice: first
by player_dc_stop(), then by dc_stop().  Remove the latter.
2009-03-11 09:20:33 +01:00
Max Kellermann
538701e7c6 player_thread: fill buffer after seeking
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.
2009-03-10 21:19:51 +01:00
Max Kellermann
d3eccb2324 player_thread: pass format to audio_output_all_open() after resume
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.
2009-03-10 21:00:52 +01:00
Max Kellermann
a790b64568 player_thread: moved code to player_send_silence() 2009-03-10 20:43:19 +01:00
Max Kellermann
92d74d4a78 player_thread: finish failed seek command
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.
2009-03-10 18:04:09 +01:00
Max Kellermann
c6a43b691f player_thread: clear player.queued after failure
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.
2009-03-10 18:03:38 +01:00
Max Kellermann
7d52284a96 player_thread: moved code to player_seek_decoder()
Reset player.xfade and player.buffering from within
player_seek_decoder(), not in the player_process_command() switch
statement.
2009-03-10 17:52:38 +01:00
Max Kellermann
eeb54a5f35 player_thread: don't free music buffer after decoder failure
The music_buffer is a global variable, and must not be freed until the
player thread exits.
2009-03-10 07:17:14 +01:00
Max Kellermann
3291666b57 output: play from a music_pipe object
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.
2009-03-09 19:25:26 +01:00
Max Kellermann
ab3d7c29da player_thread: don't open audio device when paused
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.
2009-03-09 19:16:50 +01:00
Max Kellermann
9f79c05e43 player_thread: moved code to player_song_border()
Moved some more cruft out of do_play().
2009-03-09 19:15:14 +01:00
Max Kellermann
4459a46181 player_thread: moved code to play_next_chunk()
Moved some cruft out of do_play().
2009-03-09 19:14:06 +01:00
Max Kellermann
d213f9a3e5 player_thread: make the music_buffer instance global
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.
2009-03-09 19:12:06 +01:00
Max Kellermann
94d1a87d04 music_chunk: added assertions on the audio format
In !NDEBUG, remember which audio_format is stored in every chunk and
every pipe.  Check the audio_format of every new data block appended
to the music_chunk, and the format of every new chunk appended to the
music_pipe.
2009-03-08 13:45:24 +01:00
Max Kellermann
fc6d836a2d player_thread: moved code to player_check_decoder_startup() 2009-03-07 23:11:43 +01:00
Max Kellermann
01cf7feac7 pipe: added music_buffer, rewrite music_pipe
Turn the music_pipe into a simple music_chunk queue.  The music_chunk
allocation code is moved to music_buffer, and is now managed with a
linked list instead of a ring buffer.  Two separate music_pipe objects
are used by the decoder for the "current" and the "next" song, which
greatly simplifies the cross-fading code.
2009-03-06 00:42:03 +01:00
Max Kellermann
c655f804a9 music_pipe: moved struct music_chunk to chunk.h 2009-03-03 22:23:25 +01:00
Max Kellermann
b7bfa24f22 pcm_volume: return bool
Don't abort MPD when a sample format is not supported by pcm_volume().
2009-03-02 09:42:16 +01:00
Max Kellermann
bcdf947afc player_thread: removed meaningless warning on output failure
The warning message "problems opening audio device while playing ..."
does not help at all, and should be removed.  At this point, the real
error message has already been logged by the output thread.
2009-02-26 22:21:35 +01:00
Max Kellermann
9d2f16d827 player_thread: don't drop audio buffers when not seekable
When a file is not seekable, MPD dropped the audio buffers before even
attempting to seek.  This caused noticable sound corruption.  Fix:
first attempt to seek, and only if that succeeds, call
audio_output_all_cancel().
2009-02-17 23:57:10 +01:00
Max Kellermann
900784bb4e decoder_api: moved enum decoder_command to decoder_command.h
Minimize header dependencies, again.
2009-02-15 18:33:31 +01:00
Max Kellermann
4493a96425 output_all: no CamelCase
Renamed functions and variables.
2009-02-10 18:51:51 +01:00
Max Kellermann
a3a6eefcfe audio: moved code to output_all.c
Moved code which deals with all audio outputs at once into a separate
library.
2009-02-10 18:51:49 +01:00
Max Kellermann
2a388c2aa7 crossfade: don't use isCurrentAudioFormat()
The crossfading code shouldn't depend on the audio output code.  Pass
the current audio format to cross_fade_calc() and let it compare
directly, instead of using isCurrentAudioFormat().
2009-02-10 18:51:29 +01:00
Max Kellermann
c2bbf876fb player: added some more assertions
Assertions on pc.command and pc.next_song.
2009-02-10 08:18:28 +01:00
Max Kellermann
799d1c9dc2 player_thread: reset pc.next_song only if queued
When we reset pc.next_song if there is no song queued, this might
cause a race condition: the next song to be played is cleared, while
pc.command was already set.  Clear the "next_song" only if there is a
song queued for the current do_play() invocation.
2009-02-10 08:18:01 +01:00
Max Kellermann
2274434e53 player_thread: reset pc.next_song
After a player command (successful or not), reset pc.next_song,
because the queue is supposed to be empty then.  Otherwise,
playlist.queued and pc.next_song may disagree, which triggers an
assertion failure.
2009-02-10 00:17:34 +01:00
Max Kellermann
4b7c28f98e player_thread: set player error when output device fails
When the output device fails to play a chunk, set pc.error to
PLAYER_ERROR_AUDIO.  This way, the playlist knows that it should not
queue the next song.
2009-02-02 18:22:41 +01:00
Max Kellermann
85f7e964de player_thread: start decoder thread in player thread
Start the decoder thread when the player thread starts.  The decoder
thread is already stopped by the player thread.
2009-01-25 13:44:39 +01:00
Max Kellermann
d628eb3e8b player_control: added player_control.thread
player_control.thread contains the handle of the player thread, or
NULL if the player thread isn't running.
2009-01-25 13:44:33 +01:00
Max Kellermann
ac0e799965 decoder_control: added decoder_control.thread
decoder_control.thread contains the handle of the decoder thread, or
NULL if the decoder thread isn't running.
2009-01-25 13:44:27 +01:00
Max Kellermann
1d02318d21 player_thread: emit PLAYLIST event when new song fails
Break from the loop instead of returning the function.  This calls
player_stop_decoder(), which in turn emits the PLAYLIST event.  This
allows the playlist to re-start the player.
2009-01-21 16:44:32 +01:00
Max Kellermann
a088d9f851 player_thread: check for decoder failure before seeking
The function player_seek_decoder() starts the decoder, but does not
check the return value of player_wait_for_decoder().
2009-01-21 16:36:30 +01:00
Max Kellermann
38a9ad011a player_thread: use bool instead of int
Make player_wait_for_decoder() and play_chunk() return a bool instead
of 0/-1.
2009-01-21 16:31:15 +01:00
Max Kellermann
b14e48f930 player_thread: request next song only if new one starts playing
The player_thread loop requests the next song from the playlist as
soon as the decoder finishes the song which is currently being played.
This is superfluous, and can lead to synchronization errors and wrong
results.  The playlist already knows when the player starts playing
the next song (player_wait_for_decoder() triggers the PLAYLIST event),
and will then trigger the scheduler to provide the next song.
2009-01-21 16:17:57 +01:00
Max Kellermann
1379db379d player_thread: eliminated duplicate PLAYLIST event
player_wait_for_decoder() emits the PLAYLIST event on success, remove
the duplicate PLAYLIST event in its caller.
2009-01-20 23:11:01 +01:00
Max Kellermann
06bd9ad88f event_pipe: added "TAG" event
The "TAG" event is emitted by the player thread when the current
song's tag has changed.  Split this event from "PLAYLIST" and make it
a separate callback, which is more efficient.
2009-01-20 22:49:19 +01:00
Max Kellermann
9d0579996c pcm_utils: moved code to pcm_volume.c
Moved the software volume code to a separate library.
2009-01-07 18:05:38 +01:00
Max Kellermann
5e6ac50583 initialize GError pointers
GLib mandates that you initialize all GError objects with NULL prior
to passing it.
2009-01-04 19:51:54 +01:00
Max Kellermann
fed719197c song: allocate the result of song_get_url() 2009-01-04 19:09:34 +01:00
Max Kellermann
55b6fd2f0c player_thread: fix cross-fading duplicate chunk bug
When the decoder of the new song is not fast enough, the player thread
has to wait for it for a moment.  However the variable "nextChunk" was
reset to -1 during that, making the next loop iteration assume that
cross-fading has not begun yet.  This patch overwrites it with "0"
while waiting.
2009-01-04 14:55:02 +01:00
Max Kellermann
6d2e4f4e72 player: emit PLAYLIST event when stream tag changes
Commit b3e2635a introduced a regression: when a stream tag was
changed, the playlist version had to be updated.  This was done in
syncCurrentPlayerDecodeMetadata(), called by syncPlayerAndPlaylist().
After b3e2635a, this was not called anymore.  Fix this by emitting
PIPE_EVENT_PLAYLIST.
2009-01-03 20:49:51 +01:00