aboutsummaryrefslogtreecommitdiffstats
path: root/src/player_thread.c (unfollow)
Commit message (Collapse)AuthorFilesLines
2009-11-03decoder_control: pass pipe and buffer to dc_start()Max Kellermann1-10/+5
Don't access decoder_control attributes directly.
2009-11-03player_thread: lock inside player_wait_for_decoder()Max Kellermann1-7/+17
Lock the player_control object when modifying its attributes.
2009-11-03player_thread: moved code to player_dc_start()Max Kellermann1-5/+20
2009-11-03decoder_control: merge next_song and current_songMax Kellermann1-9/+3
These two variables are redundant, we need only one of them.
2009-11-03player_thread: don't set errored_song on audio errorMax Kellermann1-2/+0
It's not used if pc.error==PLAYER_ERROR_AUDIO.
2009-11-03player_thread: don't start the decoder asynchronouslyMax Kellermann1-4/+2
The START command returns without blocking; we don't need the asynchronous decoder start anymore.
2009-11-02player_thread: check command before waiting during pauseMax Kellermann1-1/+3
While paused, the player thread re-locks its mutex and waits for a signal. This is racy: when the command is set while the thread is waiting for the lock, it may wait forever. This patch adds another command check before player_wait().
2009-10-31decoder_control: removed the global variable "dc"Max Kellermann1-71/+88
Allocate a decoder_control object where needed, and pass it around. This will allow more than one decoder thread one day.
2009-10-31player_thread: simplified thread destructionMax Kellermann1-4/+2
Simply use "return" instead of g_thread_exit().
2009-10-31player_control: protect command, state, error with a mutexMax Kellermann1-27/+113
Use GMutex/GCond instead of the notify library. Manually lock the player_control object before accessing the protected attributes. Use the GCond object to notify the player thread and the main thread.
2009-10-30{player,output}_thread: fixed elapsed_time quirksMax Kellermann1-0/+16
Right after seeking and song change, the elapsed_time shows old information, because the output thread didn't finish a full chunk yet. This patch re-adds a second elapsed_time variable, and keeps track of a fallback value, in case the output thread can't provide a reliable value.
2009-10-29player_thread: set error status in play_next_chunk()Max Kellermann1-4/+3
Don't set the error in play_chunk(); do all the error handling in the caller. The errored_song attribute isn't set anymore; it doesn't make sense for PLAYER_ERROR_AUDIO.
2009-10-23output_plugin: added methods enable() and disable()Max Kellermann1-0/+10
With these methods, an output plugin can allocate some global resources only if it is actually enabled. The method enable() is called after daemonization, which allows for more sophisticated resource allocation during that method.
2009-10-15player_thread: don't call audio_output_all_check() if pausedMax Kellermann1-1/+2
When the audio output fails to open, MPD pauses playback, but doesn't reset player.play_audio_format. This leads to an assertion failure in audio_output_all_check() on the next REFRESH command, because no audio output is open.
2009-10-13song: renamed attribute "url" to "uri"Max Kellermann1-4/+4
2009-10-08player_thread: get "elapsed" from audio outputsMax Kellermann1-4/+13
Tracking the "elapsed" time from the chunks which we have sent to the output pipe is very imprecise: since we have implemented the music pipe, we're sending large number of chunks at once, giving the "elapsed" time stamp a resolution of usually more than a second. This patch changes the source of this information to the outputs. If a chunk has been played by all outputs, the "elapsed" time stamp is updated. The new command PLAYER_COMMAND_REFRESH makes the player thread update its status information: it tells the outputs to update the chunk time stamp. After that, player_control.elapsed_time is current.
2009-10-08player_thread: always clear player_control.next_song on returnMax Kellermann1-5/+3
pc.next_song might be non-NULL even if player.queued==true: when the decoder has started decoding the next song, but the result hasn't been read yet.
2009-10-08player_control: eliminate PLAYER_COMMAND_PLAYMax Kellermann1-2/+0
Sending PLAYER_COMMAND_STOP followed by PLAYER_COMMAND_QUEUE does the same. PLAYER_COMMAND_PLAY is redundant.
2009-08-13decoder_control: protect command, state with a mutexMax Kellermann1-7/+23
Replace decoder_control.notify with decoder_control.mutex and decoder_control.cond. Lock the mutex on all accesses to decoder_control.command and decoder_control.state.
2009-07-23player_thread: don't use precalculated size_to_timeMax Kellermann1-13/+4
Calculate the total play time with the audio_format object each time, using audio_format_time_to_size(). The function audioFormatSizeToTime() is not needed anymore, and will be removed with this patch.
2009-07-23player_thread: moved code to update_song_tag()Max Kellermann1-19/+27
2009-07-06player_thread: log played song in "default" log modeSébastien Houzé1-0/+6
Very few lines to log a song URI when it has been entirely played. Then mpd logs can be parsed to do statistics.
2009-07-06output: use the software mixer pluginMax Kellermann1-14/+0
Do all the software volume stuff inside each output thread, not in the player thread. This allows one software mixer per output device, and also allows the user to configure the mixer type (hardware or software) for each audio output. This moves the global "mixer_type" setting into the "audio_output" section, deprecating the "mixer_enabled" flag.
2009-06-02player_thread: check pipe size again before exitingMax Kellermann1-1/+5
When the decoder is finished, break out of the player loop only after another player.pipe check. We did check the pipe size a few lines above, but that check was kind of racy.
2009-06-02player_thread: don't leak empty music_chunksMax Kellermann1-1/+3
When a music_chunk only contains a tag but no PCM data, play_chunk() returns true without freeing the chunk. The caller now assumes that the chunk is moved into some music_pipe and does not bother to free it either.
2009-05-29player_thread: reinitialize music_buffer in !NDEBUGMax Kellermann1-0/+9
To check for leaked music_chunk objects, free the music buffer on CLOSE_AUDIO. This invokes an assertion check which ensures that all chunks have been returned to the buffer.
2009-04-25player_thread: pause when all audio outputs fail to playMax Kellermann1-2/+7
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-25player_thread: pause when output fails while seekingMax Kellermann1-7/+11
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-03-25player_thread: wait for decoder before seekingMax Kellermann1-0/+11
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-25output_all: moved code to audio_output_all_wait()Max Kellermann1-10/+2
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-17player_thread: ignore time stamp on empty chunksMax Kellermann1-3/+6
If a music_chunk does not contain any PCM data, then the "times" and "bit_rate" attributes are undefined.
2009-03-13all: Update copyright header.Avuton Olrich1-3/+4
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-11player_thread: added commentsMax Kellermann1-21/+69
2009-03-11player_thread: removed player_stop_decoder()Max Kellermann1-14/+6
Replaced both player_stop_decoder() invocations with player_dc_stop(), which also cleans up the pipe.
2009-03-11player_thread: don't call dc_stop() twiceMax Kellermann1-3/+1
In the "CANCEL" command handler, the decoder is stopped twice: first by player_dc_stop(), then by dc_stop(). Remove the latter.
2009-03-10player_thread: fill buffer after seekingMax Kellermann1-3/+9
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-10player_thread: pass format to audio_output_all_open() after resumeMax Kellermann1-8/+12
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-10player_thread: moved code to player_send_silence()Max Kellermann1-22/+39
2009-03-10player_thread: finish failed seek commandMax Kellermann1-1/+5
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-10player_thread: clear player.queued after failureMax Kellermann1-0/+1
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-10player_thread: moved code to player_seek_decoder()Max Kellermann1-12/+15
Reset player.xfade and player.buffering from within player_seek_decoder(), not in the player_process_command() switch statement.
2009-03-10player_thread: don't free music buffer after decoder failureMax Kellermann1-1/+0
The music_buffer is a global variable, and must not be freed until the player thread exits.
2009-03-09output: play from a music_pipe objectMax Kellermann1-13/+59
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-09player_thread: don't open audio device when pausedMax Kellermann1-4/+2
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-09player_thread: moved code to player_song_border()Max Kellermann1-6/+19
Moved some more cruft out of do_play().
2009-03-09player_thread: moved code to play_next_chunk()Max Kellermann1-73/+103
Moved some cruft out of do_play().
2009-03-09player_thread: make the music_buffer instance globalMax Kellermann1-14/+15
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-08music_chunk: added assertions on the audio formatMax Kellermann1-0/+2
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-07player_thread: moved code to player_check_decoder_startup()Max Kellermann1-40/+69
2009-03-06pipe: added music_buffer, rewrite music_pipeMax Kellermann1-58/+83
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.