19 Jul, 2010

1 commit


28 Jun, 2010

1 commit

  • When using poll() to wait for the next period -- or avail_min samples --
    one gets a consistent delay for each system call that is usually just a
    little short of the selected period time. However, When using
    snd_pcm_read/write(), one gets a jittery delay that alternates between
    less than a millisecond and approximately two period times. This is
    caused by snd_pcm_lib_{read,write}1() transferring any available samples
    to the user's buffer and adjusting the application pointer prior to
    sleeping to the end of the current period. When the next period
    interrupt occurs, there is then less than avail_min samples remaining to
    be transferred in the period, so we end up sleeping until a second
    period occurs.

    This is solved by using runtime->twake as the number of samples needed
    for a wakeup in addition to selecting the proper wait queue to wake in
    snd_pcm_update_state(). This requires twake to be non-zero when used
    by snd_pcm_lib_{read,write}1() even if avail_min is zero.

    Signed-off-by: Dave Dillow
    Signed-off-by: Jaroslav Kysela

    David Dillow
     

26 May, 2010

1 commit

  • In the cleanup of the hw_ptr update functions in 2.6.33, the calculation
    of the delta value was changed to use the modulo operator to protect
    against a negative difference due to the pointer wrapping around at the
    boundary.

    However, the ptr variables are unsigned, so a negative difference would
    result in the two complement's value which has no relation to the actual
    difference relative to the boundary; the result is typically some value
    near LONG_MAX-boundary. Furthermore, even if the modulo operation would
    be done with signed types, the result of a negative dividend could be
    negative.

    The invalid delta value is then caught by the following checks, but this
    means that the pointer update is ignored.

    To fix this, use a range check as in the other pointer calculations.

    Signed-off-by: Clemens Ladisch
    Cc:
    Signed-off-by: Takashi Iwai

    Clemens Ladisch
     

21 May, 2010

1 commit

  • Commit 7910b4a1db63fefc3d291853d33c34c5b6352e8e in 2.6.34 changed the
    runtime->boundary calculation to make this value a multiple of both the
    buffer_size and the period_size, because the latter is assumed by the
    runtime->hw_ptr_interrupt calculation.

    However, due to the lack of a ioctl that could read the software
    parameters before they are set, the kernel requires that alsa-lib
    calculates the boundary value, too. The changed algorithm leads to
    a different boundary value used by alsa-lib, which makes, e.g., mplayer
    fail to play a 44.1 kHz file because the silence_size parameter is now
    invalid; bug report:
    .

    This patch reverts the change to the boundary calculation, and instead
    fixes the hw_ptr_interrupt calculation to be period-aligned regardless
    of the boundary value.

    Signed-off-by: Clemens Ladisch
    Cc:
    Signed-off-by: Takashi Iwai

    Clemens Ladisch
     

26 Mar, 2010

1 commit

  • The commit 4d96eb255c53ab5e39b37fd4d484ea3dc39ab456 broke the interrupt
    time xrun functionality (stream stop etc.) if the CONFIG_SND_PCM_XRUN_DEBUG
    is not set. This is because the xrun() is null defined without it.

    Fix this by letting the function xrun() to be always defined as it was
    before.

    Signed-off-by: Jarkko Nikula
    Cc: Jaroslav Kysela
    Signed-off-by: Takashi Iwai

    Jarkko Nikula
     

27 Jan, 2010

2 commits

  • Takashi Iwai
     
  • Clemens Ladisch noted for hw_ptr_removal in "cleanup & merge hw_ptr
    update functions" commit:

    "It is possible for the status/delay ioctls to be called when the sound
    card's pointer register alreay shows a position at the beginning of the
    new period, but immediately before the interrupt is actually executed.
    (This happens regularly on a SMP machine with mplayer.) When that
    happens, the code thinks that the position must be at least one period
    ahead of the current position and drops an entire buffer of data."

    Return back the hw_ptr_interrupt variable. The last interrupt pointer
    is always computed from the latest hw_ptr instead of tracking it
    separately (in this case all hw_ptr checks and modifications might
    influence also hw_ptr_interrupt and it is difficult to keep it
    consistent).

    Signed-off-by: Jaroslav Kysela

    Jaroslav Kysela
     

21 Jan, 2010

2 commits


13 Jan, 2010

2 commits


12 Jan, 2010

1 commit


08 Jan, 2010

2 commits


07 Jan, 2010

4 commits


22 Dec, 2009

1 commit

  • Refine the rate selection by choosing the rate
    closer to the requested one in case of selecting
    single frequency. Previously, the higher rate was
    always selected.

    Also, fix problem with the best_diff unsigned int
    value wrapping (turning negative).

    Signed-off-by: Krzysztof Helt
    Signed-off-by: Takashi Iwai

    Krzysztof Helt
     

21 Dec, 2009

1 commit

  • The direction of rounding is incorrect in the snd_interval_ratnum()
    It was detected with following parameters (sb8 driver playing
    8kHz stereo file):
    - num is always 1000000
    - requested frequency rate is from 7999 to 7999 (single frequency)

    The first loop calculates div_down(num, freq->min) which is 125.
    Thus, a frequency range's minimum value is 1000000 / 125 = 8000 Hz.
    The second loop calculates div_up(num, freq->max) which is 126
    The frequency range's maximum value is 1000000 / 126 = 7936 Hz.
    The range maximum is lower than the range minimum so the function
    fails due to empty result range.

    Signed-off-by: Krzysztof Helt
    Signed-off-by: Takashi Iwai

    Krzysztof Helt
     

10 Sep, 2009

1 commit


26 Aug, 2009

1 commit


25 Aug, 2009

1 commit

  • snd_interval_list() expected a sorted list but did not document this, so
    there are drivers that give it an unsorted list. To fix this, change
    the algorithm to work with any list.

    This fixes the "Slave PCM not usable" error with USB devices that have
    multiple alternate settings with sample rates in decreasing order, such
    as the Philips Askey VC010 WebCam.

    http://bugzilla.kernel.org/show_bug.cgi?id=14028

    Reported-and-tested-by: Andrzej
    Signed-off-by: Clemens Ladisch
    Cc:
    Signed-off-by: Takashi Iwai

    Clemens Ladisch
     

20 Aug, 2009

1 commit

  • The current PCM core has the following problems regarding PCM draining
    in non-blocking mode:

    - the current f_flags isn't checked in snd_pcm_drain(), thus changing
    the mode dynamically via snd_pcm_nonblock() after open doesn't work.
    - calling drain in non-blocking mode just return -EAGAIN error, but
    doesn't provide any way to sync with draining.

    This patch fixes these issues.
    - check file->f_flags in snd_pcm_drain() properly
    - when O_NONBLOCK is set, PCM core sets the stream(s) to DRAIN state
    but quits ioctl immediately without waiting the whole drain; the
    caller can sync the drain manually via poll()

    Signed-off-by: Takashi Iwai

    Takashi Iwai
     

23 Jul, 2009

3 commits


22 Jul, 2009

1 commit

  • VMware tends to report PCM positions and period updates at utterly
    wrong timing. This screws up the recent PCM core code that tries
    to correct the position based on the irq timing.

    Now, when a backward irq position is detected, skip the update
    instead of rebasing. (This is almost the old behavior before
    2.6.30.)

    Signed-off-by: Takashi Iwai

    Takashi Iwai
     

10 Jun, 2009

1 commit

  • * topic/pcm-jiffies-check:
    ALSA: pcm - A helper function to compose PCM stream name for debug prints
    ALSA: pcm - Fix update of runtime->hw_ptr_interrupt
    ALSA: pcm - Fix a typo in hw_ptr update check
    ALSA: PCM midlevel: lower jiffies check margin using runtime->delay value
    ALSA: PCM midlevel: Do not update hw_ptr_jiffies when hw_ptr is not changed
    ALSA: PCM midlevel: introduce mask for xrun_debug() macro
    ALSA: PCM midlevel: improve fifo_size handling

    Takashi Iwai
     

08 Jun, 2009

1 commit


07 Jun, 2009

2 commits


05 Jun, 2009

1 commit


29 May, 2009

4 commits


27 May, 2009

2 commits

  • The PCM hw_ptr jiffies check results sometimes in problems when a
    hardware doesn't give smooth hw_ptr updates. So far, au88x0 and some
    other drivers appear not working due to this strict check.
    However, this check is a nice debug tool, and the capability should be
    still kept.

    Hence, we disable this check now as default unless the user enables it
    by setting the xrun_debug mode to the specific stream via a proc file.

    Signed-off-by: Takashi Iwai

    Takashi Iwai
     
  • The hw_ptr_jiffies has to be reset properly to avoid the invalid
    check of jiffies delta in snd_pcm_update_hw_ptr*() functions.
    Especailly this patch fixes the bogus jiffies check after the puase
    and resume.

    This patch is a modified version of the original patch by Jaroslav.

    Signed-off-by: Takashi Iwai

    Takashi Iwai
     

28 Apr, 2009

1 commit

  • The hardware devices with SNDRV_PCM_INFO_BATCH flag can't give the
    precise current position. And such hardwares have often big FIFO
    in addition to the ring buffer, and it screws up the jiffies check
    in pcm_lib.c.

    This patch adds a simple check of info flag so that the driver skips
    the jiffies check in snd_pcm_period_elapsed() when BATCH flag is set.

    Signed-off-by: Takashi Iwai

    Takashi Iwai