1. 26 Aug, 2008 40 commits
    • Max Kellermann's avatar
      player: don't call STOP before CLOSE_AUDIO · 92d9797b
      Max Kellermann authored
      playerWait() stops the player thread (twice!) and closes the output
      device.  It should be well enough to just send CLOSE_AUDIO, without
      STOP.
      
      This requires a tiny change to the player thread code: make it break
      when CLOSE_AUDIO is sent.
      92d9797b
    • Max Kellermann's avatar
      playlist: eliminate unused fd parameters · cff923b9
      Max Kellermann authored
      Again, remove file descriptor parameters, which are not actually
      used.  These functions can also be converted to return void.
      cff923b9
    • Max Kellermann's avatar
      player: no "fd" and no return value · 3db333b5
      Max Kellermann authored
      Most player*() functions do not actually use the file descriptor, and
      always return 0 (success).  Eliminate them to get a leaner interface.
      3db333b5
    • Max Kellermann's avatar
      flac: decoder command means EOF · 6df980a9
      Max Kellermann authored
      It was possible for the decoder thread to go into an endless loop
      (flac and oggflac decoders): when a "STOP" command arrived, the Read()
      callback would return 0, but the EOF() callback returned false.  Fix:
      when decoder_get_command()!=NONE, return EOF==true.
      6df980a9
    • Max Kellermann's avatar
      made "sample_size" static const · 8a510948
      Max Kellermann authored
      sample_size is a variable which is computed at compile time.  Declare
      it "static const", so the compiler can optimize it away.
      8a510948
    • Max Kellermann's avatar
      moved jack configuration to the JackData struct · e056ff2b
      Max Kellermann authored
      Storing local configuration in global (static) variables is obviously
      a bad idea.  Move all those variables into the JackData struct,
      including the locks.
      e056ff2b
    • Max Kellermann's avatar
      jack: removed unused macros · 479d02da
      Max Kellermann authored
      479d02da
    • Max Kellermann's avatar
      jack: don't set audioOutput->data=NULL · edd7e2f9
      Max Kellermann authored
      There is only one caller of freeJackData() left: jack_finishDriver().
      This function is called by the mpd core, and is called exactly once
      for every successful jack_initDriver().  We do not need to clear
      audioOutput->data, since this variable is invalidated anyway.
      edd7e2f9
    • Max Kellermann's avatar
      jack: initialize JackData in jack_initDriver() · 806a9f02
      Max Kellermann authored
      Over the lifetime of the jack AudioOutput object, we want a single
      valid JackData object, so we can persistently store data there
      (configuration etc.).  Allocate JackData in jack_initDriver().  After
      that, we can safely remove all audioOutput->data==NULL checks (and
      replace them with assertions).
      806a9f02
    • Max Kellermann's avatar
      jack: added freeJackClient() · 83215bf9
      Max Kellermann authored
      No need to destroy the JackData object when an error occurs, since
      jack_finishDriver() already frees it.  Only deinitialize the jack
      library, introduce freeJackClient() for that, and move code from
      freeJackData().
      83215bf9
    • Max Kellermann's avatar
      jack: initialize jd->client after !jd check · dc989987
      Max Kellermann authored
      Prepare the next patch: make the "!jd" check independent of the
      jd->client initialization.  This way we can change the "jd"
      initialization semantics later.
      dc989987
    • Max Kellermann's avatar
      jack: eliminate superfluous freeJackData() calls · 23832311
      Max Kellermann authored
      connect_jack() invokes freeJackData() in every error handler, although
      its caller also invokes this function after a failure.  We can save a
      lot of lines in connect_jack() by removing these redundant
      freeJackData() invocations.
      23832311
    • Max Kellermann's avatar
      mp3, flac: check for seek command after decoder_read() · f46de2c3
      Max Kellermann authored
      When we introduced decoder_read(), we added code which aborts the read
      operation when a decoder command arrives.  Several plugins however did
      not expect that when they were converted to decoder_read().  Add
      proper checks to the mp3 and flac decoder plugins.
      f46de2c3
    • Max Kellermann's avatar
      check decoder_command!=NONE instead of decoder_command==STOP · e530181e
      Max Kellermann authored
      The code said "decoder_command==STOP" because that was a conversion
      from the old "dc->stop" test.  As we can now check for all commands in
      one test, we can simply rewrite that to decoder_command!=NONE.
      e530181e
    • Max Kellermann's avatar
      mp3: converted the MUTEFRAME_ macros to an enum · 4515ac5e
      Max Kellermann authored
      Also introduce MUTEFRAME_NONE; previously, the code used "0".
      4515ac5e
    • Max Kellermann's avatar
      95fff55d
    • Max Kellermann's avatar
      added flag "decoder.seeking" · 1c196478
      Max Kellermann authored
      This flag is used internally; it is set by decoder_seek_where(), and
      indicates that the decoder plugin has begun the seek process.  It is
      used for the case that the decoder plugin has to read data during the
      seek process.  Before this patch, that was impossible, because
      decoder_read() would refuse to read data unless dc->command is NONE.
      This patch is kind of a dirty workaround, and needs to be redesigned
      later.
      1c196478
    • Max Kellermann's avatar
      wavpack: don't use "isp" before initialization · cf139dc0
      Max Kellermann authored
      The old code called can_seek() with the uninitialized pointer
      "isp.is".  Has this ever worked?  Anyway, initialize "isp" first, then
      call can_seek(&isp).
      cf139dc0
    • Max Kellermann's avatar
      wavpack: moved code to wavpack_open_wvc() · 2e822a57
      Max Kellermann authored
      Move everything related to finding and initializing the WVC stream to
      wavpack_open_wvc().  This greatly simplifies its error handling and
      the function wavpack_streamdecode().
      2e822a57
    • Max Kellermann's avatar
      simplified code in the ogg decoder plugin · af58de65
      Max Kellermann authored
      Return early when the player thread sent us a command.  This saves one
      level of indentation.
      af58de65
    • Max Kellermann's avatar
      added decoder_read() · 940ecf53
      Max Kellermann authored
      On our way to stabilize the decoder API, we will one day remove the
      input stream functions.  The most basic function, read() will be
      provided by decoder_api.h with this patch.  It already contains a loop
      (still with manual polling), error/eof handling and decoder command
      checks.  This kind of code used to be duplicated in all decoder
      plugins.
      940ecf53
    • Max Kellermann's avatar
      wavpack: added InputStreamPlus.decoder · d80260ab
      Max Kellermann authored
      The "decoder" object reference will be used by another patch.
      d80260ab
    • Max Kellermann's avatar
      oggvorbis: don't detect OGG header if stream is not seekable · a1b430cb
      Max Kellermann authored
      If the input stream is not seekable, the try_decode() function
      consumes valuable data, which is not available to the decode()
      function anymore.  This means that the decode() function does not
      parse the header correctly.  Better skip the detection if we cannot
      seek.  Or implement better buffering, something like unread() or
      buffered rewind().
      a1b430cb
    • Max Kellermann's avatar
      added AacBuffer.decoder · 7bbca084
      Max Kellermann authored
      We need the decoder object at several places in the AAC plugin.  Add
      it to mp3DecodeData, so we don't have to pass it around in every
      function.
      7bbca084
    • Max Kellermann's avatar
      mp3: added mp3DecodeData.decoder · 468f61d5
      Max Kellermann authored
      We need the decoder object at several places in the mp3 plugin.  Add
      it to mp3DecodeData, so we don't have to pass it around in every
      function.
      468f61d5
    • Max Kellermann's avatar
      mp3: audio_linear_dither() returns mpd_sint16 · 7653ab43
      Max Kellermann authored
      The return value of audio_linear_dither() is always casted to
      mpd_sint16.  Returning long does not make sense, and consumed 8 bytes
      on a 64 bit platform.
      7653ab43
    • Max Kellermann's avatar
      mp3: changed outputBuffer's type to mpd_sint16[] · 9c823d67
      Max Kellermann authored
      The output buffer always contains mpd_sint16; declaring it with that
      type saves several casts.
      9c823d67
    • Max Kellermann's avatar
      mp3: moved num_samples calculation out of the loop · 2a960853
      Max Kellermann authored
      The previous patch removed all loop specific dependencies from the
      num_samples formula; we can now calculate it before entering the loop.
      2a960853
    • Max Kellermann's avatar
      mp3: eliminated outputPtr · 3f55b5a1
      Max Kellermann authored
      The output buffer is always flushed after being appended to, which
      allows us to assume it is always empty.  Always start writing at
      outputBuffer, don't remember outputPtr.
      3f55b5a1
    • Max Kellermann's avatar
      mp3: don't do a second flush in mp3_decode() · f0bcb4a4
      Max Kellermann authored
      The previous patch made mp3Read() flush the output buffer in every
      iteration, which means we can eliminate the flush check after invoking
      mp3Read().
      f0bcb4a4
    • Max Kellermann's avatar
      mp3: always flush directly after decoding/dithering · 2e8bd3ae
      Max Kellermann authored
      Since we try to fill the buffer in every iteration, we assume that we
      should flush the output buffer at the end of each iteration.
      2e8bd3ae
    • Max Kellermann's avatar
      mp3: dither a whole block at a time · af83ac5e
      Max Kellermann authored
      Fill the whole output buffer at a time by using dither_buffer()'s
      ability to decode blocks.  Calculate how many samples fit into the
      output buffer before each invocation.
      af83ac5e
    • Max Kellermann's avatar
      mp3: moved dropSamplesAtEnd check out of the loop · e99536e8
      Max Kellermann authored
      Simplifying loops for performance: why check dropSamplesAtEnd in every
      iteration, when we could modify the loop boundary?  The (writable)
      variable samplesLeft can be eliminated; add a write-once variable
      pcm_length instead, which is used for the loop condition.
      e99536e8
    • Max Kellermann's avatar
      mp3: make samplesPerFrame more local · e4c6c019
      Max Kellermann authored
      The variable samplesPerFrame is used only in one single closure.  Make
      it local to this closure.  The compiler will probably convert it to a
      register anyway.
      e4c6c019
    • Max Kellermann's avatar
      mp3: unsigned integers · 60a15562
      Max Kellermann authored
      60a15562
    • Max Kellermann's avatar
      mp3: removed double cmd==STOP check · f667da1b
      Max Kellermann authored
      cmd has already been checked before, it cannot have changed meanwhile
      because it is a local variable.
      f667da1b
    • Max Kellermann's avatar
      mp3: moved code to dither_buffer() · 09fbbdc3
      Max Kellermann authored
      Preparing for simplifying and thus speeding up the dithering code:
      moved dithering to a separate function which contains a trivial loop.
      With this patch, only one sample is dithered at a time, but the
      following patches will allow us to dither a whole block at a time,
      without complicated buffer length checks.
      09fbbdc3
    • Max Kellermann's avatar
      mp3: don't check dropSamplesAtStart in the loop · d9583aa9
      Max Kellermann authored
      Performance improvement by moving stuff out of a loop: skip part of
      the first frame before entering the loop.
      d9583aa9
    • Max Kellermann's avatar
      assert song->url != NULL · df251a99
      Max Kellermann authored
      df251a99
    • Max Kellermann's avatar
      aac: support decoding AAC streams · e9933316
      Max Kellermann authored
      Copy some code from aac_decode() to aac_stream_decode() and apply
      necessary changes to allow streaming audio data.  Both functions might
      be merged later.
      e9933316