aboutsummaryrefslogtreecommitdiffstats
path: root/src/output_all.c (follow)
Commit message (Collapse)AuthorAgeFilesLines
* Merge branch 'v0.16.x'Max Kellermann2011-09-011-16/+3
|\ | | | | | | | | | | Conflicts: configure.ac src/output_control.c
| * output_all: move _lock_signal() to output_control.cMax Kellermann2011-09-011-19/+3
| | | | | | | | Better name, better documentation.
| * output_thread: reimplement CANCEL synchronizationMax Kellermann2011-09-011-2/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | The output thread could hang indefinitely after finishing CANCEL, because it could have missed the signal while the output was not unlocked in ao_command_finished(). This patch removes the wait() call after CANCEL, and adds the flag "allow_play" instead. While this flag is set, playback is skipped. With this flag, there will not be any excess wait() call after the pipe has been cleared. This patch fixes a bug that causes mpd to discontinue playback after seeking, due to the race condition described above.
* | copyright year 2011Max Kellermann2011-01-291-1/+1
| |
* | include cleanupMax Kellermann2011-01-101-0/+1
| |
* | player_control: removed the global variable "pc"Max Kellermann2011-01-101-7/+7
|/ | | | | | | Allocate a player_control object where needed, and pass it around. Each "client" object is associated with a "player_control" instance. This prepares multi-player support.
* Merge release 0.15.14 from branch 'v0.15.x'Max Kellermann2010-11-071-2/+2
|\ | | | | | | | | | | | | | | | | | | | | | | Conflicts: NEWS configure.ac src/decoder_control.c src/decoder_control.h src/input/rewind_input_plugin.c src/output_control.c src/output_thread.c src/player_thread.c
| * pipe: add helper function music_pipe_empty()Max Kellermann2010-11-051-2/+2
| |
* | output_all: disable outputs on shutdownMax Kellermann2010-10-051-0/+1
| | | | | | | | | | | | Call output_plugin.disable() before output_plugin.finish(). This ensures that all outputs are properly cleaned up, to make valgrind happy.
* | mpd_error: more correct MPD_ERROR implementationDenis Krjuchkov2010-09-281-1/+1
| | | | | | | | | | | | | | | | | | Original implementation does not handle if (...) MPD_ERROR("die"); else ... case well. This change fixes handling of such cases.
* | eliminate g_error() usageThomas Jansen2010-09-251-5/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Replaced all occurrences of g_error() with MPD_ERROR() located in a new header file 'mpd_error.h'. This macro uses g_critical() to print the error message and then exits gracefully in contrast to g_error() which would internally call abort() to produce a core dump. The macro name is distinctive and allows to find all places with dubious error handling. The long-term goal is to get rid of MPD_ERROR() altogether. To facilitate the eventual removal of this macro it was added in a new header file rather than to an existing header file. This fixes #2995 and #3007.
* | output: added option "always_on" for radio stationsMax Kellermann2010-03-101-0/+23
| | | | | | | | | | | | | | 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/+8
| | | | | | | | | | | | | | | | 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
| |
* | player_thread: initialize chunk->times in silence generatorMax Kellermann2009-11-121-1/+4
| | | | | | | | | | | | | | | | | | | | 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.
* | output_thread: added command DRAINMax Kellermann2009-11-091-0/+9
| | | | | | | | | | This command manually drains the hardware buffer. This is useful when the player thread want to make sure that everything has been played.
* | output_all: automatically attempt to re-enable failed outputsMax Kellermann2009-11-071-0/+1
| | | | | | | | | | | | | | When an output's enable() method has failed, and playback starts, retry to enable it. Without this, the user may be confused, because he sees the device is "enabled" but cannot use it, and currently there is no error message in the log.
* | output: signal the output thread when CANCEL is finishedMax Kellermann2009-11-021-0/+30
| | | | | | | | | | | | | | After CANCEL, the output thread waits for another signal before it continues playback, to synchronize with the caller. There were some situations where this signal wasn't sent properly. This patch adds an explicit g_cond_signal() at two code positions.
* | player_control: protect command, state, error with a mutexMax Kellermann2009-10-311-2/+7
| | | | | | | | | | | | 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-2/+5
| | | | | | | | | | | | | | | | 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.
* | output: consistently lock audio output objectsMax Kellermann2009-10-291-11/+15
| | | | | | | | | | Always keep the audio_output object locked within the output thread, unless a plugin method is called. This fixes several race conditions.
* | output_plugin: added methods enable() and disable()Max Kellermann2009-10-231-0/+19
| | | | | | | | | | | | | | 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: get "elapsed" from audio outputsMax Kellermann2009-10-081-0/+14
|/ | | | | | | | | | | | | | | 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.
* output_all: don't resume playback when stopping during pauseMax Kellermann2009-06-291-2/+0
| | | | | | | | When MPD was paused, and the client sent the "stop" command (or "clear"), a glitch caused MPD to continue playback for a split second. This was because audio_output_all_cancel() calls audio_output_all_update(), which reopens all output devices, and re-ignites the playback loop.
* output_all: explicitly return "true" from audio_output_all_play()Max Kellermann2009-05-291-1/+1
| | | | | | Instead of returning the local variable "ret" which is always true at this point, hard-code the "true" return value, because that might be more readable.
* output_all: synchronize playback with player_control.notifyMax Kellermann2009-03-261-1/+2
| | | | | | | | | This patch fixes a longer delay when moving around songs in the playlist. The main thread wants to enqueue a new "next" song into the player thread, but the player thread is waiting inside audio_output_all_wait() for the output threads. Use player_control.notify there, so audio_output_all_wait() gets woken up by the main thread, too.
* output_all: synchronize playback with a notify objectMax Kellermann2009-03-251-2/+1
| | | | | | Use audio_output_client_notify instead of g_usleep(1ms) in audio_output_all_wait() to synchronize with the output_thread. Signal the audio_output_client_notify object in ao_play().
* output_all: moved code to audio_output_all_wait()Max Kellermann2009-03-251-0/+12
| | | | | | 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).
* output: protect audio_output.open with the mutexMax Kellermann2009-03-251-12/+23
| | | | | | There was a deadlock between the output thread and the player thread: when the output thread failed (and closed itself) while the player thread worked with the audio_output object, MPD could crash.
* output_all: check param!=NULL before accessing itMax Kellermann2009-03-161-2/+7
| | | | | When printing the error message, MPD dereferences the NULL pointer to print an error message if no audio_output section is present.
* output_all: added missing "unused" attributeMax Kellermann2009-03-141-1/+1
| | | | In NDEBUG, clear_tail_chunk() does not use its "chunk" parameter.
* output_all: include chunk.hMax Kellermann2009-03-141-0/+1
| | | | | The source output_all.c accesses music_chunk struct members, but did not include chunk.h directly.
* 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.
* output_all: fix off-by-one error in audio_output_all_check()Max Kellermann2009-03-121-1/+1
| | | | | | | | 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.
* output_all: clear input_audio_format on closeMax Kellermann2009-03-101-0/+2
| | | | | | 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.
* output_all: don't allow audio_format==NULL in audio_output_all_open()Max Kellermann2009-03-101-5/+3
| | | | | | Don't allow reopening an audio device after pause with audio_format==NULL, force the caller to provide the audio_format each time.
* output: play from a music_pipe objectMax Kellermann2009-03-091-42/+182
| | | | | | | | 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.
* output_all: fix boolean short circuit in update()Max Kellermann2009-03-071-2/+2
| | | | | | | Sometimes, audio_output_update() isn't called for the second device when the first one has succeeded. The patch "audio_output_all_update() returns bool" broke it, because the boolean evaluation ended after the first "true".
* output_all: audio_output_all_update() returns boolMax Kellermann2009-03-071-3/+12
| | | | | audio_output_all_update() returns true when there is at least open output device which is open.
* output_init: return GError on errorMax Kellermann2009-03-011-12/+3
| | | | Do error handling with GError instead of aborting with g_error().
* output: use GTimer instead of time_t for reopen after failureMax Kellermann2009-02-281-2/+8
| | | | | | | time() is not a monotonic timer, and MPD might get confused by clock skews. clock_gettime() provides a monotonic clock, but is not portable to non-POSIX systems (i.e. Windows). This patch uses GLib's GTimer API, which aims to be portable.
* output_all: print a warning when all outputs are disabledMax Kellermann2009-02-261-1/+7
| | | | | | When all outputs are disabled, MPD printed only a meaningless message "problems opening audio device", although it didn't attempt to open a device.
* output_all: removed "audio_outputs!=NULL" checkMax Kellermann2009-02-261-3/+0
| | | | | After initialization, audio_outputs is always non-NULL. Don't check that.
* output: set a GLib log domainMax Kellermann2009-02-251-0/+3
|
* output: include cleanupMax Kellermann2009-02-161-0/+2
| | | | | Don't include output_api.h in output_internal.h. This change requires adding missing includes in several sources.
* output_all: immediately reopen output on playMax Kellermann2009-02-101-0/+13
| | | | | | | When MPD explicitly starts playing, ignore the "REOPEN_AFTER" timeout. This timeout was useful when MPD attempted to reopen a failed device over and over, but it confuses users when they explicitly tell MPD to start playing, while MPD insists to wait for the 10 seconds to pass.
* output_all: moved code to audio_output_all_finished()Max Kellermann2009-02-101-13/+16
| | | | audio_output_all_finished() returns bool, not int.
* output_all: no CamelCaseMax Kellermann2009-02-101-58/+66
| | | | Renamed functions and variables.
* audio: moved code to output_all.cMax Kellermann2009-02-101-0/+270
Moved code which deals with all audio outputs at once into a separate library.