aboutsummaryrefslogtreecommitdiffstats
path: root/src/player_thread.c (follow)
Commit message (Collapse)AuthorAgeFilesLines
* mixramp: Adjust MixRamp threshold to account for ReplayGain.Tim Phipps2010-05-081-0/+2
|
* player_thread: move cross-fading to output threadMax Kellermann2010-05-021-8/+4
| | | | | Remove cross_fade_apply(), and call pcm_mix() in the output thread, mixing the chunk and chunk->other together.
* Merge release 0.15.9 from branch 'v0.15.x'Max Kellermann2010-03-281-0/+27
|\ | | | | | | | | | | | | | | | | Conflicts: NEWS configure.ac src/cue/cue_tag.c src/decoder/mpcdec_decoder_plugin.c src/player_thread.c
| * player_thread: postpone song tags during cross-fadeMax Kellermann2010-03-171-0/+27
| | | | | | | | | | | | | | | | | | Previously, tags of the new song being cross-faded in were sent immediately. That can cause wrong information being displayed, because the "previous" song might send its tag at the end again, overriding the "next" song's tag. This patch saves & merges the tag of the next song, and sends it when cross-fading is finished, and the next song really starts.
* | Add support for MixRamp tagsTim Phipps2010-03-211-2/+14
| | | | | | | | | | Adds mixrampdb and mixrampdelay commands. Reads MIXRAP_START and MIXRAMP_END tags from FLAC files and overlaps instead of crossfading.
* | output: added option "always_on" for radio stationsMax Kellermann2010-03-101-1/+1
| | | | | | | | | | | | | | Did you ever accidently click "stop" while feeding a radio station? This option sets the output device to "pause" to disable the "close" method. It falls back to "pause" then, which is specific to the plugin. Some plugins implement it by feeding silence.
* | output_all: reset elapsed_time at song borderMax Kellermann2010-01-021-0/+2
| | | | | | | | | | | | | | | | Another quirk fixed: after the last chunk of a song has been played, the "elapsed_time" variable is set to the chunk's time stamp. When the client receives the PLAYER idle event and asks MPD for the current time stamp, MPD will return the last time stamp of the previous song when it hasn't played the first chunk of the current song yet.
* | Update copyright notices.Avuton Olrich2009-12-311-1/+1
| |
* | decoder, player: support song rangesMax Kellermann2009-12-271-3/+31
| | | | | | | | | | | | | | Seek the decoder to the start of the range before beginning with playback. Stop the decoder when the end of the range has been reached. Add the start position to the seek position. Expose the duration of the range, not the full song file.
* | song: added function song_get_duration()Max Kellermann2009-12-261-2/+1
| |
* | fixed several gcc warnings on unused debug variablesMax Kellermann2009-12-141-1/+1
| |
* | player_thread: corrected two assertions on "queued"Max Kellermann2009-11-141-2/+2
| | | | | | | | At this point, the function may be called from the SEEK handler.
* | player_thread: initialize chunk->times in silence generatorMax Kellermann2009-11-121-0/+1
| | | | | | | | | | | | | | | | | | | | When waiting for the decoder to provide more data, the player thread generates silence chunks if needed. However, it forgot to initialize the chunk.times attribute, which had now an undefined value. This patch sets it to -1.0, meaning "value is undefined". Add a ">= 0.0" check to audio_output_all_check(). This fixes spurious relative seeking errors, because sometimes, the "elapsed" value falls back to 0.0.
* | include config.h in all sourcesMax Kellermann2009-11-121-0/+1
| | | | | | | | | | | | After we've been hit by Large File Support problems several times in the past week (which only occur on 32 bit platforms, which I don't have), this is yet another attempt to fix the issue.
* | player_thread: drain audio outputs at the end of the playlistMax Kellermann2009-11-091-1/+5
| | | | | | | | | | | | | | | | When there's no queued song, and the current one has finished playing, first make sure that the hardware outputs have really finished playing the last chunk: call the drain() method in all audio outputs. Without this patch, MPD stopped playback shortly before the ALSA sound card had finished playing.
* | player_thread: on return, reset next_song only if queuedMax Kellermann2009-11-031-3/+7
| | | | | | | | | | If no song was queued, then player_control.next_song might contain the value for the next QUEUE command. We must not reset that.
* | player_thread: detect finished queued songMax Kellermann2009-11-031-1/+2
| | | | | | | | | | | | | | When the decoder finishes the "queued" song very quickly (before the "current" song finishes playing), an assertion in do_play() fails because it thinks that it should start decoding the queued song, although that has in fact just finished.
* | player_thread: moved code to decoding_next_song()Max Kellermann2009-11-031-4/+15
| | | | | | | | Simplify several expressions.
* | player_thread: lock player in player_check_decoder_startup()Max Kellermann2009-11-031-0/+8
| | | | | | | | Don't access attributes without the lock.
* | decoder_control: pass pipe and buffer to dc_start()Max Kellermann2009-11-031-10/+5
| | | | | | | | Don't access decoder_control attributes directly.
* | player_thread: lock inside player_wait_for_decoder()Max Kellermann2009-11-031-7/+17
| | | | | | | | Lock the player_control object when modifying its attributes.
* | player_thread: moved code to player_dc_start()Max Kellermann2009-11-031-5/+20
| |
* | decoder_control: merge next_song and current_songMax Kellermann2009-11-031-9/+3
| | | | | | | | These two variables are redundant, we need only one of them.
* | player_thread: don't set errored_song on audio errorMax Kellermann2009-11-031-2/+0
| | | | | | | | It's not used if pc.error==PLAYER_ERROR_AUDIO.
* | player_thread: don't start the decoder asynchronouslyMax Kellermann2009-11-031-4/+2
| | | | | | | | | | The START command returns without blocking; we don't need the asynchronous decoder start anymore.
* | player_thread: check command before waiting during pauseMax Kellermann2009-11-021-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().
* | decoder_control: removed the global variable "dc"Max Kellermann2009-10-311-71/+88
| | | | | | | | | | Allocate a decoder_control object where needed, and pass it around. This will allow more than one decoder thread one day.
* | player_thread: simplified thread destructionMax Kellermann2009-10-311-4/+2
| | | | | | | | Simply use "return" instead of g_thread_exit().
* | player_control: protect command, state, error with a mutexMax Kellermann2009-10-311-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.
* | {player,output}_thread: fixed elapsed_time quirksMax Kellermann2009-10-301-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.
* | player_thread: set error status in play_next_chunk()Max Kellermann2009-10-291-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.
* | output_plugin: added methods enable() and disable()Max Kellermann2009-10-231-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.
* | player_thread: don't call audio_output_all_check() if pausedMax Kellermann2009-10-151-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.
* | song: renamed attribute "url" to "uri"Max Kellermann2009-10-131-4/+4
| |
* | player_thread: get "elapsed" from audio outputsMax Kellermann2009-10-081-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.
* | player_thread: always clear player_control.next_song on returnMax Kellermann2009-10-081-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.
* | player_control: eliminate PLAYER_COMMAND_PLAYMax Kellermann2009-10-081-2/+0
| | | | | | | | | | Sending PLAYER_COMMAND_STOP followed by PLAYER_COMMAND_QUEUE does the same. PLAYER_COMMAND_PLAY is redundant.
* | decoder_control: protect command, state with a mutexMax Kellermann2009-08-131-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.
* | player_thread: don't use precalculated size_to_timeMax Kellermann2009-07-231-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.
* | player_thread: moved code to update_song_tag()Max Kellermann2009-07-231-19/+27
| |
* | 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.