1. 14 Nov, 2008 2 commits
    • Max Kellermann's avatar
      player: don't queue song when there are 2 songs in the pipe · eb199ca2
      Max Kellermann authored
      Don't send a "next song" request to the main thread when the current
      song hasn't started playing yet, i.e. there are already two different
      songs in the music pipe.  This would erase information about the song
      boundary within the music pipe, and thus triggered an assertion
      failure.  The bug could occur when playing very short songs which fit
      into the pipe as a whole.
      eb199ca2
    • Max Kellermann's avatar
      player: wake up decoder before waiting for xfade chunks · 418dac6f
      Max Kellermann authored
      Fix a deadlock: when the decoder waited for buffer space, the player
      could enter a deadlock situation because it waits for more chunks for
      crossfading chunks.  Signal the decoder before entering notify_wait().
      418dac6f
  2. 13 Nov, 2008 3 commits
  3. 11 Nov, 2008 1 commit
    • Max Kellermann's avatar
      player: fix race condition during tag update · 1bfa6a94
      Max Kellermann authored
      When a tag is updated, the old tag was freed before the new one was
      created.  Reverse the order to be sure that other threads always see a
      valid pointer.
      
      This still leaves a possible race condition, but it will be addressed
      later.
      1bfa6a94
  4. 08 Nov, 2008 1 commit
  5. 03 Nov, 2008 2 commits
  6. 02 Nov, 2008 9 commits
  7. 30 Oct, 2008 1 commit
  8. 29 Oct, 2008 5 commits
    • Max Kellermann's avatar
      output: always call cancel() before stop() · 67831453
      Max Kellermann authored
      Stopping an audio output device without cancelling its buffer doesn't
      make sense.  Combine the two operations, which saves several cancel
      calls.
      67831453
    • Max Kellermann's avatar
      output: use bool for return values and flags · 58c5bee9
      Max Kellermann authored
      Don't return 0/-1 on success/error, but true/false.  Instead of int,
      use bool for storing flags.
      58c5bee9
    • Max Kellermann's avatar
      player: handle songs shorter than the initial buffer · 2867c8e9
      Max Kellermann authored
      When the decoder exited before the buffer has grown big enough
      ("buffer_before_play"), the player thread waited forever.  Add an
      additional check which disables buffering as soon as the decoder
      exits.
      2867c8e9
    • Max Kellermann's avatar
      player: added variable "play_audio_format" · c6714f17
      Max Kellermann authored
      The local variable "play_audio_format" is updated every time the
      player starts playing a new song.  This way, we always know exactly
      which audio format is current.  The old code broke when a new song had
      a different format: ob.audio_format is the format of the next song,
      not of the current one - using this caused breakage for the software
      volume control.
      c6714f17
    • Max Kellermann's avatar
      player: request new song only if there is no pending command · c042faab
      Max Kellermann authored
      Request the next song from the playlist (by clearing pc.next_song)
      only if the player command is empty.  If it is not, the player may be
      clearing the song that has already been queued, leading to an
      assertion failure.
      c042faab
  9. 27 Oct, 2008 1 commit
    • Max Kellermann's avatar
      player: reset pc.command when decoder startup fails · 4a71f662
      Max Kellermann authored
      When the decoder failed to start, the function do_play() returned,
      still having pc.command==PLAY.  This is because pc.command was reset
      only when the decoder started up successfully.  Add another
      player_command_finished() call in the error handler.
      4a71f662
  10. 24 Oct, 2008 1 commit
    • Max Kellermann's avatar
      player: don't clear command before do_play() returns · ee499cb4
      Max Kellermann authored
      This bug caused the audio output devices to stay open, although MPD
      wasn't playing: quitDecode() resetted player_control.command, assuming
      that the command was STOP.  This way, player_task() didn't see the
      CLOSE_AUDIO command, and the device was kept open.
      
      Don't clear player_control.command in quitDecode().
      ee499cb4
  11. 23 Oct, 2008 1 commit
  12. 21 Oct, 2008 1 commit
  13. 11 Oct, 2008 4 commits
    • Max Kellermann's avatar
      player: replaced buffered_before_play with buffering flag · 08210af2
      Max Kellermann authored
      buffered_before_play was copied to struct player because it was used
      to disable buffering when seeking.  Instead of mainaining a copy of
      this number, move just the flag to the player struct.
      08210af2
    • Max Kellermann's avatar
      player: added commands QUEUE and CANCEL · 35a939e3
      Max Kellermann authored
      QUEUE adds a new song to the player's queue.  CANCEL clears the queue.
      These two commands replace the old and complex queueState and
      queueLockState code.
      35a939e3
    • Max Kellermann's avatar
      player: added struct player · 9d51bd39
      Max Kellermann authored
      The player struct holds the local variables which used to be passed to
      all those helper functions in player_thread.c.
      9d51bd39
    • Max Kellermann's avatar
      player: removed player_control.fileTime · 42409a35
      Max Kellermann authored
      This variable is superfluous, it is only used to copy its value to
      player_control.totalTime.  Since the original source of this value
      (song->tag->time) will still be available at this point, we can safely
      remove fileTime.
      42409a35
  14. 10 Oct, 2008 3 commits
  15. 08 Oct, 2008 3 commits
  16. 29 Sep, 2008 1 commit
    • Max Kellermann's avatar
      audio_output: added method pause() · 6e21e24c
      Max Kellermann authored
      pause() puts the audio output into pause mode: if supported, it may
      perform a special action, which keeps the device open, but does not
      play anything.  Output plugins like "shout" might want to play silence
      during pause, so their clients won't be disconnected.  Plugins which
      do not support pausing will simply be closed, and have to be reopened
      when unpaused.
      
      This pach includes an implementation for the shout plugin, which
      sends silence chunks.
      6e21e24c
  17. 26 Sep, 2008 1 commit
    • Max Kellermann's avatar
      notify: protect notify->pending with the mutex · 58554e14
      Max Kellermann authored
      There was a known deadlocking bug in the notify library: when the
      other thread set notify->pending after the according check in
      notify_wait(), the latter thread was deadlocked.  Resolve this by
      synchronizing all accesses to notify->pending with the notify object's
      mutex.  Since notify_signal_sync() was never used, we can remove it.
      As a consequence, we don't need notify_enter() and notify_leave()
      anymore; eliminate them, too.
      58554e14