Commit d948035a authored by Takashi Iwai's avatar Takashi Iwai Committed by Jaroslav Kysela

[ALSA] Remove PCM xfer_align sw params

The xfer_align sw_params parameter has never been used in a sane manner,
and no one understands what this does exactly.  The current
implementation looks also buggy because it allows write of shorter size
than xfer_align.  So, if you do partial writes, the write isn't actually
aligned at all.
Removing this parameter will make some pcm_lib_* code more readable
(and less buggy).
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarJaroslav Kysela <perex@perex.cz>
parent fa5717f2
...@@ -2188,7 +2188,6 @@ struct _snd_pcm_runtime { ...@@ -2188,7 +2188,6 @@ struct _snd_pcm_runtime {
struct timespec tstamp_mode; /* mmap timestamp is updated */ struct timespec tstamp_mode; /* mmap timestamp is updated */
unsigned int period_step; unsigned int period_step;
unsigned int sleep_min; /* min ticks to sleep */ unsigned int sleep_min; /* min ticks to sleep */
snd_pcm_uframes_t xfer_align; /* xfer size need to be a multiple */
snd_pcm_uframes_t start_threshold; snd_pcm_uframes_t start_threshold;
snd_pcm_uframes_t stop_threshold; snd_pcm_uframes_t stop_threshold;
snd_pcm_uframes_t silence_threshold; /* Silence filling happens when snd_pcm_uframes_t silence_threshold; /* Silence filling happens when
......
...@@ -363,7 +363,7 @@ struct snd_pcm_sw_params { ...@@ -363,7 +363,7 @@ struct snd_pcm_sw_params {
unsigned int period_step; unsigned int period_step;
unsigned int sleep_min; /* min ticks to sleep */ unsigned int sleep_min; /* min ticks to sleep */
snd_pcm_uframes_t avail_min; /* min avail frames for wakeup */ snd_pcm_uframes_t avail_min; /* min avail frames for wakeup */
snd_pcm_uframes_t xfer_align; /* xfer size need to be a multiple */ snd_pcm_uframes_t xfer_align; /* obsolete: xfer size need to be a multiple */
snd_pcm_uframes_t start_threshold; /* min hw_avail frames for automatic start */ snd_pcm_uframes_t start_threshold; /* min hw_avail frames for automatic start */
snd_pcm_uframes_t stop_threshold; /* min avail frames for automatic stop */ snd_pcm_uframes_t stop_threshold; /* min avail frames for automatic stop */
snd_pcm_uframes_t silence_threshold; /* min distance from noise for silence filling */ snd_pcm_uframes_t silence_threshold; /* min distance from noise for silence filling */
......
...@@ -287,7 +287,6 @@ struct snd_pcm_runtime { ...@@ -287,7 +287,6 @@ struct snd_pcm_runtime {
int tstamp_mode; /* mmap timestamp is updated */ int tstamp_mode; /* mmap timestamp is updated */
unsigned int period_step; unsigned int period_step;
unsigned int sleep_min; /* min ticks to sleep */ unsigned int sleep_min; /* min ticks to sleep */
snd_pcm_uframes_t xfer_align; /* xfer size need to be a multiple */
snd_pcm_uframes_t start_threshold; snd_pcm_uframes_t start_threshold;
snd_pcm_uframes_t stop_threshold; snd_pcm_uframes_t stop_threshold;
snd_pcm_uframes_t silence_threshold; /* Silence filling happens when snd_pcm_uframes_t silence_threshold; /* Silence filling happens when
......
...@@ -988,7 +988,6 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream) ...@@ -988,7 +988,6 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream)
sw_params->sleep_min = 0; sw_params->sleep_min = 0;
sw_params->avail_min = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? sw_params->avail_min = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
1 : runtime->period_size; 1 : runtime->period_size;
sw_params->xfer_align = 1;
if (atomic_read(&substream->mmap_count) || if (atomic_read(&substream->mmap_count) ||
substream->oss.setup.nosilence) { substream->oss.setup.nosilence) {
sw_params->silence_threshold = 0; sw_params->silence_threshold = 0;
......
...@@ -389,7 +389,6 @@ static void snd_pcm_substream_proc_sw_params_read(struct snd_info_entry *entry, ...@@ -389,7 +389,6 @@ static void snd_pcm_substream_proc_sw_params_read(struct snd_info_entry *entry,
snd_iprintf(buffer, "period_step: %u\n", runtime->period_step); snd_iprintf(buffer, "period_step: %u\n", runtime->period_step);
snd_iprintf(buffer, "sleep_min: %u\n", runtime->sleep_min); snd_iprintf(buffer, "sleep_min: %u\n", runtime->sleep_min);
snd_iprintf(buffer, "avail_min: %lu\n", runtime->control->avail_min); snd_iprintf(buffer, "avail_min: %lu\n", runtime->control->avail_min);
snd_iprintf(buffer, "xfer_align: %lu\n", runtime->xfer_align);
snd_iprintf(buffer, "start_threshold: %lu\n", runtime->start_threshold); snd_iprintf(buffer, "start_threshold: %lu\n", runtime->start_threshold);
snd_iprintf(buffer, "stop_threshold: %lu\n", runtime->stop_threshold); snd_iprintf(buffer, "stop_threshold: %lu\n", runtime->stop_threshold);
snd_iprintf(buffer, "silence_threshold: %lu\n", runtime->silence_threshold); snd_iprintf(buffer, "silence_threshold: %lu\n", runtime->silence_threshold);
......
...@@ -1628,8 +1628,6 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream, ...@@ -1628,8 +1628,6 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream,
if (size == 0) if (size == 0)
return 0; return 0;
if (size > runtime->xfer_align)
size -= size % runtime->xfer_align;
snd_pcm_stream_lock_irq(substream); snd_pcm_stream_lock_irq(substream);
switch (runtime->status->state) { switch (runtime->status->state) {
...@@ -1657,9 +1655,7 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream, ...@@ -1657,9 +1655,7 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream,
avail = snd_pcm_playback_avail(runtime); avail = snd_pcm_playback_avail(runtime);
if (!avail || if (!avail ||
(snd_pcm_running(substream) && (snd_pcm_running(substream) &&
((avail < runtime->control->avail_min && size > avail) || (avail < runtime->control->avail_min && size > avail))) {
(size >= runtime->xfer_align &&
avail < runtime->xfer_align)))) {
wait_queue_t wait; wait_queue_t wait;
enum { READY, SIGNALED, ERROR, SUSPENDED, EXPIRED, DROPPED } state; enum { READY, SIGNALED, ERROR, SUSPENDED, EXPIRED, DROPPED } state;
long tout; long tout;
...@@ -1731,8 +1727,6 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream, ...@@ -1731,8 +1727,6 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream,
break; break;
} }
} }
if (avail > runtime->xfer_align)
avail -= avail % runtime->xfer_align;
frames = size > avail ? avail : size; frames = size > avail ? avail : size;
cont = runtime->buffer_size - runtime->control->appl_ptr % runtime->buffer_size; cont = runtime->buffer_size - runtime->control->appl_ptr % runtime->buffer_size;
if (frames > cont) if (frames > cont)
...@@ -1900,8 +1894,6 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream, ...@@ -1900,8 +1894,6 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream,
if (size == 0) if (size == 0)
return 0; return 0;
if (size > runtime->xfer_align)
size -= size % runtime->xfer_align;
snd_pcm_stream_lock_irq(substream); snd_pcm_stream_lock_irq(substream);
switch (runtime->status->state) { switch (runtime->status->state) {
...@@ -1936,12 +1928,12 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream, ...@@ -1936,12 +1928,12 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream,
__draining: __draining:
avail = snd_pcm_capture_avail(runtime); avail = snd_pcm_capture_avail(runtime);
if (runtime->status->state == SNDRV_PCM_STATE_DRAINING) { if (runtime->status->state == SNDRV_PCM_STATE_DRAINING) {
if (avail < runtime->xfer_align) { if (!avail) {
err = -EPIPE; err = -EPIPE;
goto _end_unlock; goto _end_unlock;
} }
} else if ((avail < runtime->control->avail_min && size > avail) || } else if (avail < runtime->control->avail_min &&
(size >= runtime->xfer_align && avail < runtime->xfer_align)) { size > avail) {
wait_queue_t wait; wait_queue_t wait;
enum { READY, SIGNALED, ERROR, SUSPENDED, EXPIRED, DROPPED } state; enum { READY, SIGNALED, ERROR, SUSPENDED, EXPIRED, DROPPED } state;
long tout; long tout;
...@@ -2014,8 +2006,6 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream, ...@@ -2014,8 +2006,6 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream,
break; break;
} }
} }
if (avail > runtime->xfer_align)
avail -= avail % runtime->xfer_align;
frames = size > avail ? avail : size; frames = size > avail ? avail : size;
cont = runtime->buffer_size - runtime->control->appl_ptr % runtime->buffer_size; cont = runtime->buffer_size - runtime->control->appl_ptr % runtime->buffer_size;
if (frames > cont) if (frames > cont)
......
...@@ -435,7 +435,6 @@ static int snd_pcm_hw_params(struct snd_pcm_substream *substream, ...@@ -435,7 +435,6 @@ static int snd_pcm_hw_params(struct snd_pcm_substream *substream,
runtime->period_step = 1; runtime->period_step = 1;
runtime->sleep_min = 0; runtime->sleep_min = 0;
runtime->control->avail_min = runtime->period_size; runtime->control->avail_min = runtime->period_size;
runtime->xfer_align = runtime->period_size;
runtime->start_threshold = 1; runtime->start_threshold = 1;
runtime->stop_threshold = runtime->buffer_size; runtime->stop_threshold = runtime->buffer_size;
runtime->silence_threshold = 0; runtime->silence_threshold = 0;
...@@ -532,9 +531,6 @@ static int snd_pcm_sw_params(struct snd_pcm_substream *substream, ...@@ -532,9 +531,6 @@ static int snd_pcm_sw_params(struct snd_pcm_substream *substream,
return -EINVAL; return -EINVAL;
if (params->avail_min == 0) if (params->avail_min == 0)
return -EINVAL; return -EINVAL;
if (params->xfer_align == 0 ||
params->xfer_align % runtime->min_align != 0)
return -EINVAL;
if (params->silence_size >= runtime->boundary) { if (params->silence_size >= runtime->boundary) {
if (params->silence_threshold != 0) if (params->silence_threshold != 0)
return -EINVAL; return -EINVAL;
...@@ -553,7 +549,6 @@ static int snd_pcm_sw_params(struct snd_pcm_substream *substream, ...@@ -553,7 +549,6 @@ static int snd_pcm_sw_params(struct snd_pcm_substream *substream,
runtime->stop_threshold = params->stop_threshold; runtime->stop_threshold = params->stop_threshold;
runtime->silence_threshold = params->silence_threshold; runtime->silence_threshold = params->silence_threshold;
runtime->silence_size = params->silence_size; runtime->silence_size = params->silence_size;
runtime->xfer_align = params->xfer_align;
params->boundary = runtime->boundary; params->boundary = runtime->boundary;
if (snd_pcm_running(substream)) { if (snd_pcm_running(substream)) {
if (runtime->sleep_min) if (runtime->sleep_min)
...@@ -2239,8 +2234,6 @@ static snd_pcm_sframes_t snd_pcm_playback_rewind(struct snd_pcm_substream *subst ...@@ -2239,8 +2234,6 @@ static snd_pcm_sframes_t snd_pcm_playback_rewind(struct snd_pcm_substream *subst
} }
if (frames > (snd_pcm_uframes_t)hw_avail) if (frames > (snd_pcm_uframes_t)hw_avail)
frames = hw_avail; frames = hw_avail;
else
frames -= frames % runtime->xfer_align;
appl_ptr = runtime->control->appl_ptr - frames; appl_ptr = runtime->control->appl_ptr - frames;
if (appl_ptr < 0) if (appl_ptr < 0)
appl_ptr += runtime->boundary; appl_ptr += runtime->boundary;
...@@ -2289,8 +2282,6 @@ static snd_pcm_sframes_t snd_pcm_capture_rewind(struct snd_pcm_substream *substr ...@@ -2289,8 +2282,6 @@ static snd_pcm_sframes_t snd_pcm_capture_rewind(struct snd_pcm_substream *substr
} }
if (frames > (snd_pcm_uframes_t)hw_avail) if (frames > (snd_pcm_uframes_t)hw_avail)
frames = hw_avail; frames = hw_avail;
else
frames -= frames % runtime->xfer_align;
appl_ptr = runtime->control->appl_ptr - frames; appl_ptr = runtime->control->appl_ptr - frames;
if (appl_ptr < 0) if (appl_ptr < 0)
appl_ptr += runtime->boundary; appl_ptr += runtime->boundary;
...@@ -2340,8 +2331,6 @@ static snd_pcm_sframes_t snd_pcm_playback_forward(struct snd_pcm_substream *subs ...@@ -2340,8 +2331,6 @@ static snd_pcm_sframes_t snd_pcm_playback_forward(struct snd_pcm_substream *subs
} }
if (frames > (snd_pcm_uframes_t)avail) if (frames > (snd_pcm_uframes_t)avail)
frames = avail; frames = avail;
else
frames -= frames % runtime->xfer_align;
appl_ptr = runtime->control->appl_ptr + frames; appl_ptr = runtime->control->appl_ptr + frames;
if (appl_ptr >= (snd_pcm_sframes_t)runtime->boundary) if (appl_ptr >= (snd_pcm_sframes_t)runtime->boundary)
appl_ptr -= runtime->boundary; appl_ptr -= runtime->boundary;
...@@ -2391,8 +2380,6 @@ static snd_pcm_sframes_t snd_pcm_capture_forward(struct snd_pcm_substream *subst ...@@ -2391,8 +2380,6 @@ static snd_pcm_sframes_t snd_pcm_capture_forward(struct snd_pcm_substream *subst
} }
if (frames > (snd_pcm_uframes_t)avail) if (frames > (snd_pcm_uframes_t)avail)
frames = avail; frames = avail;
else
frames -= frames % runtime->xfer_align;
appl_ptr = runtime->control->appl_ptr + frames; appl_ptr = runtime->control->appl_ptr + frames;
if (appl_ptr >= (snd_pcm_sframes_t)runtime->boundary) if (appl_ptr >= (snd_pcm_sframes_t)runtime->boundary)
appl_ptr -= runtime->boundary; appl_ptr -= runtime->boundary;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment