aboutsummaryrefslogtreecommitdiffstats
path: root/src/player_thread.c (follow)
Commit message (Collapse)AuthorAgeFilesLines
...
* | player_thread: log played song in "default" log modeSébastien Houzé2009-07-061-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.
* | output: use the software mixer pluginMax Kellermann2009-07-061-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.
* player_thread: check pipe size again before exitingMax Kellermann2009-06-021-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.
* player_thread: don't leak empty music_chunksMax Kellermann2009-06-021-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.
* player_thread: reinitialize music_buffer in !NDEBUGMax Kellermann2009-05-291-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.
* player_thread: pause when all audio outputs fail to playMax Kellermann2009-04-251-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.
* player_thread: pause when output fails while seekingMax Kellermann2009-04-251-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.
* player_thread: wait for decoder before seekingMax Kellermann2009-03-251-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().
* output_all: moved code to audio_output_all_wait()Max Kellermann2009-03-251-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).
* player_thread: ignore time stamp on empty chunksMax Kellermann2009-03-171-3/+6
| | | | | If a music_chunk does not contain any PCM data, then the "times" and "bit_rate" attributes are undefined.
* all: Update copyright header.Avuton Olrich2009-03-131-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.
* player_thread: added commentsMax Kellermann2009-03-111-21/+69
|
* player_thread: removed player_stop_decoder()Max Kellermann2009-03-111-14/+6
| | | | | Replaced both player_stop_decoder() invocations with player_dc_stop(), which also cleans up the pipe.
* player_thread: don't call dc_stop() twiceMax Kellermann2009-03-111-3/+1
| | | | | In the "CANCEL" command handler, the decoder is stopped twice: first by player_dc_stop(), then by dc_stop(). Remove the latter.
* player_thread: fill buffer after seekingMax Kellermann2009-03-101-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.
* player_thread: pass format to audio_output_all_open() after resumeMax Kellermann2009-03-101-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.
* player_thread: moved code to player_send_silence()Max Kellermann2009-03-101-22/+39
|
* player_thread: finish failed seek commandMax Kellermann2009-03-101-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.
* player_thread: clear player.queued after failureMax Kellermann2009-03-101-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.
* player_thread: moved code to player_seek_decoder()Max Kellermann2009-03-101-12/+15
| | | | | | Reset player.xfade and player.buffering from within player_seek_decoder(), not in the player_process_command() switch statement.
* player_thread: don't free music buffer after decoder failureMax Kellermann2009-03-101-1/+0
| | | | | The music_buffer is a global variable, and must not be freed until the player thread exits.
* output: play from a music_pipe objectMax Kellermann2009-03-091-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.
* player_thread: don't open audio device when pausedMax Kellermann2009-03-091-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.
* player_thread: moved code to player_song_border()Max Kellermann2009-03-091-6/+19
| | | | Moved some more cruft out of do_play().
* player_thread: moved code to play_next_chunk()Max Kellermann2009-03-091-73/+103
| | | | Moved some cruft out of do_play().
* player_thread: make the music_buffer instance globalMax Kellermann2009-03-091-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.
* music_chunk: added assertions on the audio formatMax Kellermann2009-03-081-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.
* player_thread: moved code to player_check_decoder_startup()Max Kellermann2009-03-071-40/+69
|
* pipe: added music_buffer, rewrite music_pipeMax Kellermann2009-03-061-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.
* music_pipe: moved struct music_chunk to chunk.hMax Kellermann2009-03-031-0/+1
|
* pcm_volume: return boolMax Kellermann2009-03-021-2/+11
| | | | Don't abort MPD when a sample format is not supported by pcm_volume().
* player_thread: removed meaningless warning on output failureMax Kellermann2009-02-261-5/+0
| | | | | | 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.
* player_thread: don't drop audio buffers when not seekableMax Kellermann2009-02-171-1/+2
| | | | | | | 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().
* decoder_api: moved enum decoder_command to decoder_command.hMax Kellermann2009-02-151-0/+1
| | | | Minimize header dependencies, again.
* output_all: no CamelCaseMax Kellermann2009-02-101-11/+11
| | | | Renamed functions and variables.
* audio: moved code to output_all.cMax Kellermann2009-02-101-1/+1
| | | | | Moved code which deals with all audio outputs at once into a separate library.
* crossfade: don't use isCurrentAudioFormat()Max Kellermann2009-02-101-0/+1
| | | | | | 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().
* player: added some more assertionsMax Kellermann2009-02-101-0/+2
| | | | Assertions on pc.command and pc.next_song.
* player_thread: reset pc.next_song only if queuedMax Kellermann2009-02-101-1/+5
| | | | | | | 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.
* player_thread: reset pc.next_songMax Kellermann2009-02-101-0/+6
| | | | | | | 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.
* player_thread: set player error when output device failsMax Kellermann2009-02-021-1/+4
| | | | | | 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.
* player_thread: start decoder thread in player threadMax Kellermann2009-01-251-0/+3
| | | | | Start the decoder thread when the player thread starts. The decoder thread is already stopped by the player thread.
* player_control: added player_control.threadMax Kellermann2009-01-251-2/+4
| | | | | player_control.thread contains the handle of the player thread, or NULL if the player thread isn't running.
* decoder_control: added decoder_control.threadMax Kellermann2009-01-251-1/+1
| | | | | decoder_control.thread contains the handle of the decoder thread, or NULL if the decoder thread isn't running.
* player_thread: emit PLAYLIST event when new song failsMax Kellermann2009-01-211-1/+1
| | | | | | 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.
* player_thread: check for decoder failure before seekingMax Kellermann2009-01-211-1/+4
| | | | | The function player_seek_decoder() starts the decoder, but does not check the return value of player_wait_for_decoder().
* player_thread: use bool instead of intMax Kellermann2009-01-211-12/+13
| | | | | Make player_wait_for_decoder() and play_chunk() return a bool instead of 0/-1.
* player_thread: request next song only if new one starts playingMax Kellermann2009-01-211-11/+0
| | | | | | | | | 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.
* player_thread: eliminated duplicate PLAYLIST eventMax Kellermann2009-01-201-2/+0
| | | | | player_wait_for_decoder() emits the PLAYLIST event on success, remove the duplicate PLAYLIST event in its caller.
* event_pipe: added "TAG" eventMax Kellermann2009-01-201-1/+1
| | | | | | 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.