0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/slab.h>
0009 #include <linux/sched/signal.h>
0010 #include <linux/time.h>
0011 #include <linux/math64.h>
0012 #include <linux/export.h>
0013 #include <sound/core.h>
0014 #include <sound/control.h>
0015 #include <sound/tlv.h>
0016 #include <sound/info.h>
0017 #include <sound/pcm.h>
0018 #include <sound/pcm_params.h>
0019 #include <sound/timer.h>
0020
0021 #include "pcm_local.h"
0022
0023 #ifdef CONFIG_SND_PCM_XRUN_DEBUG
0024 #define CREATE_TRACE_POINTS
0025 #include "pcm_trace.h"
0026 #else
0027 #define trace_hwptr(substream, pos, in_interrupt)
0028 #define trace_xrun(substream)
0029 #define trace_hw_ptr_error(substream, reason)
0030 #define trace_applptr(substream, prev, curr)
0031 #endif
0032
0033 static int fill_silence_frames(struct snd_pcm_substream *substream,
0034 snd_pcm_uframes_t off, snd_pcm_uframes_t frames);
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045 void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_uframes_t new_hw_ptr)
0046 {
0047 struct snd_pcm_runtime *runtime = substream->runtime;
0048 snd_pcm_uframes_t frames, ofs, transfer;
0049 int err;
0050
0051 if (runtime->silence_size < runtime->boundary) {
0052 snd_pcm_sframes_t noise_dist, n;
0053 snd_pcm_uframes_t appl_ptr = READ_ONCE(runtime->control->appl_ptr);
0054 if (runtime->silence_start != appl_ptr) {
0055 n = appl_ptr - runtime->silence_start;
0056 if (n < 0)
0057 n += runtime->boundary;
0058 if ((snd_pcm_uframes_t)n < runtime->silence_filled)
0059 runtime->silence_filled -= n;
0060 else
0061 runtime->silence_filled = 0;
0062 runtime->silence_start = appl_ptr;
0063 }
0064 if (runtime->silence_filled >= runtime->buffer_size)
0065 return;
0066 noise_dist = snd_pcm_playback_hw_avail(runtime) + runtime->silence_filled;
0067 if (noise_dist >= (snd_pcm_sframes_t) runtime->silence_threshold)
0068 return;
0069 frames = runtime->silence_threshold - noise_dist;
0070 if (frames > runtime->silence_size)
0071 frames = runtime->silence_size;
0072 } else {
0073 if (new_hw_ptr == ULONG_MAX) {
0074 snd_pcm_sframes_t avail = snd_pcm_playback_hw_avail(runtime);
0075 if (avail > runtime->buffer_size)
0076 avail = runtime->buffer_size;
0077 runtime->silence_filled = avail > 0 ? avail : 0;
0078 runtime->silence_start = (runtime->status->hw_ptr +
0079 runtime->silence_filled) %
0080 runtime->boundary;
0081 } else {
0082 ofs = runtime->status->hw_ptr;
0083 frames = new_hw_ptr - ofs;
0084 if ((snd_pcm_sframes_t)frames < 0)
0085 frames += runtime->boundary;
0086 runtime->silence_filled -= frames;
0087 if ((snd_pcm_sframes_t)runtime->silence_filled < 0) {
0088 runtime->silence_filled = 0;
0089 runtime->silence_start = new_hw_ptr;
0090 } else {
0091 runtime->silence_start = ofs;
0092 }
0093 }
0094 frames = runtime->buffer_size - runtime->silence_filled;
0095 }
0096 if (snd_BUG_ON(frames > runtime->buffer_size))
0097 return;
0098 if (frames == 0)
0099 return;
0100 ofs = runtime->silence_start % runtime->buffer_size;
0101 while (frames > 0) {
0102 transfer = ofs + frames > runtime->buffer_size ? runtime->buffer_size - ofs : frames;
0103 err = fill_silence_frames(substream, ofs, transfer);
0104 snd_BUG_ON(err < 0);
0105 runtime->silence_filled += transfer;
0106 frames -= transfer;
0107 ofs = 0;
0108 }
0109 snd_pcm_dma_buffer_sync(substream, SNDRV_DMA_SYNC_DEVICE);
0110 }
0111
0112 #ifdef CONFIG_SND_DEBUG
0113 void snd_pcm_debug_name(struct snd_pcm_substream *substream,
0114 char *name, size_t len)
0115 {
0116 snprintf(name, len, "pcmC%dD%d%c:%d",
0117 substream->pcm->card->number,
0118 substream->pcm->device,
0119 substream->stream ? 'c' : 'p',
0120 substream->number);
0121 }
0122 EXPORT_SYMBOL(snd_pcm_debug_name);
0123 #endif
0124
0125 #define XRUN_DEBUG_BASIC (1<<0)
0126 #define XRUN_DEBUG_STACK (1<<1)
0127 #define XRUN_DEBUG_JIFFIESCHECK (1<<2)
0128
0129 #ifdef CONFIG_SND_PCM_XRUN_DEBUG
0130
0131 #define xrun_debug(substream, mask) \
0132 ((substream)->pstr->xrun_debug & (mask))
0133 #else
0134 #define xrun_debug(substream, mask) 0
0135 #endif
0136
0137 #define dump_stack_on_xrun(substream) do { \
0138 if (xrun_debug(substream, XRUN_DEBUG_STACK)) \
0139 dump_stack(); \
0140 } while (0)
0141
0142
0143 void __snd_pcm_xrun(struct snd_pcm_substream *substream)
0144 {
0145 struct snd_pcm_runtime *runtime = substream->runtime;
0146
0147 trace_xrun(substream);
0148 if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) {
0149 struct timespec64 tstamp;
0150
0151 snd_pcm_gettime(runtime, &tstamp);
0152 runtime->status->tstamp.tv_sec = tstamp.tv_sec;
0153 runtime->status->tstamp.tv_nsec = tstamp.tv_nsec;
0154 }
0155 snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
0156 if (xrun_debug(substream, XRUN_DEBUG_BASIC)) {
0157 char name[16];
0158 snd_pcm_debug_name(substream, name, sizeof(name));
0159 pcm_warn(substream->pcm, "XRUN: %s\n", name);
0160 dump_stack_on_xrun(substream);
0161 }
0162 }
0163
0164 #ifdef CONFIG_SND_PCM_XRUN_DEBUG
0165 #define hw_ptr_error(substream, in_interrupt, reason, fmt, args...) \
0166 do { \
0167 trace_hw_ptr_error(substream, reason); \
0168 if (xrun_debug(substream, XRUN_DEBUG_BASIC)) { \
0169 pr_err_ratelimited("ALSA: PCM: [%c] " reason ": " fmt, \
0170 (in_interrupt) ? 'Q' : 'P', ##args); \
0171 dump_stack_on_xrun(substream); \
0172 } \
0173 } while (0)
0174
0175 #else
0176
0177 #define hw_ptr_error(substream, fmt, args...) do { } while (0)
0178
0179 #endif
0180
0181 int snd_pcm_update_state(struct snd_pcm_substream *substream,
0182 struct snd_pcm_runtime *runtime)
0183 {
0184 snd_pcm_uframes_t avail;
0185
0186 avail = snd_pcm_avail(substream);
0187 if (avail > runtime->avail_max)
0188 runtime->avail_max = avail;
0189 if (runtime->status->state == SNDRV_PCM_STATE_DRAINING) {
0190 if (avail >= runtime->buffer_size) {
0191 snd_pcm_drain_done(substream);
0192 return -EPIPE;
0193 }
0194 } else {
0195 if (avail >= runtime->stop_threshold) {
0196 __snd_pcm_xrun(substream);
0197 return -EPIPE;
0198 }
0199 }
0200 if (runtime->twake) {
0201 if (avail >= runtime->twake)
0202 wake_up(&runtime->tsleep);
0203 } else if (avail >= runtime->control->avail_min)
0204 wake_up(&runtime->sleep);
0205 return 0;
0206 }
0207
0208 static void update_audio_tstamp(struct snd_pcm_substream *substream,
0209 struct timespec64 *curr_tstamp,
0210 struct timespec64 *audio_tstamp)
0211 {
0212 struct snd_pcm_runtime *runtime = substream->runtime;
0213 u64 audio_frames, audio_nsecs;
0214 struct timespec64 driver_tstamp;
0215
0216 if (runtime->tstamp_mode != SNDRV_PCM_TSTAMP_ENABLE)
0217 return;
0218
0219 if (!(substream->ops->get_time_info) ||
0220 (runtime->audio_tstamp_report.actual_type ==
0221 SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT)) {
0222
0223
0224
0225
0226
0227
0228 audio_frames = runtime->hw_ptr_wrap + runtime->status->hw_ptr;
0229
0230 if (runtime->audio_tstamp_config.report_delay) {
0231 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
0232 audio_frames -= runtime->delay;
0233 else
0234 audio_frames += runtime->delay;
0235 }
0236 audio_nsecs = div_u64(audio_frames * 1000000000LL,
0237 runtime->rate);
0238 *audio_tstamp = ns_to_timespec64(audio_nsecs);
0239 }
0240
0241 if (runtime->status->audio_tstamp.tv_sec != audio_tstamp->tv_sec ||
0242 runtime->status->audio_tstamp.tv_nsec != audio_tstamp->tv_nsec) {
0243 runtime->status->audio_tstamp.tv_sec = audio_tstamp->tv_sec;
0244 runtime->status->audio_tstamp.tv_nsec = audio_tstamp->tv_nsec;
0245 runtime->status->tstamp.tv_sec = curr_tstamp->tv_sec;
0246 runtime->status->tstamp.tv_nsec = curr_tstamp->tv_nsec;
0247 }
0248
0249
0250
0251
0252
0253
0254 snd_pcm_gettime(substream->runtime, &driver_tstamp);
0255 runtime->driver_tstamp = driver_tstamp;
0256 }
0257
0258 static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream,
0259 unsigned int in_interrupt)
0260 {
0261 struct snd_pcm_runtime *runtime = substream->runtime;
0262 snd_pcm_uframes_t pos;
0263 snd_pcm_uframes_t old_hw_ptr, new_hw_ptr, hw_base;
0264 snd_pcm_sframes_t hdelta, delta;
0265 unsigned long jdelta;
0266 unsigned long curr_jiffies;
0267 struct timespec64 curr_tstamp;
0268 struct timespec64 audio_tstamp;
0269 int crossed_boundary = 0;
0270
0271 old_hw_ptr = runtime->status->hw_ptr;
0272
0273
0274
0275
0276
0277
0278
0279 pos = substream->ops->pointer(substream);
0280 curr_jiffies = jiffies;
0281 if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) {
0282 if ((substream->ops->get_time_info) &&
0283 (runtime->audio_tstamp_config.type_requested != SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT)) {
0284 substream->ops->get_time_info(substream, &curr_tstamp,
0285 &audio_tstamp,
0286 &runtime->audio_tstamp_config,
0287 &runtime->audio_tstamp_report);
0288
0289
0290 if (runtime->audio_tstamp_report.actual_type == SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT)
0291 snd_pcm_gettime(runtime, &curr_tstamp);
0292 } else
0293 snd_pcm_gettime(runtime, &curr_tstamp);
0294 }
0295
0296 if (pos == SNDRV_PCM_POS_XRUN) {
0297 __snd_pcm_xrun(substream);
0298 return -EPIPE;
0299 }
0300 if (pos >= runtime->buffer_size) {
0301 if (printk_ratelimit()) {
0302 char name[16];
0303 snd_pcm_debug_name(substream, name, sizeof(name));
0304 pcm_err(substream->pcm,
0305 "invalid position: %s, pos = %ld, buffer size = %ld, period size = %ld\n",
0306 name, pos, runtime->buffer_size,
0307 runtime->period_size);
0308 }
0309 pos = 0;
0310 }
0311 pos -= pos % runtime->min_align;
0312 trace_hwptr(substream, pos, in_interrupt);
0313 hw_base = runtime->hw_ptr_base;
0314 new_hw_ptr = hw_base + pos;
0315 if (in_interrupt) {
0316
0317
0318 delta = runtime->hw_ptr_interrupt + runtime->period_size;
0319 if (delta > new_hw_ptr) {
0320
0321 hdelta = curr_jiffies - runtime->hw_ptr_jiffies;
0322 if (hdelta > runtime->hw_ptr_buffer_jiffies/2 + 1) {
0323 hw_base += runtime->buffer_size;
0324 if (hw_base >= runtime->boundary) {
0325 hw_base = 0;
0326 crossed_boundary++;
0327 }
0328 new_hw_ptr = hw_base + pos;
0329 goto __delta;
0330 }
0331 }
0332 }
0333
0334
0335 if (new_hw_ptr < old_hw_ptr) {
0336 hw_base += runtime->buffer_size;
0337 if (hw_base >= runtime->boundary) {
0338 hw_base = 0;
0339 crossed_boundary++;
0340 }
0341 new_hw_ptr = hw_base + pos;
0342 }
0343 __delta:
0344 delta = new_hw_ptr - old_hw_ptr;
0345 if (delta < 0)
0346 delta += runtime->boundary;
0347
0348 if (runtime->no_period_wakeup) {
0349 snd_pcm_sframes_t xrun_threshold;
0350
0351
0352
0353
0354 jdelta = curr_jiffies - runtime->hw_ptr_jiffies;
0355 if (jdelta < runtime->hw_ptr_buffer_jiffies / 2)
0356 goto no_delta_check;
0357 hdelta = jdelta - delta * HZ / runtime->rate;
0358 xrun_threshold = runtime->hw_ptr_buffer_jiffies / 2 + 1;
0359 while (hdelta > xrun_threshold) {
0360 delta += runtime->buffer_size;
0361 hw_base += runtime->buffer_size;
0362 if (hw_base >= runtime->boundary) {
0363 hw_base = 0;
0364 crossed_boundary++;
0365 }
0366 new_hw_ptr = hw_base + pos;
0367 hdelta -= runtime->hw_ptr_buffer_jiffies;
0368 }
0369 goto no_delta_check;
0370 }
0371
0372
0373 if (delta >= runtime->buffer_size + runtime->period_size) {
0374 hw_ptr_error(substream, in_interrupt, "Unexpected hw_ptr",
0375 "(stream=%i, pos=%ld, new_hw_ptr=%ld, old_hw_ptr=%ld)\n",
0376 substream->stream, (long)pos,
0377 (long)new_hw_ptr, (long)old_hw_ptr);
0378 return 0;
0379 }
0380
0381
0382 if (!xrun_debug(substream, XRUN_DEBUG_JIFFIESCHECK))
0383 goto no_jiffies_check;
0384
0385
0386
0387
0388
0389 if (runtime->hw.info & SNDRV_PCM_INFO_BATCH)
0390 goto no_jiffies_check;
0391 hdelta = delta;
0392 if (hdelta < runtime->delay)
0393 goto no_jiffies_check;
0394 hdelta -= runtime->delay;
0395 jdelta = curr_jiffies - runtime->hw_ptr_jiffies;
0396 if (((hdelta * HZ) / runtime->rate) > jdelta + HZ/100) {
0397 delta = jdelta /
0398 (((runtime->period_size * HZ) / runtime->rate)
0399 + HZ/100);
0400
0401 new_hw_ptr = old_hw_ptr;
0402 hw_base = delta;
0403
0404
0405 while (delta > 0) {
0406 new_hw_ptr += runtime->period_size;
0407 if (new_hw_ptr >= runtime->boundary) {
0408 new_hw_ptr -= runtime->boundary;
0409 crossed_boundary--;
0410 }
0411 delta--;
0412 }
0413
0414 hw_ptr_error(substream, in_interrupt, "hw_ptr skipping",
0415 "(pos=%ld, delta=%ld, period=%ld, jdelta=%lu/%lu/%lu, hw_ptr=%ld/%ld)\n",
0416 (long)pos, (long)hdelta,
0417 (long)runtime->period_size, jdelta,
0418 ((hdelta * HZ) / runtime->rate), hw_base,
0419 (unsigned long)old_hw_ptr,
0420 (unsigned long)new_hw_ptr);
0421
0422 delta = 0;
0423 hw_base = new_hw_ptr - (new_hw_ptr % runtime->buffer_size);
0424 }
0425 no_jiffies_check:
0426 if (delta > runtime->period_size + runtime->period_size / 2) {
0427 hw_ptr_error(substream, in_interrupt,
0428 "Lost interrupts?",
0429 "(stream=%i, delta=%ld, new_hw_ptr=%ld, old_hw_ptr=%ld)\n",
0430 substream->stream, (long)delta,
0431 (long)new_hw_ptr,
0432 (long)old_hw_ptr);
0433 }
0434
0435 no_delta_check:
0436 if (runtime->status->hw_ptr == new_hw_ptr) {
0437 runtime->hw_ptr_jiffies = curr_jiffies;
0438 update_audio_tstamp(substream, &curr_tstamp, &audio_tstamp);
0439 return 0;
0440 }
0441
0442 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
0443 runtime->silence_size > 0)
0444 snd_pcm_playback_silence(substream, new_hw_ptr);
0445
0446 if (in_interrupt) {
0447 delta = new_hw_ptr - runtime->hw_ptr_interrupt;
0448 if (delta < 0)
0449 delta += runtime->boundary;
0450 delta -= (snd_pcm_uframes_t)delta % runtime->period_size;
0451 runtime->hw_ptr_interrupt += delta;
0452 if (runtime->hw_ptr_interrupt >= runtime->boundary)
0453 runtime->hw_ptr_interrupt -= runtime->boundary;
0454 }
0455 runtime->hw_ptr_base = hw_base;
0456 runtime->status->hw_ptr = new_hw_ptr;
0457 runtime->hw_ptr_jiffies = curr_jiffies;
0458 if (crossed_boundary) {
0459 snd_BUG_ON(crossed_boundary != 1);
0460 runtime->hw_ptr_wrap += runtime->boundary;
0461 }
0462
0463 update_audio_tstamp(substream, &curr_tstamp, &audio_tstamp);
0464
0465 return snd_pcm_update_state(substream, runtime);
0466 }
0467
0468
0469 int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream)
0470 {
0471 return snd_pcm_update_hw_ptr0(substream, 0);
0472 }
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482 void snd_pcm_set_ops(struct snd_pcm *pcm, int direction,
0483 const struct snd_pcm_ops *ops)
0484 {
0485 struct snd_pcm_str *stream = &pcm->streams[direction];
0486 struct snd_pcm_substream *substream;
0487
0488 for (substream = stream->substream; substream != NULL; substream = substream->next)
0489 substream->ops = ops;
0490 }
0491 EXPORT_SYMBOL(snd_pcm_set_ops);
0492
0493
0494
0495
0496
0497
0498
0499 void snd_pcm_set_sync(struct snd_pcm_substream *substream)
0500 {
0501 struct snd_pcm_runtime *runtime = substream->runtime;
0502
0503 runtime->sync.id32[0] = substream->pcm->card->number;
0504 runtime->sync.id32[1] = -1;
0505 runtime->sync.id32[2] = -1;
0506 runtime->sync.id32[3] = -1;
0507 }
0508 EXPORT_SYMBOL(snd_pcm_set_sync);
0509
0510
0511
0512
0513
0514 static inline unsigned int div32(unsigned int a, unsigned int b,
0515 unsigned int *r)
0516 {
0517 if (b == 0) {
0518 *r = 0;
0519 return UINT_MAX;
0520 }
0521 *r = a % b;
0522 return a / b;
0523 }
0524
0525 static inline unsigned int div_down(unsigned int a, unsigned int b)
0526 {
0527 if (b == 0)
0528 return UINT_MAX;
0529 return a / b;
0530 }
0531
0532 static inline unsigned int div_up(unsigned int a, unsigned int b)
0533 {
0534 unsigned int r;
0535 unsigned int q;
0536 if (b == 0)
0537 return UINT_MAX;
0538 q = div32(a, b, &r);
0539 if (r)
0540 ++q;
0541 return q;
0542 }
0543
0544 static inline unsigned int mul(unsigned int a, unsigned int b)
0545 {
0546 if (a == 0)
0547 return 0;
0548 if (div_down(UINT_MAX, a) < b)
0549 return UINT_MAX;
0550 return a * b;
0551 }
0552
0553 static inline unsigned int muldiv32(unsigned int a, unsigned int b,
0554 unsigned int c, unsigned int *r)
0555 {
0556 u_int64_t n = (u_int64_t) a * b;
0557 if (c == 0) {
0558 *r = 0;
0559 return UINT_MAX;
0560 }
0561 n = div_u64_rem(n, c, r);
0562 if (n >= UINT_MAX) {
0563 *r = 0;
0564 return UINT_MAX;
0565 }
0566 return n;
0567 }
0568
0569
0570
0571
0572
0573
0574
0575
0576
0577
0578
0579
0580
0581 int snd_interval_refine(struct snd_interval *i, const struct snd_interval *v)
0582 {
0583 int changed = 0;
0584 if (snd_BUG_ON(snd_interval_empty(i)))
0585 return -EINVAL;
0586 if (i->min < v->min) {
0587 i->min = v->min;
0588 i->openmin = v->openmin;
0589 changed = 1;
0590 } else if (i->min == v->min && !i->openmin && v->openmin) {
0591 i->openmin = 1;
0592 changed = 1;
0593 }
0594 if (i->max > v->max) {
0595 i->max = v->max;
0596 i->openmax = v->openmax;
0597 changed = 1;
0598 } else if (i->max == v->max && !i->openmax && v->openmax) {
0599 i->openmax = 1;
0600 changed = 1;
0601 }
0602 if (!i->integer && v->integer) {
0603 i->integer = 1;
0604 changed = 1;
0605 }
0606 if (i->integer) {
0607 if (i->openmin) {
0608 i->min++;
0609 i->openmin = 0;
0610 }
0611 if (i->openmax) {
0612 i->max--;
0613 i->openmax = 0;
0614 }
0615 } else if (!i->openmin && !i->openmax && i->min == i->max)
0616 i->integer = 1;
0617 if (snd_interval_checkempty(i)) {
0618 snd_interval_none(i);
0619 return -EINVAL;
0620 }
0621 return changed;
0622 }
0623 EXPORT_SYMBOL(snd_interval_refine);
0624
0625 static int snd_interval_refine_first(struct snd_interval *i)
0626 {
0627 const unsigned int last_max = i->max;
0628
0629 if (snd_BUG_ON(snd_interval_empty(i)))
0630 return -EINVAL;
0631 if (snd_interval_single(i))
0632 return 0;
0633 i->max = i->min;
0634 if (i->openmin)
0635 i->max++;
0636
0637 i->openmax = (i->openmax && i->max >= last_max);
0638 return 1;
0639 }
0640
0641 static int snd_interval_refine_last(struct snd_interval *i)
0642 {
0643 const unsigned int last_min = i->min;
0644
0645 if (snd_BUG_ON(snd_interval_empty(i)))
0646 return -EINVAL;
0647 if (snd_interval_single(i))
0648 return 0;
0649 i->min = i->max;
0650 if (i->openmax)
0651 i->min--;
0652
0653 i->openmin = (i->openmin && i->min <= last_min);
0654 return 1;
0655 }
0656
0657 void snd_interval_mul(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c)
0658 {
0659 if (a->empty || b->empty) {
0660 snd_interval_none(c);
0661 return;
0662 }
0663 c->empty = 0;
0664 c->min = mul(a->min, b->min);
0665 c->openmin = (a->openmin || b->openmin);
0666 c->max = mul(a->max, b->max);
0667 c->openmax = (a->openmax || b->openmax);
0668 c->integer = (a->integer && b->integer);
0669 }
0670
0671
0672
0673
0674
0675
0676
0677
0678
0679
0680
0681 void snd_interval_div(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c)
0682 {
0683 unsigned int r;
0684 if (a->empty || b->empty) {
0685 snd_interval_none(c);
0686 return;
0687 }
0688 c->empty = 0;
0689 c->min = div32(a->min, b->max, &r);
0690 c->openmin = (r || a->openmin || b->openmax);
0691 if (b->min > 0) {
0692 c->max = div32(a->max, b->min, &r);
0693 if (r) {
0694 c->max++;
0695 c->openmax = 1;
0696 } else
0697 c->openmax = (a->openmax || b->openmin);
0698 } else {
0699 c->max = UINT_MAX;
0700 c->openmax = 0;
0701 }
0702 c->integer = 0;
0703 }
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714
0715
0716 void snd_interval_muldivk(const struct snd_interval *a, const struct snd_interval *b,
0717 unsigned int k, struct snd_interval *c)
0718 {
0719 unsigned int r;
0720 if (a->empty || b->empty) {
0721 snd_interval_none(c);
0722 return;
0723 }
0724 c->empty = 0;
0725 c->min = muldiv32(a->min, b->min, k, &r);
0726 c->openmin = (r || a->openmin || b->openmin);
0727 c->max = muldiv32(a->max, b->max, k, &r);
0728 if (r) {
0729 c->max++;
0730 c->openmax = 1;
0731 } else
0732 c->openmax = (a->openmax || b->openmax);
0733 c->integer = 0;
0734 }
0735
0736
0737
0738
0739
0740
0741
0742
0743
0744
0745
0746
0747 void snd_interval_mulkdiv(const struct snd_interval *a, unsigned int k,
0748 const struct snd_interval *b, struct snd_interval *c)
0749 {
0750 unsigned int r;
0751 if (a->empty || b->empty) {
0752 snd_interval_none(c);
0753 return;
0754 }
0755 c->empty = 0;
0756 c->min = muldiv32(a->min, k, b->max, &r);
0757 c->openmin = (r || a->openmin || b->openmax);
0758 if (b->min > 0) {
0759 c->max = muldiv32(a->max, k, b->min, &r);
0760 if (r) {
0761 c->max++;
0762 c->openmax = 1;
0763 } else
0764 c->openmax = (a->openmax || b->openmin);
0765 } else {
0766 c->max = UINT_MAX;
0767 c->openmax = 0;
0768 }
0769 c->integer = 0;
0770 }
0771
0772
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786 int snd_interval_ratnum(struct snd_interval *i,
0787 unsigned int rats_count, const struct snd_ratnum *rats,
0788 unsigned int *nump, unsigned int *denp)
0789 {
0790 unsigned int best_num, best_den;
0791 int best_diff;
0792 unsigned int k;
0793 struct snd_interval t;
0794 int err;
0795 unsigned int result_num, result_den;
0796 int result_diff;
0797
0798 best_num = best_den = best_diff = 0;
0799 for (k = 0; k < rats_count; ++k) {
0800 unsigned int num = rats[k].num;
0801 unsigned int den;
0802 unsigned int q = i->min;
0803 int diff;
0804 if (q == 0)
0805 q = 1;
0806 den = div_up(num, q);
0807 if (den < rats[k].den_min)
0808 continue;
0809 if (den > rats[k].den_max)
0810 den = rats[k].den_max;
0811 else {
0812 unsigned int r;
0813 r = (den - rats[k].den_min) % rats[k].den_step;
0814 if (r != 0)
0815 den -= r;
0816 }
0817 diff = num - q * den;
0818 if (diff < 0)
0819 diff = -diff;
0820 if (best_num == 0 ||
0821 diff * best_den < best_diff * den) {
0822 best_diff = diff;
0823 best_den = den;
0824 best_num = num;
0825 }
0826 }
0827 if (best_den == 0) {
0828 i->empty = 1;
0829 return -EINVAL;
0830 }
0831 t.min = div_down(best_num, best_den);
0832 t.openmin = !!(best_num % best_den);
0833
0834 result_num = best_num;
0835 result_diff = best_diff;
0836 result_den = best_den;
0837 best_num = best_den = best_diff = 0;
0838 for (k = 0; k < rats_count; ++k) {
0839 unsigned int num = rats[k].num;
0840 unsigned int den;
0841 unsigned int q = i->max;
0842 int diff;
0843 if (q == 0) {
0844 i->empty = 1;
0845 return -EINVAL;
0846 }
0847 den = div_down(num, q);
0848 if (den > rats[k].den_max)
0849 continue;
0850 if (den < rats[k].den_min)
0851 den = rats[k].den_min;
0852 else {
0853 unsigned int r;
0854 r = (den - rats[k].den_min) % rats[k].den_step;
0855 if (r != 0)
0856 den += rats[k].den_step - r;
0857 }
0858 diff = q * den - num;
0859 if (diff < 0)
0860 diff = -diff;
0861 if (best_num == 0 ||
0862 diff * best_den < best_diff * den) {
0863 best_diff = diff;
0864 best_den = den;
0865 best_num = num;
0866 }
0867 }
0868 if (best_den == 0) {
0869 i->empty = 1;
0870 return -EINVAL;
0871 }
0872 t.max = div_up(best_num, best_den);
0873 t.openmax = !!(best_num % best_den);
0874 t.integer = 0;
0875 err = snd_interval_refine(i, &t);
0876 if (err < 0)
0877 return err;
0878
0879 if (snd_interval_single(i)) {
0880 if (best_diff * result_den < result_diff * best_den) {
0881 result_num = best_num;
0882 result_den = best_den;
0883 }
0884 if (nump)
0885 *nump = result_num;
0886 if (denp)
0887 *denp = result_den;
0888 }
0889 return err;
0890 }
0891 EXPORT_SYMBOL(snd_interval_ratnum);
0892
0893
0894
0895
0896
0897
0898
0899
0900
0901
0902
0903
0904 static int snd_interval_ratden(struct snd_interval *i,
0905 unsigned int rats_count,
0906 const struct snd_ratden *rats,
0907 unsigned int *nump, unsigned int *denp)
0908 {
0909 unsigned int best_num, best_diff, best_den;
0910 unsigned int k;
0911 struct snd_interval t;
0912 int err;
0913
0914 best_num = best_den = best_diff = 0;
0915 for (k = 0; k < rats_count; ++k) {
0916 unsigned int num;
0917 unsigned int den = rats[k].den;
0918 unsigned int q = i->min;
0919 int diff;
0920 num = mul(q, den);
0921 if (num > rats[k].num_max)
0922 continue;
0923 if (num < rats[k].num_min)
0924 num = rats[k].num_max;
0925 else {
0926 unsigned int r;
0927 r = (num - rats[k].num_min) % rats[k].num_step;
0928 if (r != 0)
0929 num += rats[k].num_step - r;
0930 }
0931 diff = num - q * den;
0932 if (best_num == 0 ||
0933 diff * best_den < best_diff * den) {
0934 best_diff = diff;
0935 best_den = den;
0936 best_num = num;
0937 }
0938 }
0939 if (best_den == 0) {
0940 i->empty = 1;
0941 return -EINVAL;
0942 }
0943 t.min = div_down(best_num, best_den);
0944 t.openmin = !!(best_num % best_den);
0945
0946 best_num = best_den = best_diff = 0;
0947 for (k = 0; k < rats_count; ++k) {
0948 unsigned int num;
0949 unsigned int den = rats[k].den;
0950 unsigned int q = i->max;
0951 int diff;
0952 num = mul(q, den);
0953 if (num < rats[k].num_min)
0954 continue;
0955 if (num > rats[k].num_max)
0956 num = rats[k].num_max;
0957 else {
0958 unsigned int r;
0959 r = (num - rats[k].num_min) % rats[k].num_step;
0960 if (r != 0)
0961 num -= r;
0962 }
0963 diff = q * den - num;
0964 if (best_num == 0 ||
0965 diff * best_den < best_diff * den) {
0966 best_diff = diff;
0967 best_den = den;
0968 best_num = num;
0969 }
0970 }
0971 if (best_den == 0) {
0972 i->empty = 1;
0973 return -EINVAL;
0974 }
0975 t.max = div_up(best_num, best_den);
0976 t.openmax = !!(best_num % best_den);
0977 t.integer = 0;
0978 err = snd_interval_refine(i, &t);
0979 if (err < 0)
0980 return err;
0981
0982 if (snd_interval_single(i)) {
0983 if (nump)
0984 *nump = best_num;
0985 if (denp)
0986 *denp = best_den;
0987 }
0988 return err;
0989 }
0990
0991
0992
0993
0994
0995
0996
0997
0998
0999
1000
1001
1002
1003
1004
1005 int snd_interval_list(struct snd_interval *i, unsigned int count,
1006 const unsigned int *list, unsigned int mask)
1007 {
1008 unsigned int k;
1009 struct snd_interval list_range;
1010
1011 if (!count) {
1012 i->empty = 1;
1013 return -EINVAL;
1014 }
1015 snd_interval_any(&list_range);
1016 list_range.min = UINT_MAX;
1017 list_range.max = 0;
1018 for (k = 0; k < count; k++) {
1019 if (mask && !(mask & (1 << k)))
1020 continue;
1021 if (!snd_interval_test(i, list[k]))
1022 continue;
1023 list_range.min = min(list_range.min, list[k]);
1024 list_range.max = max(list_range.max, list[k]);
1025 }
1026 return snd_interval_refine(i, &list_range);
1027 }
1028 EXPORT_SYMBOL(snd_interval_list);
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044 int snd_interval_ranges(struct snd_interval *i, unsigned int count,
1045 const struct snd_interval *ranges, unsigned int mask)
1046 {
1047 unsigned int k;
1048 struct snd_interval range_union;
1049 struct snd_interval range;
1050
1051 if (!count) {
1052 snd_interval_none(i);
1053 return -EINVAL;
1054 }
1055 snd_interval_any(&range_union);
1056 range_union.min = UINT_MAX;
1057 range_union.max = 0;
1058 for (k = 0; k < count; k++) {
1059 if (mask && !(mask & (1 << k)))
1060 continue;
1061 snd_interval_copy(&range, &ranges[k]);
1062 if (snd_interval_refine(&range, i) < 0)
1063 continue;
1064 if (snd_interval_empty(&range))
1065 continue;
1066
1067 if (range.min < range_union.min) {
1068 range_union.min = range.min;
1069 range_union.openmin = 1;
1070 }
1071 if (range.min == range_union.min && !range.openmin)
1072 range_union.openmin = 0;
1073 if (range.max > range_union.max) {
1074 range_union.max = range.max;
1075 range_union.openmax = 1;
1076 }
1077 if (range.max == range_union.max && !range.openmax)
1078 range_union.openmax = 0;
1079 }
1080 return snd_interval_refine(i, &range_union);
1081 }
1082 EXPORT_SYMBOL(snd_interval_ranges);
1083
1084 static int snd_interval_step(struct snd_interval *i, unsigned int step)
1085 {
1086 unsigned int n;
1087 int changed = 0;
1088 n = i->min % step;
1089 if (n != 0 || i->openmin) {
1090 i->min += step - n;
1091 i->openmin = 0;
1092 changed = 1;
1093 }
1094 n = i->max % step;
1095 if (n != 0 || i->openmax) {
1096 i->max -= n;
1097 i->openmax = 0;
1098 changed = 1;
1099 }
1100 if (snd_interval_checkempty(i)) {
1101 i->empty = 1;
1102 return -EINVAL;
1103 }
1104 return changed;
1105 }
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120 int snd_pcm_hw_rule_add(struct snd_pcm_runtime *runtime, unsigned int cond,
1121 int var,
1122 snd_pcm_hw_rule_func_t func, void *private,
1123 int dep, ...)
1124 {
1125 struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
1126 struct snd_pcm_hw_rule *c;
1127 unsigned int k;
1128 va_list args;
1129 va_start(args, dep);
1130 if (constrs->rules_num >= constrs->rules_all) {
1131 struct snd_pcm_hw_rule *new;
1132 unsigned int new_rules = constrs->rules_all + 16;
1133 new = krealloc_array(constrs->rules, new_rules,
1134 sizeof(*c), GFP_KERNEL);
1135 if (!new) {
1136 va_end(args);
1137 return -ENOMEM;
1138 }
1139 constrs->rules = new;
1140 constrs->rules_all = new_rules;
1141 }
1142 c = &constrs->rules[constrs->rules_num];
1143 c->cond = cond;
1144 c->func = func;
1145 c->var = var;
1146 c->private = private;
1147 k = 0;
1148 while (1) {
1149 if (snd_BUG_ON(k >= ARRAY_SIZE(c->deps))) {
1150 va_end(args);
1151 return -EINVAL;
1152 }
1153 c->deps[k++] = dep;
1154 if (dep < 0)
1155 break;
1156 dep = va_arg(args, int);
1157 }
1158 constrs->rules_num++;
1159 va_end(args);
1160 return 0;
1161 }
1162 EXPORT_SYMBOL(snd_pcm_hw_rule_add);
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174 int snd_pcm_hw_constraint_mask(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
1175 u_int32_t mask)
1176 {
1177 struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
1178 struct snd_mask *maskp = constrs_mask(constrs, var);
1179 *maskp->bits &= mask;
1180 memset(maskp->bits + 1, 0, (SNDRV_MASK_MAX-32) / 8);
1181 if (*maskp->bits == 0)
1182 return -EINVAL;
1183 return 0;
1184 }
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196 int snd_pcm_hw_constraint_mask64(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
1197 u_int64_t mask)
1198 {
1199 struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
1200 struct snd_mask *maskp = constrs_mask(constrs, var);
1201 maskp->bits[0] &= (u_int32_t)mask;
1202 maskp->bits[1] &= (u_int32_t)(mask >> 32);
1203 memset(maskp->bits + 2, 0, (SNDRV_MASK_MAX-64) / 8);
1204 if (! maskp->bits[0] && ! maskp->bits[1])
1205 return -EINVAL;
1206 return 0;
1207 }
1208 EXPORT_SYMBOL(snd_pcm_hw_constraint_mask64);
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220 int snd_pcm_hw_constraint_integer(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var)
1221 {
1222 struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
1223 return snd_interval_setinteger(constrs_interval(constrs, var));
1224 }
1225 EXPORT_SYMBOL(snd_pcm_hw_constraint_integer);
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239 int snd_pcm_hw_constraint_minmax(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
1240 unsigned int min, unsigned int max)
1241 {
1242 struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
1243 struct snd_interval t;
1244 t.min = min;
1245 t.max = max;
1246 t.openmin = t.openmax = 0;
1247 t.integer = 0;
1248 return snd_interval_refine(constrs_interval(constrs, var), &t);
1249 }
1250 EXPORT_SYMBOL(snd_pcm_hw_constraint_minmax);
1251
1252 static int snd_pcm_hw_rule_list(struct snd_pcm_hw_params *params,
1253 struct snd_pcm_hw_rule *rule)
1254 {
1255 struct snd_pcm_hw_constraint_list *list = rule->private;
1256 return snd_interval_list(hw_param_interval(params, rule->var), list->count, list->list, list->mask);
1257 }
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271 int snd_pcm_hw_constraint_list(struct snd_pcm_runtime *runtime,
1272 unsigned int cond,
1273 snd_pcm_hw_param_t var,
1274 const struct snd_pcm_hw_constraint_list *l)
1275 {
1276 return snd_pcm_hw_rule_add(runtime, cond, var,
1277 snd_pcm_hw_rule_list, (void *)l,
1278 var, -1);
1279 }
1280 EXPORT_SYMBOL(snd_pcm_hw_constraint_list);
1281
1282 static int snd_pcm_hw_rule_ranges(struct snd_pcm_hw_params *params,
1283 struct snd_pcm_hw_rule *rule)
1284 {
1285 struct snd_pcm_hw_constraint_ranges *r = rule->private;
1286 return snd_interval_ranges(hw_param_interval(params, rule->var),
1287 r->count, r->ranges, r->mask);
1288 }
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302 int snd_pcm_hw_constraint_ranges(struct snd_pcm_runtime *runtime,
1303 unsigned int cond,
1304 snd_pcm_hw_param_t var,
1305 const struct snd_pcm_hw_constraint_ranges *r)
1306 {
1307 return snd_pcm_hw_rule_add(runtime, cond, var,
1308 snd_pcm_hw_rule_ranges, (void *)r,
1309 var, -1);
1310 }
1311 EXPORT_SYMBOL(snd_pcm_hw_constraint_ranges);
1312
1313 static int snd_pcm_hw_rule_ratnums(struct snd_pcm_hw_params *params,
1314 struct snd_pcm_hw_rule *rule)
1315 {
1316 const struct snd_pcm_hw_constraint_ratnums *r = rule->private;
1317 unsigned int num = 0, den = 0;
1318 int err;
1319 err = snd_interval_ratnum(hw_param_interval(params, rule->var),
1320 r->nrats, r->rats, &num, &den);
1321 if (err >= 0 && den && rule->var == SNDRV_PCM_HW_PARAM_RATE) {
1322 params->rate_num = num;
1323 params->rate_den = den;
1324 }
1325 return err;
1326 }
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337 int snd_pcm_hw_constraint_ratnums(struct snd_pcm_runtime *runtime,
1338 unsigned int cond,
1339 snd_pcm_hw_param_t var,
1340 const struct snd_pcm_hw_constraint_ratnums *r)
1341 {
1342 return snd_pcm_hw_rule_add(runtime, cond, var,
1343 snd_pcm_hw_rule_ratnums, (void *)r,
1344 var, -1);
1345 }
1346 EXPORT_SYMBOL(snd_pcm_hw_constraint_ratnums);
1347
1348 static int snd_pcm_hw_rule_ratdens(struct snd_pcm_hw_params *params,
1349 struct snd_pcm_hw_rule *rule)
1350 {
1351 const struct snd_pcm_hw_constraint_ratdens *r = rule->private;
1352 unsigned int num = 0, den = 0;
1353 int err = snd_interval_ratden(hw_param_interval(params, rule->var),
1354 r->nrats, r->rats, &num, &den);
1355 if (err >= 0 && den && rule->var == SNDRV_PCM_HW_PARAM_RATE) {
1356 params->rate_num = num;
1357 params->rate_den = den;
1358 }
1359 return err;
1360 }
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371 int snd_pcm_hw_constraint_ratdens(struct snd_pcm_runtime *runtime,
1372 unsigned int cond,
1373 snd_pcm_hw_param_t var,
1374 const struct snd_pcm_hw_constraint_ratdens *r)
1375 {
1376 return snd_pcm_hw_rule_add(runtime, cond, var,
1377 snd_pcm_hw_rule_ratdens, (void *)r,
1378 var, -1);
1379 }
1380 EXPORT_SYMBOL(snd_pcm_hw_constraint_ratdens);
1381
1382 static int snd_pcm_hw_rule_msbits(struct snd_pcm_hw_params *params,
1383 struct snd_pcm_hw_rule *rule)
1384 {
1385 unsigned int l = (unsigned long) rule->private;
1386 int width = l & 0xffff;
1387 unsigned int msbits = l >> 16;
1388 const struct snd_interval *i =
1389 hw_param_interval_c(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS);
1390
1391 if (!snd_interval_single(i))
1392 return 0;
1393
1394 if ((snd_interval_value(i) == width) ||
1395 (width == 0 && snd_interval_value(i) > msbits))
1396 params->msbits = min_not_zero(params->msbits, msbits);
1397
1398 return 0;
1399 }
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415 int snd_pcm_hw_constraint_msbits(struct snd_pcm_runtime *runtime,
1416 unsigned int cond,
1417 unsigned int width,
1418 unsigned int msbits)
1419 {
1420 unsigned long l = (msbits << 16) | width;
1421 return snd_pcm_hw_rule_add(runtime, cond, -1,
1422 snd_pcm_hw_rule_msbits,
1423 (void*) l,
1424 SNDRV_PCM_HW_PARAM_SAMPLE_BITS, -1);
1425 }
1426 EXPORT_SYMBOL(snd_pcm_hw_constraint_msbits);
1427
1428 static int snd_pcm_hw_rule_step(struct snd_pcm_hw_params *params,
1429 struct snd_pcm_hw_rule *rule)
1430 {
1431 unsigned long step = (unsigned long) rule->private;
1432 return snd_interval_step(hw_param_interval(params, rule->var), step);
1433 }
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444 int snd_pcm_hw_constraint_step(struct snd_pcm_runtime *runtime,
1445 unsigned int cond,
1446 snd_pcm_hw_param_t var,
1447 unsigned long step)
1448 {
1449 return snd_pcm_hw_rule_add(runtime, cond, var,
1450 snd_pcm_hw_rule_step, (void *) step,
1451 var, -1);
1452 }
1453 EXPORT_SYMBOL(snd_pcm_hw_constraint_step);
1454
1455 static int snd_pcm_hw_rule_pow2(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule)
1456 {
1457 static const unsigned int pow2_sizes[] = {
1458 1<<0, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7,
1459 1<<8, 1<<9, 1<<10, 1<<11, 1<<12, 1<<13, 1<<14, 1<<15,
1460 1<<16, 1<<17, 1<<18, 1<<19, 1<<20, 1<<21, 1<<22, 1<<23,
1461 1<<24, 1<<25, 1<<26, 1<<27, 1<<28, 1<<29, 1<<30
1462 };
1463 return snd_interval_list(hw_param_interval(params, rule->var),
1464 ARRAY_SIZE(pow2_sizes), pow2_sizes, 0);
1465 }
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475 int snd_pcm_hw_constraint_pow2(struct snd_pcm_runtime *runtime,
1476 unsigned int cond,
1477 snd_pcm_hw_param_t var)
1478 {
1479 return snd_pcm_hw_rule_add(runtime, cond, var,
1480 snd_pcm_hw_rule_pow2, NULL,
1481 var, -1);
1482 }
1483 EXPORT_SYMBOL(snd_pcm_hw_constraint_pow2);
1484
1485 static int snd_pcm_hw_rule_noresample_func(struct snd_pcm_hw_params *params,
1486 struct snd_pcm_hw_rule *rule)
1487 {
1488 unsigned int base_rate = (unsigned int)(uintptr_t)rule->private;
1489 struct snd_interval *rate;
1490
1491 rate = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
1492 return snd_interval_list(rate, 1, &base_rate, 0);
1493 }
1494
1495
1496
1497
1498
1499
1500
1501
1502 int snd_pcm_hw_rule_noresample(struct snd_pcm_runtime *runtime,
1503 unsigned int base_rate)
1504 {
1505 return snd_pcm_hw_rule_add(runtime, SNDRV_PCM_HW_PARAMS_NORESAMPLE,
1506 SNDRV_PCM_HW_PARAM_RATE,
1507 snd_pcm_hw_rule_noresample_func,
1508 (void *)(uintptr_t)base_rate,
1509 SNDRV_PCM_HW_PARAM_RATE, -1);
1510 }
1511 EXPORT_SYMBOL(snd_pcm_hw_rule_noresample);
1512
1513 static void _snd_pcm_hw_param_any(struct snd_pcm_hw_params *params,
1514 snd_pcm_hw_param_t var)
1515 {
1516 if (hw_is_mask(var)) {
1517 snd_mask_any(hw_param_mask(params, var));
1518 params->cmask |= 1 << var;
1519 params->rmask |= 1 << var;
1520 return;
1521 }
1522 if (hw_is_interval(var)) {
1523 snd_interval_any(hw_param_interval(params, var));
1524 params->cmask |= 1 << var;
1525 params->rmask |= 1 << var;
1526 return;
1527 }
1528 snd_BUG();
1529 }
1530
1531 void _snd_pcm_hw_params_any(struct snd_pcm_hw_params *params)
1532 {
1533 unsigned int k;
1534 memset(params, 0, sizeof(*params));
1535 for (k = SNDRV_PCM_HW_PARAM_FIRST_MASK; k <= SNDRV_PCM_HW_PARAM_LAST_MASK; k++)
1536 _snd_pcm_hw_param_any(params, k);
1537 for (k = SNDRV_PCM_HW_PARAM_FIRST_INTERVAL; k <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL; k++)
1538 _snd_pcm_hw_param_any(params, k);
1539 params->info = ~0U;
1540 }
1541 EXPORT_SYMBOL(_snd_pcm_hw_params_any);
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552 int snd_pcm_hw_param_value(const struct snd_pcm_hw_params *params,
1553 snd_pcm_hw_param_t var, int *dir)
1554 {
1555 if (hw_is_mask(var)) {
1556 const struct snd_mask *mask = hw_param_mask_c(params, var);
1557 if (!snd_mask_single(mask))
1558 return -EINVAL;
1559 if (dir)
1560 *dir = 0;
1561 return snd_mask_value(mask);
1562 }
1563 if (hw_is_interval(var)) {
1564 const struct snd_interval *i = hw_param_interval_c(params, var);
1565 if (!snd_interval_single(i))
1566 return -EINVAL;
1567 if (dir)
1568 *dir = i->openmin;
1569 return snd_interval_value(i);
1570 }
1571 return -EINVAL;
1572 }
1573 EXPORT_SYMBOL(snd_pcm_hw_param_value);
1574
1575 void _snd_pcm_hw_param_setempty(struct snd_pcm_hw_params *params,
1576 snd_pcm_hw_param_t var)
1577 {
1578 if (hw_is_mask(var)) {
1579 snd_mask_none(hw_param_mask(params, var));
1580 params->cmask |= 1 << var;
1581 params->rmask |= 1 << var;
1582 } else if (hw_is_interval(var)) {
1583 snd_interval_none(hw_param_interval(params, var));
1584 params->cmask |= 1 << var;
1585 params->rmask |= 1 << var;
1586 } else {
1587 snd_BUG();
1588 }
1589 }
1590 EXPORT_SYMBOL(_snd_pcm_hw_param_setempty);
1591
1592 static int _snd_pcm_hw_param_first(struct snd_pcm_hw_params *params,
1593 snd_pcm_hw_param_t var)
1594 {
1595 int changed;
1596 if (hw_is_mask(var))
1597 changed = snd_mask_refine_first(hw_param_mask(params, var));
1598 else if (hw_is_interval(var))
1599 changed = snd_interval_refine_first(hw_param_interval(params, var));
1600 else
1601 return -EINVAL;
1602 if (changed > 0) {
1603 params->cmask |= 1 << var;
1604 params->rmask |= 1 << var;
1605 }
1606 return changed;
1607 }
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622 int snd_pcm_hw_param_first(struct snd_pcm_substream *pcm,
1623 struct snd_pcm_hw_params *params,
1624 snd_pcm_hw_param_t var, int *dir)
1625 {
1626 int changed = _snd_pcm_hw_param_first(params, var);
1627 if (changed < 0)
1628 return changed;
1629 if (params->rmask) {
1630 int err = snd_pcm_hw_refine(pcm, params);
1631 if (err < 0)
1632 return err;
1633 }
1634 return snd_pcm_hw_param_value(params, var, dir);
1635 }
1636 EXPORT_SYMBOL(snd_pcm_hw_param_first);
1637
1638 static int _snd_pcm_hw_param_last(struct snd_pcm_hw_params *params,
1639 snd_pcm_hw_param_t var)
1640 {
1641 int changed;
1642 if (hw_is_mask(var))
1643 changed = snd_mask_refine_last(hw_param_mask(params, var));
1644 else if (hw_is_interval(var))
1645 changed = snd_interval_refine_last(hw_param_interval(params, var));
1646 else
1647 return -EINVAL;
1648 if (changed > 0) {
1649 params->cmask |= 1 << var;
1650 params->rmask |= 1 << var;
1651 }
1652 return changed;
1653 }
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668 int snd_pcm_hw_param_last(struct snd_pcm_substream *pcm,
1669 struct snd_pcm_hw_params *params,
1670 snd_pcm_hw_param_t var, int *dir)
1671 {
1672 int changed = _snd_pcm_hw_param_last(params, var);
1673 if (changed < 0)
1674 return changed;
1675 if (params->rmask) {
1676 int err = snd_pcm_hw_refine(pcm, params);
1677 if (err < 0)
1678 return err;
1679 }
1680 return snd_pcm_hw_param_value(params, var, dir);
1681 }
1682 EXPORT_SYMBOL(snd_pcm_hw_param_last);
1683
1684 static int snd_pcm_lib_ioctl_reset(struct snd_pcm_substream *substream,
1685 void *arg)
1686 {
1687 struct snd_pcm_runtime *runtime = substream->runtime;
1688 unsigned long flags;
1689 snd_pcm_stream_lock_irqsave(substream, flags);
1690 if (snd_pcm_running(substream) &&
1691 snd_pcm_update_hw_ptr(substream) >= 0)
1692 runtime->status->hw_ptr %= runtime->buffer_size;
1693 else {
1694 runtime->status->hw_ptr = 0;
1695 runtime->hw_ptr_wrap = 0;
1696 }
1697 snd_pcm_stream_unlock_irqrestore(substream, flags);
1698 return 0;
1699 }
1700
1701 static int snd_pcm_lib_ioctl_channel_info(struct snd_pcm_substream *substream,
1702 void *arg)
1703 {
1704 struct snd_pcm_channel_info *info = arg;
1705 struct snd_pcm_runtime *runtime = substream->runtime;
1706 int width;
1707 if (!(runtime->info & SNDRV_PCM_INFO_MMAP)) {
1708 info->offset = -1;
1709 return 0;
1710 }
1711 width = snd_pcm_format_physical_width(runtime->format);
1712 if (width < 0)
1713 return width;
1714 info->offset = 0;
1715 switch (runtime->access) {
1716 case SNDRV_PCM_ACCESS_MMAP_INTERLEAVED:
1717 case SNDRV_PCM_ACCESS_RW_INTERLEAVED:
1718 info->first = info->channel * width;
1719 info->step = runtime->channels * width;
1720 break;
1721 case SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED:
1722 case SNDRV_PCM_ACCESS_RW_NONINTERLEAVED:
1723 {
1724 size_t size = runtime->dma_bytes / runtime->channels;
1725 info->first = info->channel * size * 8;
1726 info->step = width;
1727 break;
1728 }
1729 default:
1730 snd_BUG();
1731 break;
1732 }
1733 return 0;
1734 }
1735
1736 static int snd_pcm_lib_ioctl_fifo_size(struct snd_pcm_substream *substream,
1737 void *arg)
1738 {
1739 struct snd_pcm_hw_params *params = arg;
1740 snd_pcm_format_t format;
1741 int channels;
1742 ssize_t frame_size;
1743
1744 params->fifo_size = substream->runtime->hw.fifo_size;
1745 if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_FIFO_IN_FRAMES)) {
1746 format = params_format(params);
1747 channels = params_channels(params);
1748 frame_size = snd_pcm_format_size(format, channels);
1749 if (frame_size > 0)
1750 params->fifo_size /= frame_size;
1751 }
1752 return 0;
1753 }
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766 int snd_pcm_lib_ioctl(struct snd_pcm_substream *substream,
1767 unsigned int cmd, void *arg)
1768 {
1769 switch (cmd) {
1770 case SNDRV_PCM_IOCTL1_RESET:
1771 return snd_pcm_lib_ioctl_reset(substream, arg);
1772 case SNDRV_PCM_IOCTL1_CHANNEL_INFO:
1773 return snd_pcm_lib_ioctl_channel_info(substream, arg);
1774 case SNDRV_PCM_IOCTL1_FIFO_SIZE:
1775 return snd_pcm_lib_ioctl_fifo_size(substream, arg);
1776 }
1777 return -ENXIO;
1778 }
1779 EXPORT_SYMBOL(snd_pcm_lib_ioctl);
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808 void snd_pcm_period_elapsed_under_stream_lock(struct snd_pcm_substream *substream)
1809 {
1810 struct snd_pcm_runtime *runtime;
1811
1812 if (PCM_RUNTIME_CHECK(substream))
1813 return;
1814 runtime = substream->runtime;
1815
1816 if (!snd_pcm_running(substream) ||
1817 snd_pcm_update_hw_ptr0(substream, 1) < 0)
1818 goto _end;
1819
1820 #ifdef CONFIG_SND_PCM_TIMER
1821 if (substream->timer_running)
1822 snd_timer_interrupt(substream->timer, 1);
1823 #endif
1824 _end:
1825 snd_kill_fasync(runtime->fasync, SIGIO, POLL_IN);
1826 }
1827 EXPORT_SYMBOL(snd_pcm_period_elapsed_under_stream_lock);
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841 void snd_pcm_period_elapsed(struct snd_pcm_substream *substream)
1842 {
1843 unsigned long flags;
1844
1845 if (snd_BUG_ON(!substream))
1846 return;
1847
1848 snd_pcm_stream_lock_irqsave(substream, flags);
1849 snd_pcm_period_elapsed_under_stream_lock(substream);
1850 snd_pcm_stream_unlock_irqrestore(substream, flags);
1851 }
1852 EXPORT_SYMBOL(snd_pcm_period_elapsed);
1853
1854
1855
1856
1857
1858
1859
1860 static int wait_for_avail(struct snd_pcm_substream *substream,
1861 snd_pcm_uframes_t *availp)
1862 {
1863 struct snd_pcm_runtime *runtime = substream->runtime;
1864 int is_playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
1865 wait_queue_entry_t wait;
1866 int err = 0;
1867 snd_pcm_uframes_t avail = 0;
1868 long wait_time, tout;
1869
1870 init_waitqueue_entry(&wait, current);
1871 set_current_state(TASK_INTERRUPTIBLE);
1872 add_wait_queue(&runtime->tsleep, &wait);
1873
1874 if (runtime->no_period_wakeup)
1875 wait_time = MAX_SCHEDULE_TIMEOUT;
1876 else {
1877
1878 if (substream->wait_time) {
1879 wait_time = substream->wait_time;
1880 } else {
1881 wait_time = 10;
1882
1883 if (runtime->rate) {
1884 long t = runtime->period_size * 2 /
1885 runtime->rate;
1886 wait_time = max(t, wait_time);
1887 }
1888 wait_time = msecs_to_jiffies(wait_time * 1000);
1889 }
1890 }
1891
1892 for (;;) {
1893 if (signal_pending(current)) {
1894 err = -ERESTARTSYS;
1895 break;
1896 }
1897
1898
1899
1900
1901
1902
1903
1904
1905 avail = snd_pcm_avail(substream);
1906 if (avail >= runtime->twake)
1907 break;
1908 snd_pcm_stream_unlock_irq(substream);
1909
1910 tout = schedule_timeout(wait_time);
1911
1912 snd_pcm_stream_lock_irq(substream);
1913 set_current_state(TASK_INTERRUPTIBLE);
1914 switch (runtime->status->state) {
1915 case SNDRV_PCM_STATE_SUSPENDED:
1916 err = -ESTRPIPE;
1917 goto _endloop;
1918 case SNDRV_PCM_STATE_XRUN:
1919 err = -EPIPE;
1920 goto _endloop;
1921 case SNDRV_PCM_STATE_DRAINING:
1922 if (is_playback)
1923 err = -EPIPE;
1924 else
1925 avail = 0;
1926 goto _endloop;
1927 case SNDRV_PCM_STATE_OPEN:
1928 case SNDRV_PCM_STATE_SETUP:
1929 case SNDRV_PCM_STATE_DISCONNECTED:
1930 err = -EBADFD;
1931 goto _endloop;
1932 case SNDRV_PCM_STATE_PAUSED:
1933 continue;
1934 }
1935 if (!tout) {
1936 pcm_dbg(substream->pcm,
1937 "%s write error (DMA or IRQ trouble?)\n",
1938 is_playback ? "playback" : "capture");
1939 err = -EIO;
1940 break;
1941 }
1942 }
1943 _endloop:
1944 set_current_state(TASK_RUNNING);
1945 remove_wait_queue(&runtime->tsleep, &wait);
1946 *availp = avail;
1947 return err;
1948 }
1949
1950 typedef int (*pcm_transfer_f)(struct snd_pcm_substream *substream,
1951 int channel, unsigned long hwoff,
1952 void *buf, unsigned long bytes);
1953
1954 typedef int (*pcm_copy_f)(struct snd_pcm_substream *, snd_pcm_uframes_t, void *,
1955 snd_pcm_uframes_t, snd_pcm_uframes_t, pcm_transfer_f);
1956
1957
1958 static void *get_dma_ptr(struct snd_pcm_runtime *runtime,
1959 int channel, unsigned long hwoff)
1960 {
1961 return runtime->dma_area + hwoff +
1962 channel * (runtime->dma_bytes / runtime->channels);
1963 }
1964
1965
1966 static int default_write_copy(struct snd_pcm_substream *substream,
1967 int channel, unsigned long hwoff,
1968 void *buf, unsigned long bytes)
1969 {
1970 if (copy_from_user(get_dma_ptr(substream->runtime, channel, hwoff),
1971 (void __user *)buf, bytes))
1972 return -EFAULT;
1973 return 0;
1974 }
1975
1976
1977 static int default_write_copy_kernel(struct snd_pcm_substream *substream,
1978 int channel, unsigned long hwoff,
1979 void *buf, unsigned long bytes)
1980 {
1981 memcpy(get_dma_ptr(substream->runtime, channel, hwoff), buf, bytes);
1982 return 0;
1983 }
1984
1985
1986
1987
1988
1989 static int fill_silence(struct snd_pcm_substream *substream, int channel,
1990 unsigned long hwoff, void *buf, unsigned long bytes)
1991 {
1992 struct snd_pcm_runtime *runtime = substream->runtime;
1993
1994 if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
1995 return 0;
1996 if (substream->ops->fill_silence)
1997 return substream->ops->fill_silence(substream, channel,
1998 hwoff, bytes);
1999
2000 snd_pcm_format_set_silence(runtime->format,
2001 get_dma_ptr(runtime, channel, hwoff),
2002 bytes_to_samples(runtime, bytes));
2003 return 0;
2004 }
2005
2006
2007 static int default_read_copy(struct snd_pcm_substream *substream,
2008 int channel, unsigned long hwoff,
2009 void *buf, unsigned long bytes)
2010 {
2011 if (copy_to_user((void __user *)buf,
2012 get_dma_ptr(substream->runtime, channel, hwoff),
2013 bytes))
2014 return -EFAULT;
2015 return 0;
2016 }
2017
2018
2019 static int default_read_copy_kernel(struct snd_pcm_substream *substream,
2020 int channel, unsigned long hwoff,
2021 void *buf, unsigned long bytes)
2022 {
2023 memcpy(buf, get_dma_ptr(substream->runtime, channel, hwoff), bytes);
2024 return 0;
2025 }
2026
2027
2028
2029
2030 static int interleaved_copy(struct snd_pcm_substream *substream,
2031 snd_pcm_uframes_t hwoff, void *data,
2032 snd_pcm_uframes_t off,
2033 snd_pcm_uframes_t frames,
2034 pcm_transfer_f transfer)
2035 {
2036 struct snd_pcm_runtime *runtime = substream->runtime;
2037
2038
2039 hwoff = frames_to_bytes(runtime, hwoff);
2040 off = frames_to_bytes(runtime, off);
2041 frames = frames_to_bytes(runtime, frames);
2042 return transfer(substream, 0, hwoff, data + off, frames);
2043 }
2044
2045
2046
2047
2048 static int noninterleaved_copy(struct snd_pcm_substream *substream,
2049 snd_pcm_uframes_t hwoff, void *data,
2050 snd_pcm_uframes_t off,
2051 snd_pcm_uframes_t frames,
2052 pcm_transfer_f transfer)
2053 {
2054 struct snd_pcm_runtime *runtime = substream->runtime;
2055 int channels = runtime->channels;
2056 void **bufs = data;
2057 int c, err;
2058
2059
2060
2061
2062
2063 off = samples_to_bytes(runtime, off);
2064 frames = samples_to_bytes(runtime, frames);
2065 hwoff = samples_to_bytes(runtime, hwoff);
2066 for (c = 0; c < channels; ++c, ++bufs) {
2067 if (!data || !*bufs)
2068 err = fill_silence(substream, c, hwoff, NULL, frames);
2069 else
2070 err = transfer(substream, c, hwoff, *bufs + off,
2071 frames);
2072 if (err < 0)
2073 return err;
2074 }
2075 return 0;
2076 }
2077
2078
2079
2080
2081 static int fill_silence_frames(struct snd_pcm_substream *substream,
2082 snd_pcm_uframes_t off, snd_pcm_uframes_t frames)
2083 {
2084 if (substream->runtime->access == SNDRV_PCM_ACCESS_RW_INTERLEAVED ||
2085 substream->runtime->access == SNDRV_PCM_ACCESS_MMAP_INTERLEAVED)
2086 return interleaved_copy(substream, off, NULL, 0, frames,
2087 fill_silence);
2088 else
2089 return noninterleaved_copy(substream, off, NULL, 0, frames,
2090 fill_silence);
2091 }
2092
2093
2094 static int pcm_sanity_check(struct snd_pcm_substream *substream)
2095 {
2096 struct snd_pcm_runtime *runtime;
2097 if (PCM_RUNTIME_CHECK(substream))
2098 return -ENXIO;
2099 runtime = substream->runtime;
2100 if (snd_BUG_ON(!substream->ops->copy_user && !runtime->dma_area))
2101 return -EINVAL;
2102 if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
2103 return -EBADFD;
2104 return 0;
2105 }
2106
2107 static int pcm_accessible_state(struct snd_pcm_runtime *runtime)
2108 {
2109 switch (runtime->status->state) {
2110 case SNDRV_PCM_STATE_PREPARED:
2111 case SNDRV_PCM_STATE_RUNNING:
2112 case SNDRV_PCM_STATE_PAUSED:
2113 return 0;
2114 case SNDRV_PCM_STATE_XRUN:
2115 return -EPIPE;
2116 case SNDRV_PCM_STATE_SUSPENDED:
2117 return -ESTRPIPE;
2118 default:
2119 return -EBADFD;
2120 }
2121 }
2122
2123
2124
2125
2126 int pcm_lib_apply_appl_ptr(struct snd_pcm_substream *substream,
2127 snd_pcm_uframes_t appl_ptr)
2128 {
2129 struct snd_pcm_runtime *runtime = substream->runtime;
2130 snd_pcm_uframes_t old_appl_ptr = runtime->control->appl_ptr;
2131 snd_pcm_sframes_t diff;
2132 int ret;
2133
2134 if (old_appl_ptr == appl_ptr)
2135 return 0;
2136
2137 if (appl_ptr >= runtime->boundary)
2138 return -EINVAL;
2139
2140
2141
2142 if (substream->runtime->info & SNDRV_PCM_INFO_NO_REWINDS) {
2143 diff = appl_ptr - old_appl_ptr;
2144 if (diff >= 0) {
2145 if (diff > runtime->buffer_size)
2146 return -EINVAL;
2147 } else {
2148 if (runtime->boundary + diff > runtime->buffer_size)
2149 return -EINVAL;
2150 }
2151 }
2152
2153 runtime->control->appl_ptr = appl_ptr;
2154 if (substream->ops->ack) {
2155 ret = substream->ops->ack(substream);
2156 if (ret < 0) {
2157 runtime->control->appl_ptr = old_appl_ptr;
2158 return ret;
2159 }
2160 }
2161
2162 trace_applptr(substream, old_appl_ptr, appl_ptr);
2163
2164 return 0;
2165 }
2166
2167
2168 snd_pcm_sframes_t __snd_pcm_lib_xfer(struct snd_pcm_substream *substream,
2169 void *data, bool interleaved,
2170 snd_pcm_uframes_t size, bool in_kernel)
2171 {
2172 struct snd_pcm_runtime *runtime = substream->runtime;
2173 snd_pcm_uframes_t xfer = 0;
2174 snd_pcm_uframes_t offset = 0;
2175 snd_pcm_uframes_t avail;
2176 pcm_copy_f writer;
2177 pcm_transfer_f transfer;
2178 bool nonblock;
2179 bool is_playback;
2180 int err;
2181
2182 err = pcm_sanity_check(substream);
2183 if (err < 0)
2184 return err;
2185
2186 is_playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
2187 if (interleaved) {
2188 if (runtime->access != SNDRV_PCM_ACCESS_RW_INTERLEAVED &&
2189 runtime->channels > 1)
2190 return -EINVAL;
2191 writer = interleaved_copy;
2192 } else {
2193 if (runtime->access != SNDRV_PCM_ACCESS_RW_NONINTERLEAVED)
2194 return -EINVAL;
2195 writer = noninterleaved_copy;
2196 }
2197
2198 if (!data) {
2199 if (is_playback)
2200 transfer = fill_silence;
2201 else
2202 return -EINVAL;
2203 } else if (in_kernel) {
2204 if (substream->ops->copy_kernel)
2205 transfer = substream->ops->copy_kernel;
2206 else
2207 transfer = is_playback ?
2208 default_write_copy_kernel : default_read_copy_kernel;
2209 } else {
2210 if (substream->ops->copy_user)
2211 transfer = (pcm_transfer_f)substream->ops->copy_user;
2212 else
2213 transfer = is_playback ?
2214 default_write_copy : default_read_copy;
2215 }
2216
2217 if (size == 0)
2218 return 0;
2219
2220 nonblock = !!(substream->f_flags & O_NONBLOCK);
2221
2222 snd_pcm_stream_lock_irq(substream);
2223 err = pcm_accessible_state(runtime);
2224 if (err < 0)
2225 goto _end_unlock;
2226
2227 runtime->twake = runtime->control->avail_min ? : 1;
2228 if (runtime->status->state == SNDRV_PCM_STATE_RUNNING)
2229 snd_pcm_update_hw_ptr(substream);
2230
2231
2232
2233
2234
2235 if (!is_playback &&
2236 runtime->status->state == SNDRV_PCM_STATE_PREPARED &&
2237 size >= runtime->start_threshold) {
2238 err = snd_pcm_start(substream);
2239 if (err < 0)
2240 goto _end_unlock;
2241 }
2242
2243 avail = snd_pcm_avail(substream);
2244
2245 while (size > 0) {
2246 snd_pcm_uframes_t frames, appl_ptr, appl_ofs;
2247 snd_pcm_uframes_t cont;
2248 if (!avail) {
2249 if (!is_playback &&
2250 runtime->status->state == SNDRV_PCM_STATE_DRAINING) {
2251 snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP);
2252 goto _end_unlock;
2253 }
2254 if (nonblock) {
2255 err = -EAGAIN;
2256 goto _end_unlock;
2257 }
2258 runtime->twake = min_t(snd_pcm_uframes_t, size,
2259 runtime->control->avail_min ? : 1);
2260 err = wait_for_avail(substream, &avail);
2261 if (err < 0)
2262 goto _end_unlock;
2263 if (!avail)
2264 continue;
2265 }
2266 frames = size > avail ? avail : size;
2267 appl_ptr = READ_ONCE(runtime->control->appl_ptr);
2268 appl_ofs = appl_ptr % runtime->buffer_size;
2269 cont = runtime->buffer_size - appl_ofs;
2270 if (frames > cont)
2271 frames = cont;
2272 if (snd_BUG_ON(!frames)) {
2273 err = -EINVAL;
2274 goto _end_unlock;
2275 }
2276 if (!atomic_inc_unless_negative(&runtime->buffer_accessing)) {
2277 err = -EBUSY;
2278 goto _end_unlock;
2279 }
2280 snd_pcm_stream_unlock_irq(substream);
2281 if (!is_playback)
2282 snd_pcm_dma_buffer_sync(substream, SNDRV_DMA_SYNC_CPU);
2283 err = writer(substream, appl_ofs, data, offset, frames,
2284 transfer);
2285 if (is_playback)
2286 snd_pcm_dma_buffer_sync(substream, SNDRV_DMA_SYNC_DEVICE);
2287 snd_pcm_stream_lock_irq(substream);
2288 atomic_dec(&runtime->buffer_accessing);
2289 if (err < 0)
2290 goto _end_unlock;
2291 err = pcm_accessible_state(runtime);
2292 if (err < 0)
2293 goto _end_unlock;
2294 appl_ptr += frames;
2295 if (appl_ptr >= runtime->boundary)
2296 appl_ptr -= runtime->boundary;
2297 err = pcm_lib_apply_appl_ptr(substream, appl_ptr);
2298 if (err < 0)
2299 goto _end_unlock;
2300
2301 offset += frames;
2302 size -= frames;
2303 xfer += frames;
2304 avail -= frames;
2305 if (is_playback &&
2306 runtime->status->state == SNDRV_PCM_STATE_PREPARED &&
2307 snd_pcm_playback_hw_avail(runtime) >= (snd_pcm_sframes_t)runtime->start_threshold) {
2308 err = snd_pcm_start(substream);
2309 if (err < 0)
2310 goto _end_unlock;
2311 }
2312 }
2313 _end_unlock:
2314 runtime->twake = 0;
2315 if (xfer > 0 && err >= 0)
2316 snd_pcm_update_state(substream, runtime);
2317 snd_pcm_stream_unlock_irq(substream);
2318 return xfer > 0 ? (snd_pcm_sframes_t)xfer : err;
2319 }
2320 EXPORT_SYMBOL(__snd_pcm_lib_xfer);
2321
2322
2323
2324
2325
2326
2327 const struct snd_pcm_chmap_elem snd_pcm_std_chmaps[] = {
2328 { .channels = 1,
2329 .map = { SNDRV_CHMAP_MONO } },
2330 { .channels = 2,
2331 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
2332 { .channels = 4,
2333 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2334 SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
2335 { .channels = 6,
2336 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2337 SNDRV_CHMAP_RL, SNDRV_CHMAP_RR,
2338 SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE } },
2339 { .channels = 8,
2340 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2341 SNDRV_CHMAP_RL, SNDRV_CHMAP_RR,
2342 SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE,
2343 SNDRV_CHMAP_SL, SNDRV_CHMAP_SR } },
2344 { }
2345 };
2346 EXPORT_SYMBOL_GPL(snd_pcm_std_chmaps);
2347
2348
2349 const struct snd_pcm_chmap_elem snd_pcm_alt_chmaps[] = {
2350 { .channels = 1,
2351 .map = { SNDRV_CHMAP_MONO } },
2352 { .channels = 2,
2353 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
2354 { .channels = 4,
2355 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2356 SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
2357 { .channels = 6,
2358 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2359 SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE,
2360 SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
2361 { .channels = 8,
2362 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2363 SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE,
2364 SNDRV_CHMAP_RL, SNDRV_CHMAP_RR,
2365 SNDRV_CHMAP_SL, SNDRV_CHMAP_SR } },
2366 { }
2367 };
2368 EXPORT_SYMBOL_GPL(snd_pcm_alt_chmaps);
2369
2370 static bool valid_chmap_channels(const struct snd_pcm_chmap *info, int ch)
2371 {
2372 if (ch > info->max_channels)
2373 return false;
2374 return !info->channel_mask || (info->channel_mask & (1U << ch));
2375 }
2376
2377 static int pcm_chmap_ctl_info(struct snd_kcontrol *kcontrol,
2378 struct snd_ctl_elem_info *uinfo)
2379 {
2380 struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
2381
2382 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2383 uinfo->count = info->max_channels;
2384 uinfo->value.integer.min = 0;
2385 uinfo->value.integer.max = SNDRV_CHMAP_LAST;
2386 return 0;
2387 }
2388
2389
2390
2391
2392 static int pcm_chmap_ctl_get(struct snd_kcontrol *kcontrol,
2393 struct snd_ctl_elem_value *ucontrol)
2394 {
2395 struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
2396 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2397 struct snd_pcm_substream *substream;
2398 const struct snd_pcm_chmap_elem *map;
2399
2400 if (!info->chmap)
2401 return -EINVAL;
2402 substream = snd_pcm_chmap_substream(info, idx);
2403 if (!substream)
2404 return -ENODEV;
2405 memset(ucontrol->value.integer.value, 0,
2406 sizeof(long) * info->max_channels);
2407 if (!substream->runtime)
2408 return 0;
2409 for (map = info->chmap; map->channels; map++) {
2410 int i;
2411 if (map->channels == substream->runtime->channels &&
2412 valid_chmap_channels(info, map->channels)) {
2413 for (i = 0; i < map->channels; i++)
2414 ucontrol->value.integer.value[i] = map->map[i];
2415 return 0;
2416 }
2417 }
2418 return -EINVAL;
2419 }
2420
2421
2422
2423
2424 static int pcm_chmap_ctl_tlv(struct snd_kcontrol *kcontrol, int op_flag,
2425 unsigned int size, unsigned int __user *tlv)
2426 {
2427 struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
2428 const struct snd_pcm_chmap_elem *map;
2429 unsigned int __user *dst;
2430 int c, count = 0;
2431
2432 if (!info->chmap)
2433 return -EINVAL;
2434 if (size < 8)
2435 return -ENOMEM;
2436 if (put_user(SNDRV_CTL_TLVT_CONTAINER, tlv))
2437 return -EFAULT;
2438 size -= 8;
2439 dst = tlv + 2;
2440 for (map = info->chmap; map->channels; map++) {
2441 int chs_bytes = map->channels * 4;
2442 if (!valid_chmap_channels(info, map->channels))
2443 continue;
2444 if (size < 8)
2445 return -ENOMEM;
2446 if (put_user(SNDRV_CTL_TLVT_CHMAP_FIXED, dst) ||
2447 put_user(chs_bytes, dst + 1))
2448 return -EFAULT;
2449 dst += 2;
2450 size -= 8;
2451 count += 8;
2452 if (size < chs_bytes)
2453 return -ENOMEM;
2454 size -= chs_bytes;
2455 count += chs_bytes;
2456 for (c = 0; c < map->channels; c++) {
2457 if (put_user(map->map[c], dst))
2458 return -EFAULT;
2459 dst++;
2460 }
2461 }
2462 if (put_user(count, tlv + 1))
2463 return -EFAULT;
2464 return 0;
2465 }
2466
2467 static void pcm_chmap_ctl_private_free(struct snd_kcontrol *kcontrol)
2468 {
2469 struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
2470 info->pcm->streams[info->stream].chmap_kctl = NULL;
2471 kfree(info);
2472 }
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486 int snd_pcm_add_chmap_ctls(struct snd_pcm *pcm, int stream,
2487 const struct snd_pcm_chmap_elem *chmap,
2488 int max_channels,
2489 unsigned long private_value,
2490 struct snd_pcm_chmap **info_ret)
2491 {
2492 struct snd_pcm_chmap *info;
2493 struct snd_kcontrol_new knew = {
2494 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
2495 .access = SNDRV_CTL_ELEM_ACCESS_READ |
2496 SNDRV_CTL_ELEM_ACCESS_TLV_READ |
2497 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK,
2498 .info = pcm_chmap_ctl_info,
2499 .get = pcm_chmap_ctl_get,
2500 .tlv.c = pcm_chmap_ctl_tlv,
2501 };
2502 int err;
2503
2504 if (WARN_ON(pcm->streams[stream].chmap_kctl))
2505 return -EBUSY;
2506 info = kzalloc(sizeof(*info), GFP_KERNEL);
2507 if (!info)
2508 return -ENOMEM;
2509 info->pcm = pcm;
2510 info->stream = stream;
2511 info->chmap = chmap;
2512 info->max_channels = max_channels;
2513 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
2514 knew.name = "Playback Channel Map";
2515 else
2516 knew.name = "Capture Channel Map";
2517 knew.device = pcm->device;
2518 knew.count = pcm->streams[stream].substream_count;
2519 knew.private_value = private_value;
2520 info->kctl = snd_ctl_new1(&knew, info);
2521 if (!info->kctl) {
2522 kfree(info);
2523 return -ENOMEM;
2524 }
2525 info->kctl->private_free = pcm_chmap_ctl_private_free;
2526 err = snd_ctl_add(pcm->card, info->kctl);
2527 if (err < 0)
2528 return err;
2529 pcm->streams[stream].chmap_kctl = info->kctl;
2530 if (info_ret)
2531 *info_ret = info;
2532 return 0;
2533 }
2534 EXPORT_SYMBOL_GPL(snd_pcm_add_chmap_ctls);