1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Digital Audio (PCM) abstract layer 4 * Copyright (c) by Jaroslav Kysela <perex@perex.cz> 5 * Abramo Bagnara <abramo@alsa-project.org> 6 */ 7 8 #include <linux/slab.h> 9 #include <linux/sched/signal.h> 10 #include <linux/time.h> 11 #include <linux/math64.h> 12 #include <linux/export.h> 13 #include <sound/core.h> 14 #include <sound/control.h> 15 #include <sound/tlv.h> 16 #include <sound/info.h> 17 #include <sound/pcm.h> 18 #include <sound/pcm_params.h> 19 #include <sound/timer.h> 20 21 #include "pcm_local.h" 22 23 #ifdef CONFIG_SND_PCM_XRUN_DEBUG 24 #define CREATE_TRACE_POINTS 25 #include "pcm_trace.h" 26 #else 27 #define trace_hwptr(substream, pos, in_interrupt) 28 #define trace_xrun(substream) 29 #define trace_hw_ptr_error(substream, reason) 30 #define trace_applptr(substream, prev, curr) 31 #endif 32 33 static int fill_silence_frames(struct snd_pcm_substream *substream, 34 snd_pcm_uframes_t off, snd_pcm_uframes_t frames); 35 36 37 static inline void update_silence_vars(struct snd_pcm_runtime *runtime, 38 snd_pcm_uframes_t ptr, 39 snd_pcm_uframes_t new_ptr) 40 { 41 snd_pcm_sframes_t delta; 42 43 delta = new_ptr - ptr; 44 if (delta == 0) 45 return; 46 if (delta < 0) 47 delta += runtime->boundary; 48 if ((snd_pcm_uframes_t)delta < runtime->silence_filled) 49 runtime->silence_filled -= delta; 50 else 51 runtime->silence_filled = 0; 52 runtime->silence_start = new_ptr; 53 } 54 55 /* 56 * fill ring buffer with silence 57 * runtime->silence_start: starting pointer to silence area 58 * runtime->silence_filled: size filled with silence 59 * runtime->silence_threshold: threshold from application 60 * runtime->silence_size: maximal size from application 61 * 62 * when runtime->silence_size >= runtime->boundary - fill processed area with silence immediately 63 */ 64 void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_uframes_t new_hw_ptr) 65 { 66 struct snd_pcm_runtime *runtime = substream->runtime; 67 snd_pcm_uframes_t frames, ofs, transfer; 68 int err; 69 70 if (runtime->silence_size < runtime->boundary) { 71 snd_pcm_sframes_t noise_dist; 72 snd_pcm_uframes_t appl_ptr = READ_ONCE(runtime->control->appl_ptr); 73 update_silence_vars(runtime, runtime->silence_start, appl_ptr); 74 /* initialization outside pointer updates */ 75 if (new_hw_ptr == ULONG_MAX) 76 new_hw_ptr = runtime->status->hw_ptr; 77 /* get hw_avail with the boundary crossing */ 78 noise_dist = appl_ptr - new_hw_ptr; 79 if (noise_dist < 0) 80 noise_dist += runtime->boundary; 81 /* total noise distance */ 82 noise_dist += runtime->silence_filled; 83 if (noise_dist >= (snd_pcm_sframes_t) runtime->silence_threshold) 84 return; 85 frames = runtime->silence_threshold - noise_dist; 86 if (frames > runtime->silence_size) 87 frames = runtime->silence_size; 88 } else { 89 /* 90 * This filling mode aims at free-running mode (used for example by dmix), 91 * which doesn't update the application pointer. 92 */ 93 snd_pcm_uframes_t hw_ptr = runtime->status->hw_ptr; 94 if (new_hw_ptr == ULONG_MAX) { 95 /* 96 * Initialization, fill the whole unused buffer with silence. 97 * 98 * Usually, this is entered while stopped, before data is queued, 99 * so both pointers are expected to be zero. 100 */ 101 snd_pcm_sframes_t avail = runtime->control->appl_ptr - hw_ptr; 102 if (avail < 0) 103 avail += runtime->boundary; 104 /* 105 * In free-running mode, appl_ptr will be zero even while running, 106 * so we end up with a huge number. There is no useful way to 107 * handle this, so we just clear the whole buffer. 108 */ 109 runtime->silence_filled = avail > runtime->buffer_size ? 0 : avail; 110 runtime->silence_start = hw_ptr; 111 } else { 112 /* Silence the just played area immediately */ 113 update_silence_vars(runtime, hw_ptr, new_hw_ptr); 114 } 115 /* 116 * In this mode, silence_filled actually includes the valid 117 * sample data from the user. 118 */ 119 frames = runtime->buffer_size - runtime->silence_filled; 120 } 121 if (snd_BUG_ON(frames > runtime->buffer_size)) 122 return; 123 if (frames == 0) 124 return; 125 ofs = (runtime->silence_start + runtime->silence_filled) % runtime->buffer_size; 126 do { 127 transfer = ofs + frames > runtime->buffer_size ? runtime->buffer_size - ofs : frames; 128 err = fill_silence_frames(substream, ofs, transfer); 129 snd_BUG_ON(err < 0); 130 runtime->silence_filled += transfer; 131 frames -= transfer; 132 ofs = 0; 133 } while (frames > 0); 134 snd_pcm_dma_buffer_sync(substream, SNDRV_DMA_SYNC_DEVICE); 135 } 136 137 #ifdef CONFIG_SND_DEBUG 138 void snd_pcm_debug_name(struct snd_pcm_substream *substream, 139 char *name, size_t len) 140 { 141 snprintf(name, len, "pcmC%dD%d%c:%d", 142 substream->pcm->card->number, 143 substream->pcm->device, 144 substream->stream ? 'c' : 'p', 145 substream->number); 146 } 147 EXPORT_SYMBOL(snd_pcm_debug_name); 148 #endif 149 150 #define XRUN_DEBUG_BASIC (1<<0) 151 #define XRUN_DEBUG_STACK (1<<1) /* dump also stack */ 152 #define XRUN_DEBUG_JIFFIESCHECK (1<<2) /* do jiffies check */ 153 154 #ifdef CONFIG_SND_PCM_XRUN_DEBUG 155 156 #define xrun_debug(substream, mask) \ 157 ((substream)->pstr->xrun_debug & (mask)) 158 #else 159 #define xrun_debug(substream, mask) 0 160 #endif 161 162 #define dump_stack_on_xrun(substream) do { \ 163 if (xrun_debug(substream, XRUN_DEBUG_STACK)) \ 164 dump_stack(); \ 165 } while (0) 166 167 /* call with stream lock held */ 168 void __snd_pcm_xrun(struct snd_pcm_substream *substream) 169 { 170 struct snd_pcm_runtime *runtime = substream->runtime; 171 172 trace_xrun(substream); 173 if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) { 174 struct timespec64 tstamp; 175 176 snd_pcm_gettime(runtime, &tstamp); 177 runtime->status->tstamp.tv_sec = tstamp.tv_sec; 178 runtime->status->tstamp.tv_nsec = tstamp.tv_nsec; 179 } 180 snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN); 181 if (xrun_debug(substream, XRUN_DEBUG_BASIC)) { 182 char name[16]; 183 snd_pcm_debug_name(substream, name, sizeof(name)); 184 pcm_warn(substream->pcm, "XRUN: %s\n", name); 185 dump_stack_on_xrun(substream); 186 } 187 #ifdef CONFIG_SND_PCM_XRUN_DEBUG 188 substream->xrun_counter++; 189 #endif 190 } 191 192 #ifdef CONFIG_SND_PCM_XRUN_DEBUG 193 #define hw_ptr_error(substream, in_interrupt, reason, fmt, args...) \ 194 do { \ 195 trace_hw_ptr_error(substream, reason); \ 196 if (xrun_debug(substream, XRUN_DEBUG_BASIC)) { \ 197 pr_err_ratelimited("ALSA: PCM: [%c] " reason ": " fmt, \ 198 (in_interrupt) ? 'Q' : 'P', ##args); \ 199 dump_stack_on_xrun(substream); \ 200 } \ 201 } while (0) 202 203 #else /* ! CONFIG_SND_PCM_XRUN_DEBUG */ 204 205 #define hw_ptr_error(substream, fmt, args...) do { } while (0) 206 207 #endif 208 209 int snd_pcm_update_state(struct snd_pcm_substream *substream, 210 struct snd_pcm_runtime *runtime) 211 { 212 snd_pcm_uframes_t avail; 213 214 avail = snd_pcm_avail(substream); 215 if (avail > runtime->avail_max) 216 runtime->avail_max = avail; 217 if (runtime->state == SNDRV_PCM_STATE_DRAINING) { 218 if (avail >= runtime->buffer_size) { 219 snd_pcm_drain_done(substream); 220 return -EPIPE; 221 } 222 } else { 223 if (avail >= runtime->stop_threshold) { 224 __snd_pcm_xrun(substream); 225 return -EPIPE; 226 } 227 } 228 if (runtime->twake) { 229 if (avail >= runtime->twake) 230 wake_up(&runtime->tsleep); 231 } else if (avail >= runtime->control->avail_min) 232 wake_up(&runtime->sleep); 233 return 0; 234 } 235 236 static void update_audio_tstamp(struct snd_pcm_substream *substream, 237 struct timespec64 *curr_tstamp, 238 struct timespec64 *audio_tstamp) 239 { 240 struct snd_pcm_runtime *runtime = substream->runtime; 241 u64 audio_frames, audio_nsecs; 242 struct timespec64 driver_tstamp; 243 244 if (runtime->tstamp_mode != SNDRV_PCM_TSTAMP_ENABLE) 245 return; 246 247 if (!(substream->ops->get_time_info) || 248 (runtime->audio_tstamp_report.actual_type == 249 SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT)) { 250 251 /* 252 * provide audio timestamp derived from pointer position 253 * add delay only if requested 254 */ 255 256 audio_frames = runtime->hw_ptr_wrap + runtime->status->hw_ptr; 257 258 if (runtime->audio_tstamp_config.report_delay) { 259 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 260 audio_frames -= runtime->delay; 261 else 262 audio_frames += runtime->delay; 263 } 264 audio_nsecs = div_u64(audio_frames * 1000000000LL, 265 runtime->rate); 266 *audio_tstamp = ns_to_timespec64(audio_nsecs); 267 } 268 269 if (runtime->status->audio_tstamp.tv_sec != audio_tstamp->tv_sec || 270 runtime->status->audio_tstamp.tv_nsec != audio_tstamp->tv_nsec) { 271 runtime->status->audio_tstamp.tv_sec = audio_tstamp->tv_sec; 272 runtime->status->audio_tstamp.tv_nsec = audio_tstamp->tv_nsec; 273 runtime->status->tstamp.tv_sec = curr_tstamp->tv_sec; 274 runtime->status->tstamp.tv_nsec = curr_tstamp->tv_nsec; 275 } 276 277 278 /* 279 * re-take a driver timestamp to let apps detect if the reference tstamp 280 * read by low-level hardware was provided with a delay 281 */ 282 snd_pcm_gettime(substream->runtime, &driver_tstamp); 283 runtime->driver_tstamp = driver_tstamp; 284 } 285 286 static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream, 287 unsigned int in_interrupt) 288 { 289 struct snd_pcm_runtime *runtime = substream->runtime; 290 snd_pcm_uframes_t pos; 291 snd_pcm_uframes_t old_hw_ptr, new_hw_ptr, hw_base; 292 snd_pcm_sframes_t hdelta, delta; 293 unsigned long jdelta; 294 unsigned long curr_jiffies; 295 struct timespec64 curr_tstamp; 296 struct timespec64 audio_tstamp; 297 int crossed_boundary = 0; 298 299 old_hw_ptr = runtime->status->hw_ptr; 300 301 /* 302 * group pointer, time and jiffies reads to allow for more 303 * accurate correlations/corrections. 304 * The values are stored at the end of this routine after 305 * corrections for hw_ptr position 306 */ 307 pos = substream->ops->pointer(substream); 308 curr_jiffies = jiffies; 309 if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) { 310 if ((substream->ops->get_time_info) && 311 (runtime->audio_tstamp_config.type_requested != SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT)) { 312 substream->ops->get_time_info(substream, &curr_tstamp, 313 &audio_tstamp, 314 &runtime->audio_tstamp_config, 315 &runtime->audio_tstamp_report); 316 317 /* re-test in case tstamp type is not supported in hardware and was demoted to DEFAULT */ 318 if (runtime->audio_tstamp_report.actual_type == SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT) 319 snd_pcm_gettime(runtime, &curr_tstamp); 320 } else 321 snd_pcm_gettime(runtime, &curr_tstamp); 322 } 323 324 if (pos == SNDRV_PCM_POS_XRUN) { 325 __snd_pcm_xrun(substream); 326 return -EPIPE; 327 } 328 if (pos >= runtime->buffer_size) { 329 if (printk_ratelimit()) { 330 char name[16]; 331 snd_pcm_debug_name(substream, name, sizeof(name)); 332 pcm_err(substream->pcm, 333 "invalid position: %s, pos = %ld, buffer size = %ld, period size = %ld\n", 334 name, pos, runtime->buffer_size, 335 runtime->period_size); 336 } 337 pos = 0; 338 } 339 pos -= pos % runtime->min_align; 340 trace_hwptr(substream, pos, in_interrupt); 341 hw_base = runtime->hw_ptr_base; 342 new_hw_ptr = hw_base + pos; 343 if (in_interrupt) { 344 /* we know that one period was processed */ 345 /* delta = "expected next hw_ptr" for in_interrupt != 0 */ 346 delta = runtime->hw_ptr_interrupt + runtime->period_size; 347 if (delta > new_hw_ptr) { 348 /* check for double acknowledged interrupts */ 349 hdelta = curr_jiffies - runtime->hw_ptr_jiffies; 350 if (hdelta > runtime->hw_ptr_buffer_jiffies/2 + 1) { 351 hw_base += runtime->buffer_size; 352 if (hw_base >= runtime->boundary) { 353 hw_base = 0; 354 crossed_boundary++; 355 } 356 new_hw_ptr = hw_base + pos; 357 goto __delta; 358 } 359 } 360 } 361 /* new_hw_ptr might be lower than old_hw_ptr in case when */ 362 /* pointer crosses the end of the ring buffer */ 363 if (new_hw_ptr < old_hw_ptr) { 364 hw_base += runtime->buffer_size; 365 if (hw_base >= runtime->boundary) { 366 hw_base = 0; 367 crossed_boundary++; 368 } 369 new_hw_ptr = hw_base + pos; 370 } 371 __delta: 372 delta = new_hw_ptr - old_hw_ptr; 373 if (delta < 0) 374 delta += runtime->boundary; 375 376 if (runtime->no_period_wakeup) { 377 snd_pcm_sframes_t xrun_threshold; 378 /* 379 * Without regular period interrupts, we have to check 380 * the elapsed time to detect xruns. 381 */ 382 jdelta = curr_jiffies - runtime->hw_ptr_jiffies; 383 if (jdelta < runtime->hw_ptr_buffer_jiffies / 2) 384 goto no_delta_check; 385 hdelta = jdelta - delta * HZ / runtime->rate; 386 xrun_threshold = runtime->hw_ptr_buffer_jiffies / 2 + 1; 387 while (hdelta > xrun_threshold) { 388 delta += runtime->buffer_size; 389 hw_base += runtime->buffer_size; 390 if (hw_base >= runtime->boundary) { 391 hw_base = 0; 392 crossed_boundary++; 393 } 394 new_hw_ptr = hw_base + pos; 395 hdelta -= runtime->hw_ptr_buffer_jiffies; 396 } 397 goto no_delta_check; 398 } 399 400 /* something must be really wrong */ 401 if (delta >= runtime->buffer_size + runtime->period_size) { 402 hw_ptr_error(substream, in_interrupt, "Unexpected hw_ptr", 403 "(stream=%i, pos=%ld, new_hw_ptr=%ld, old_hw_ptr=%ld)\n", 404 substream->stream, (long)pos, 405 (long)new_hw_ptr, (long)old_hw_ptr); 406 return 0; 407 } 408 409 /* Do jiffies check only in xrun_debug mode */ 410 if (!xrun_debug(substream, XRUN_DEBUG_JIFFIESCHECK)) 411 goto no_jiffies_check; 412 413 /* Skip the jiffies check for hardwares with BATCH flag. 414 * Such hardware usually just increases the position at each IRQ, 415 * thus it can't give any strange position. 416 */ 417 if (runtime->hw.info & SNDRV_PCM_INFO_BATCH) 418 goto no_jiffies_check; 419 hdelta = delta; 420 if (hdelta < runtime->delay) 421 goto no_jiffies_check; 422 hdelta -= runtime->delay; 423 jdelta = curr_jiffies - runtime->hw_ptr_jiffies; 424 if (((hdelta * HZ) / runtime->rate) > jdelta + HZ/100) { 425 delta = jdelta / 426 (((runtime->period_size * HZ) / runtime->rate) 427 + HZ/100); 428 /* move new_hw_ptr according jiffies not pos variable */ 429 new_hw_ptr = old_hw_ptr; 430 hw_base = delta; 431 /* use loop to avoid checks for delta overflows */ 432 /* the delta value is small or zero in most cases */ 433 while (delta > 0) { 434 new_hw_ptr += runtime->period_size; 435 if (new_hw_ptr >= runtime->boundary) { 436 new_hw_ptr -= runtime->boundary; 437 crossed_boundary--; 438 } 439 delta--; 440 } 441 /* align hw_base to buffer_size */ 442 hw_ptr_error(substream, in_interrupt, "hw_ptr skipping", 443 "(pos=%ld, delta=%ld, period=%ld, jdelta=%lu/%lu/%lu, hw_ptr=%ld/%ld)\n", 444 (long)pos, (long)hdelta, 445 (long)runtime->period_size, jdelta, 446 ((hdelta * HZ) / runtime->rate), hw_base, 447 (unsigned long)old_hw_ptr, 448 (unsigned long)new_hw_ptr); 449 /* reset values to proper state */ 450 delta = 0; 451 hw_base = new_hw_ptr - (new_hw_ptr % runtime->buffer_size); 452 } 453 no_jiffies_check: 454 if (delta > runtime->period_size + runtime->period_size / 2) { 455 hw_ptr_error(substream, in_interrupt, 456 "Lost interrupts?", 457 "(stream=%i, delta=%ld, new_hw_ptr=%ld, old_hw_ptr=%ld)\n", 458 substream->stream, (long)delta, 459 (long)new_hw_ptr, 460 (long)old_hw_ptr); 461 } 462 463 no_delta_check: 464 if (runtime->status->hw_ptr == new_hw_ptr) { 465 runtime->hw_ptr_jiffies = curr_jiffies; 466 update_audio_tstamp(substream, &curr_tstamp, &audio_tstamp); 467 return 0; 468 } 469 470 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && 471 runtime->silence_size > 0) 472 snd_pcm_playback_silence(substream, new_hw_ptr); 473 474 if (in_interrupt) { 475 delta = new_hw_ptr - runtime->hw_ptr_interrupt; 476 if (delta < 0) 477 delta += runtime->boundary; 478 delta -= (snd_pcm_uframes_t)delta % runtime->period_size; 479 runtime->hw_ptr_interrupt += delta; 480 if (runtime->hw_ptr_interrupt >= runtime->boundary) 481 runtime->hw_ptr_interrupt -= runtime->boundary; 482 } 483 runtime->hw_ptr_base = hw_base; 484 runtime->status->hw_ptr = new_hw_ptr; 485 runtime->hw_ptr_jiffies = curr_jiffies; 486 if (crossed_boundary) { 487 snd_BUG_ON(crossed_boundary != 1); 488 runtime->hw_ptr_wrap += runtime->boundary; 489 } 490 491 update_audio_tstamp(substream, &curr_tstamp, &audio_tstamp); 492 493 return snd_pcm_update_state(substream, runtime); 494 } 495 496 /* CAUTION: call it with irq disabled */ 497 int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream) 498 { 499 return snd_pcm_update_hw_ptr0(substream, 0); 500 } 501 502 /** 503 * snd_pcm_set_ops - set the PCM operators 504 * @pcm: the pcm instance 505 * @direction: stream direction, SNDRV_PCM_STREAM_XXX 506 * @ops: the operator table 507 * 508 * Sets the given PCM operators to the pcm instance. 509 */ 510 void snd_pcm_set_ops(struct snd_pcm *pcm, int direction, 511 const struct snd_pcm_ops *ops) 512 { 513 struct snd_pcm_str *stream = &pcm->streams[direction]; 514 struct snd_pcm_substream *substream; 515 516 for (substream = stream->substream; substream != NULL; substream = substream->next) 517 substream->ops = ops; 518 } 519 EXPORT_SYMBOL(snd_pcm_set_ops); 520 521 /** 522 * snd_pcm_set_sync_per_card - set the PCM sync id with card number 523 * @substream: the pcm substream 524 * @params: modified hardware parameters 525 * @id: identifier (max 12 bytes) 526 * @len: identifier length (max 12 bytes) 527 * 528 * Sets the PCM sync identifier for the card with zero padding. 529 * 530 * User space or any user should use this 16-byte identifier for a comparison only 531 * to check if two IDs are similar or different. Special case is the identifier 532 * containing only zeros. Interpretation for this combination is - empty (not set). 533 * The contents of the identifier should not be interpreted in any other way. 534 * 535 * The synchronization ID must be unique per clock source (usually one sound card, 536 * but multiple soundcard may use one PCM word clock source which means that they 537 * are fully synchronized). 538 * 539 * This routine composes this ID using card number in first four bytes and 540 * 12-byte additional ID. When other ID composition is used (e.g. for multiple 541 * sound cards), make sure that the composition does not clash with this 542 * composition scheme. 543 */ 544 void snd_pcm_set_sync_per_card(struct snd_pcm_substream *substream, 545 struct snd_pcm_hw_params *params, 546 const unsigned char *id, unsigned int len) 547 { 548 *(__u32 *)params->sync = cpu_to_le32(substream->pcm->card->number); 549 len = min(12, len); 550 memcpy(params->sync + 4, id, len); 551 memset(params->sync + 4 + len, 0, 12 - len); 552 } 553 EXPORT_SYMBOL_GPL(snd_pcm_set_sync_per_card); 554 555 /* 556 * Standard ioctl routine 557 */ 558 559 static inline unsigned int div32(unsigned int a, unsigned int b, 560 unsigned int *r) 561 { 562 if (b == 0) { 563 *r = 0; 564 return UINT_MAX; 565 } 566 *r = a % b; 567 return a / b; 568 } 569 570 static inline unsigned int div_down(unsigned int a, unsigned int b) 571 { 572 if (b == 0) 573 return UINT_MAX; 574 return a / b; 575 } 576 577 static inline unsigned int div_up(unsigned int a, unsigned int b) 578 { 579 unsigned int r; 580 unsigned int q; 581 if (b == 0) 582 return UINT_MAX; 583 q = div32(a, b, &r); 584 if (r) 585 ++q; 586 return q; 587 } 588 589 static inline unsigned int mul(unsigned int a, unsigned int b) 590 { 591 if (a == 0) 592 return 0; 593 if (div_down(UINT_MAX, a) < b) 594 return UINT_MAX; 595 return a * b; 596 } 597 598 static inline unsigned int muldiv32(unsigned int a, unsigned int b, 599 unsigned int c, unsigned int *r) 600 { 601 u_int64_t n = (u_int64_t) a * b; 602 if (c == 0) { 603 *r = 0; 604 return UINT_MAX; 605 } 606 n = div_u64_rem(n, c, r); 607 if (n >= UINT_MAX) { 608 *r = 0; 609 return UINT_MAX; 610 } 611 return n; 612 } 613 614 /** 615 * snd_interval_refine - refine the interval value of configurator 616 * @i: the interval value to refine 617 * @v: the interval value to refer to 618 * 619 * Refines the interval value with the reference value. 620 * The interval is changed to the range satisfying both intervals. 621 * The interval status (min, max, integer, etc.) are evaluated. 622 * 623 * Return: Positive if the value is changed, zero if it's not changed, or a 624 * negative error code. 625 */ 626 int snd_interval_refine(struct snd_interval *i, const struct snd_interval *v) 627 { 628 int changed = 0; 629 if (snd_BUG_ON(snd_interval_empty(i))) 630 return -EINVAL; 631 if (i->min < v->min) { 632 i->min = v->min; 633 i->openmin = v->openmin; 634 changed = 1; 635 } else if (i->min == v->min && !i->openmin && v->openmin) { 636 i->openmin = 1; 637 changed = 1; 638 } 639 if (i->max > v->max) { 640 i->max = v->max; 641 i->openmax = v->openmax; 642 changed = 1; 643 } else if (i->max == v->max && !i->openmax && v->openmax) { 644 i->openmax = 1; 645 changed = 1; 646 } 647 if (!i->integer && v->integer) { 648 i->integer = 1; 649 changed = 1; 650 } 651 if (i->integer) { 652 if (i->openmin) { 653 i->min++; 654 i->openmin = 0; 655 } 656 if (i->openmax) { 657 i->max--; 658 i->openmax = 0; 659 } 660 } else if (!i->openmin && !i->openmax && i->min == i->max) 661 i->integer = 1; 662 if (snd_interval_checkempty(i)) { 663 snd_interval_none(i); 664 return -EINVAL; 665 } 666 return changed; 667 } 668 EXPORT_SYMBOL(snd_interval_refine); 669 670 static int snd_interval_refine_first(struct snd_interval *i) 671 { 672 const unsigned int last_max = i->max; 673 674 if (snd_BUG_ON(snd_interval_empty(i))) 675 return -EINVAL; 676 if (snd_interval_single(i)) 677 return 0; 678 i->max = i->min; 679 if (i->openmin) 680 i->max++; 681 /* only exclude max value if also excluded before refine */ 682 i->openmax = (i->openmax && i->max >= last_max); 683 return 1; 684 } 685 686 static int snd_interval_refine_last(struct snd_interval *i) 687 { 688 const unsigned int last_min = i->min; 689 690 if (snd_BUG_ON(snd_interval_empty(i))) 691 return -EINVAL; 692 if (snd_interval_single(i)) 693 return 0; 694 i->min = i->max; 695 if (i->openmax) 696 i->min--; 697 /* only exclude min value if also excluded before refine */ 698 i->openmin = (i->openmin && i->min <= last_min); 699 return 1; 700 } 701 702 void snd_interval_mul(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c) 703 { 704 if (a->empty || b->empty) { 705 snd_interval_none(c); 706 return; 707 } 708 c->empty = 0; 709 c->min = mul(a->min, b->min); 710 c->openmin = (a->openmin || b->openmin); 711 c->max = mul(a->max, b->max); 712 c->openmax = (a->openmax || b->openmax); 713 c->integer = (a->integer && b->integer); 714 } 715 716 /** 717 * snd_interval_div - refine the interval value with division 718 * @a: dividend 719 * @b: divisor 720 * @c: quotient 721 * 722 * c = a / b 723 * 724 * Returns non-zero if the value is changed, zero if not changed. 725 */ 726 void snd_interval_div(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c) 727 { 728 unsigned int r; 729 if (a->empty || b->empty) { 730 snd_interval_none(c); 731 return; 732 } 733 c->empty = 0; 734 c->min = div32(a->min, b->max, &r); 735 c->openmin = (r || a->openmin || b->openmax); 736 if (b->min > 0) { 737 c->max = div32(a->max, b->min, &r); 738 if (r) { 739 c->max++; 740 c->openmax = 1; 741 } else 742 c->openmax = (a->openmax || b->openmin); 743 } else { 744 c->max = UINT_MAX; 745 c->openmax = 0; 746 } 747 c->integer = 0; 748 } 749 750 /** 751 * snd_interval_muldivk - refine the interval value 752 * @a: dividend 1 753 * @b: dividend 2 754 * @k: divisor (as integer) 755 * @c: result 756 * 757 * c = a * b / k 758 * 759 * Returns non-zero if the value is changed, zero if not changed. 760 */ 761 void snd_interval_muldivk(const struct snd_interval *a, const struct snd_interval *b, 762 unsigned int k, struct snd_interval *c) 763 { 764 unsigned int r; 765 if (a->empty || b->empty) { 766 snd_interval_none(c); 767 return; 768 } 769 c->empty = 0; 770 c->min = muldiv32(a->min, b->min, k, &r); 771 c->openmin = (r || a->openmin || b->openmin); 772 c->max = muldiv32(a->max, b->max, k, &r); 773 if (r) { 774 c->max++; 775 c->openmax = 1; 776 } else 777 c->openmax = (a->openmax || b->openmax); 778 c->integer = 0; 779 } 780 781 /** 782 * snd_interval_mulkdiv - refine the interval value 783 * @a: dividend 1 784 * @k: dividend 2 (as integer) 785 * @b: divisor 786 * @c: result 787 * 788 * c = a * k / b 789 * 790 * Returns non-zero if the value is changed, zero if not changed. 791 */ 792 void snd_interval_mulkdiv(const struct snd_interval *a, unsigned int k, 793 const struct snd_interval *b, struct snd_interval *c) 794 { 795 unsigned int r; 796 if (a->empty || b->empty) { 797 snd_interval_none(c); 798 return; 799 } 800 c->empty = 0; 801 c->min = muldiv32(a->min, k, b->max, &r); 802 c->openmin = (r || a->openmin || b->openmax); 803 if (b->min > 0) { 804 c->max = muldiv32(a->max, k, b->min, &r); 805 if (r) { 806 c->max++; 807 c->openmax = 1; 808 } else 809 c->openmax = (a->openmax || b->openmin); 810 } else { 811 c->max = UINT_MAX; 812 c->openmax = 0; 813 } 814 c->integer = 0; 815 } 816 817 /* ---- */ 818 819 820 /** 821 * snd_interval_ratnum - refine the interval value 822 * @i: interval to refine 823 * @rats_count: number of ratnum_t 824 * @rats: ratnum_t array 825 * @nump: pointer to store the resultant numerator 826 * @denp: pointer to store the resultant denominator 827 * 828 * Return: Positive if the value is changed, zero if it's not changed, or a 829 * negative error code. 830 */ 831 int snd_interval_ratnum(struct snd_interval *i, 832 unsigned int rats_count, const struct snd_ratnum *rats, 833 unsigned int *nump, unsigned int *denp) 834 { 835 unsigned int best_num, best_den; 836 int best_diff; 837 unsigned int k; 838 struct snd_interval t; 839 int err; 840 unsigned int result_num, result_den; 841 int result_diff; 842 843 best_num = best_den = best_diff = 0; 844 for (k = 0; k < rats_count; ++k) { 845 unsigned int num = rats[k].num; 846 unsigned int den; 847 unsigned int q = i->min; 848 int diff; 849 if (q == 0) 850 q = 1; 851 den = div_up(num, q); 852 if (den < rats[k].den_min) 853 continue; 854 if (den > rats[k].den_max) 855 den = rats[k].den_max; 856 else { 857 unsigned int r; 858 r = (den - rats[k].den_min) % rats[k].den_step; 859 if (r != 0) 860 den -= r; 861 } 862 diff = num - q * den; 863 if (diff < 0) 864 diff = -diff; 865 if (best_num == 0 || 866 diff * best_den < best_diff * den) { 867 best_diff = diff; 868 best_den = den; 869 best_num = num; 870 } 871 } 872 if (best_den == 0) { 873 i->empty = 1; 874 return -EINVAL; 875 } 876 t.min = div_down(best_num, best_den); 877 t.openmin = !!(best_num % best_den); 878 879 result_num = best_num; 880 result_diff = best_diff; 881 result_den = best_den; 882 best_num = best_den = best_diff = 0; 883 for (k = 0; k < rats_count; ++k) { 884 unsigned int num = rats[k].num; 885 unsigned int den; 886 unsigned int q = i->max; 887 int diff; 888 if (q == 0) { 889 i->empty = 1; 890 return -EINVAL; 891 } 892 den = div_down(num, q); 893 if (den > rats[k].den_max) 894 continue; 895 if (den < rats[k].den_min) 896 den = rats[k].den_min; 897 else { 898 unsigned int r; 899 r = (den - rats[k].den_min) % rats[k].den_step; 900 if (r != 0) 901 den += rats[k].den_step - r; 902 } 903 diff = q * den - num; 904 if (diff < 0) 905 diff = -diff; 906 if (best_num == 0 || 907 diff * best_den < best_diff * den) { 908 best_diff = diff; 909 best_den = den; 910 best_num = num; 911 } 912 } 913 if (best_den == 0) { 914 i->empty = 1; 915 return -EINVAL; 916 } 917 t.max = div_up(best_num, best_den); 918 t.openmax = !!(best_num % best_den); 919 t.integer = 0; 920 err = snd_interval_refine(i, &t); 921 if (err < 0) 922 return err; 923 924 if (snd_interval_single(i)) { 925 if (best_diff * result_den < result_diff * best_den) { 926 result_num = best_num; 927 result_den = best_den; 928 } 929 if (nump) 930 *nump = result_num; 931 if (denp) 932 *denp = result_den; 933 } 934 return err; 935 } 936 EXPORT_SYMBOL(snd_interval_ratnum); 937 938 /** 939 * snd_interval_ratden - refine the interval value 940 * @i: interval to refine 941 * @rats_count: number of struct ratden 942 * @rats: struct ratden array 943 * @nump: pointer to store the resultant numerator 944 * @denp: pointer to store the resultant denominator 945 * 946 * Return: Positive if the value is changed, zero if it's not changed, or a 947 * negative error code. 948 */ 949 static int snd_interval_ratden(struct snd_interval *i, 950 unsigned int rats_count, 951 const struct snd_ratden *rats, 952 unsigned int *nump, unsigned int *denp) 953 { 954 unsigned int best_num, best_diff, best_den; 955 unsigned int k; 956 struct snd_interval t; 957 int err; 958 959 best_num = best_den = best_diff = 0; 960 for (k = 0; k < rats_count; ++k) { 961 unsigned int num; 962 unsigned int den = rats[k].den; 963 unsigned int q = i->min; 964 int diff; 965 num = mul(q, den); 966 if (num > rats[k].num_max) 967 continue; 968 if (num < rats[k].num_min) 969 num = rats[k].num_max; 970 else { 971 unsigned int r; 972 r = (num - rats[k].num_min) % rats[k].num_step; 973 if (r != 0) 974 num += rats[k].num_step - r; 975 } 976 diff = num - q * den; 977 if (best_num == 0 || 978 diff * best_den < best_diff * den) { 979 best_diff = diff; 980 best_den = den; 981 best_num = num; 982 } 983 } 984 if (best_den == 0) { 985 i->empty = 1; 986 return -EINVAL; 987 } 988 t.min = div_down(best_num, best_den); 989 t.openmin = !!(best_num % best_den); 990 991 best_num = best_den = best_diff = 0; 992 for (k = 0; k < rats_count; ++k) { 993 unsigned int num; 994 unsigned int den = rats[k].den; 995 unsigned int q = i->max; 996 int diff; 997 num = mul(q, den); 998 if (num < rats[k].num_min) 999 continue; 1000 if (num > rats[k].num_max) 1001 num = rats[k].num_max; 1002 else { 1003 unsigned int r; 1004 r = (num - rats[k].num_min) % rats[k].num_step; 1005 if (r != 0) 1006 num -= r; 1007 } 1008 diff = q * den - num; 1009 if (best_num == 0 || 1010 diff * best_den < best_diff * den) { 1011 best_diff = diff; 1012 best_den = den; 1013 best_num = num; 1014 } 1015 } 1016 if (best_den == 0) { 1017 i->empty = 1; 1018 return -EINVAL; 1019 } 1020 t.max = div_up(best_num, best_den); 1021 t.openmax = !!(best_num % best_den); 1022 t.integer = 0; 1023 err = snd_interval_refine(i, &t); 1024 if (err < 0) 1025 return err; 1026 1027 if (snd_interval_single(i)) { 1028 if (nump) 1029 *nump = best_num; 1030 if (denp) 1031 *denp = best_den; 1032 } 1033 return err; 1034 } 1035 1036 /** 1037 * snd_interval_list - refine the interval value from the list 1038 * @i: the interval value to refine 1039 * @count: the number of elements in the list 1040 * @list: the value list 1041 * @mask: the bit-mask to evaluate 1042 * 1043 * Refines the interval value from the list. 1044 * When mask is non-zero, only the elements corresponding to bit 1 are 1045 * evaluated. 1046 * 1047 * Return: Positive if the value is changed, zero if it's not changed, or a 1048 * negative error code. 1049 */ 1050 int snd_interval_list(struct snd_interval *i, unsigned int count, 1051 const unsigned int *list, unsigned int mask) 1052 { 1053 unsigned int k; 1054 struct snd_interval list_range; 1055 1056 if (!count) { 1057 i->empty = 1; 1058 return -EINVAL; 1059 } 1060 snd_interval_any(&list_range); 1061 list_range.min = UINT_MAX; 1062 list_range.max = 0; 1063 for (k = 0; k < count; k++) { 1064 if (mask && !(mask & (1 << k))) 1065 continue; 1066 if (!snd_interval_test(i, list[k])) 1067 continue; 1068 list_range.min = min(list_range.min, list[k]); 1069 list_range.max = max(list_range.max, list[k]); 1070 } 1071 return snd_interval_refine(i, &list_range); 1072 } 1073 EXPORT_SYMBOL(snd_interval_list); 1074 1075 /** 1076 * snd_interval_ranges - refine the interval value from the list of ranges 1077 * @i: the interval value to refine 1078 * @count: the number of elements in the list of ranges 1079 * @ranges: the ranges list 1080 * @mask: the bit-mask to evaluate 1081 * 1082 * Refines the interval value from the list of ranges. 1083 * When mask is non-zero, only the elements corresponding to bit 1 are 1084 * evaluated. 1085 * 1086 * Return: Positive if the value is changed, zero if it's not changed, or a 1087 * negative error code. 1088 */ 1089 int snd_interval_ranges(struct snd_interval *i, unsigned int count, 1090 const struct snd_interval *ranges, unsigned int mask) 1091 { 1092 unsigned int k; 1093 struct snd_interval range_union; 1094 struct snd_interval range; 1095 1096 if (!count) { 1097 snd_interval_none(i); 1098 return -EINVAL; 1099 } 1100 snd_interval_any(&range_union); 1101 range_union.min = UINT_MAX; 1102 range_union.max = 0; 1103 for (k = 0; k < count; k++) { 1104 if (mask && !(mask & (1 << k))) 1105 continue; 1106 snd_interval_copy(&range, &ranges[k]); 1107 if (snd_interval_refine(&range, i) < 0) 1108 continue; 1109 if (snd_interval_empty(&range)) 1110 continue; 1111 1112 if (range.min < range_union.min) { 1113 range_union.min = range.min; 1114 range_union.openmin = 1; 1115 } 1116 if (range.min == range_union.min && !range.openmin) 1117 range_union.openmin = 0; 1118 if (range.max > range_union.max) { 1119 range_union.max = range.max; 1120 range_union.openmax = 1; 1121 } 1122 if (range.max == range_union.max && !range.openmax) 1123 range_union.openmax = 0; 1124 } 1125 return snd_interval_refine(i, &range_union); 1126 } 1127 EXPORT_SYMBOL(snd_interval_ranges); 1128 1129 static int snd_interval_step(struct snd_interval *i, unsigned int step) 1130 { 1131 unsigned int n; 1132 int changed = 0; 1133 n = i->min % step; 1134 if (n != 0 || i->openmin) { 1135 i->min += step - n; 1136 i->openmin = 0; 1137 changed = 1; 1138 } 1139 n = i->max % step; 1140 if (n != 0 || i->openmax) { 1141 i->max -= n; 1142 i->openmax = 0; 1143 changed = 1; 1144 } 1145 if (snd_interval_checkempty(i)) { 1146 i->empty = 1; 1147 return -EINVAL; 1148 } 1149 return changed; 1150 } 1151 1152 /* Info constraints helpers */ 1153 1154 /** 1155 * snd_pcm_hw_rule_add - add the hw-constraint rule 1156 * @runtime: the pcm runtime instance 1157 * @cond: condition bits 1158 * @var: the variable to evaluate 1159 * @func: the evaluation function 1160 * @private: the private data pointer passed to function 1161 * @dep: the dependent variables 1162 * 1163 * Return: Zero if successful, or a negative error code on failure. 1164 */ 1165 int snd_pcm_hw_rule_add(struct snd_pcm_runtime *runtime, unsigned int cond, 1166 int var, 1167 snd_pcm_hw_rule_func_t func, void *private, 1168 int dep, ...) 1169 { 1170 struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints; 1171 struct snd_pcm_hw_rule *c; 1172 unsigned int k; 1173 va_list args; 1174 va_start(args, dep); 1175 if (constrs->rules_num >= constrs->rules_all) { 1176 struct snd_pcm_hw_rule *new; 1177 unsigned int new_rules = constrs->rules_all + 16; 1178 new = krealloc_array(constrs->rules, new_rules, 1179 sizeof(*c), GFP_KERNEL); 1180 if (!new) { 1181 va_end(args); 1182 return -ENOMEM; 1183 } 1184 constrs->rules = new; 1185 constrs->rules_all = new_rules; 1186 } 1187 c = &constrs->rules[constrs->rules_num]; 1188 c->cond = cond; 1189 c->func = func; 1190 c->var = var; 1191 c->private = private; 1192 k = 0; 1193 while (1) { 1194 if (snd_BUG_ON(k >= ARRAY_SIZE(c->deps))) { 1195 va_end(args); 1196 return -EINVAL; 1197 } 1198 c->deps[k++] = dep; 1199 if (dep < 0) 1200 break; 1201 dep = va_arg(args, int); 1202 } 1203 constrs->rules_num++; 1204 va_end(args); 1205 return 0; 1206 } 1207 EXPORT_SYMBOL(snd_pcm_hw_rule_add); 1208 1209 /** 1210 * snd_pcm_hw_constraint_mask - apply the given bitmap mask constraint 1211 * @runtime: PCM runtime instance 1212 * @var: hw_params variable to apply the mask 1213 * @mask: the bitmap mask 1214 * 1215 * Apply the constraint of the given bitmap mask to a 32-bit mask parameter. 1216 * 1217 * Return: Zero if successful, or a negative error code on failure. 1218 */ 1219 int snd_pcm_hw_constraint_mask(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var, 1220 u_int32_t mask) 1221 { 1222 struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints; 1223 struct snd_mask *maskp = constrs_mask(constrs, var); 1224 *maskp->bits &= mask; 1225 memset(maskp->bits + 1, 0, (SNDRV_MASK_MAX-32) / 8); /* clear rest */ 1226 if (*maskp->bits == 0) 1227 return -EINVAL; 1228 return 0; 1229 } 1230 1231 /** 1232 * snd_pcm_hw_constraint_mask64 - apply the given bitmap mask constraint 1233 * @runtime: PCM runtime instance 1234 * @var: hw_params variable to apply the mask 1235 * @mask: the 64bit bitmap mask 1236 * 1237 * Apply the constraint of the given bitmap mask to a 64-bit mask parameter. 1238 * 1239 * Return: Zero if successful, or a negative error code on failure. 1240 */ 1241 int snd_pcm_hw_constraint_mask64(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var, 1242 u_int64_t mask) 1243 { 1244 struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints; 1245 struct snd_mask *maskp = constrs_mask(constrs, var); 1246 maskp->bits[0] &= (u_int32_t)mask; 1247 maskp->bits[1] &= (u_int32_t)(mask >> 32); 1248 memset(maskp->bits + 2, 0, (SNDRV_MASK_MAX-64) / 8); /* clear rest */ 1249 if (! maskp->bits[0] && ! maskp->bits[1]) 1250 return -EINVAL; 1251 return 0; 1252 } 1253 EXPORT_SYMBOL(snd_pcm_hw_constraint_mask64); 1254 1255 /** 1256 * snd_pcm_hw_constraint_integer - apply an integer constraint to an interval 1257 * @runtime: PCM runtime instance 1258 * @var: hw_params variable to apply the integer constraint 1259 * 1260 * Apply the constraint of integer to an interval parameter. 1261 * 1262 * Return: Positive if the value is changed, zero if it's not changed, or a 1263 * negative error code. 1264 */ 1265 int snd_pcm_hw_constraint_integer(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var) 1266 { 1267 struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints; 1268 return snd_interval_setinteger(constrs_interval(constrs, var)); 1269 } 1270 EXPORT_SYMBOL(snd_pcm_hw_constraint_integer); 1271 1272 /** 1273 * snd_pcm_hw_constraint_minmax - apply a min/max range constraint to an interval 1274 * @runtime: PCM runtime instance 1275 * @var: hw_params variable to apply the range 1276 * @min: the minimal value 1277 * @max: the maximal value 1278 * 1279 * Apply the min/max range constraint to an interval parameter. 1280 * 1281 * Return: Positive if the value is changed, zero if it's not changed, or a 1282 * negative error code. 1283 */ 1284 int snd_pcm_hw_constraint_minmax(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var, 1285 unsigned int min, unsigned int max) 1286 { 1287 struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints; 1288 struct snd_interval t; 1289 t.min = min; 1290 t.max = max; 1291 t.openmin = t.openmax = 0; 1292 t.integer = 0; 1293 return snd_interval_refine(constrs_interval(constrs, var), &t); 1294 } 1295 EXPORT_SYMBOL(snd_pcm_hw_constraint_minmax); 1296 1297 static int snd_pcm_hw_rule_list(struct snd_pcm_hw_params *params, 1298 struct snd_pcm_hw_rule *rule) 1299 { 1300 struct snd_pcm_hw_constraint_list *list = rule->private; 1301 return snd_interval_list(hw_param_interval(params, rule->var), list->count, list->list, list->mask); 1302 } 1303 1304 1305 /** 1306 * snd_pcm_hw_constraint_list - apply a list of constraints to a parameter 1307 * @runtime: PCM runtime instance 1308 * @cond: condition bits 1309 * @var: hw_params variable to apply the list constraint 1310 * @l: list 1311 * 1312 * Apply the list of constraints to an interval parameter. 1313 * 1314 * Return: Zero if successful, or a negative error code on failure. 1315 */ 1316 int snd_pcm_hw_constraint_list(struct snd_pcm_runtime *runtime, 1317 unsigned int cond, 1318 snd_pcm_hw_param_t var, 1319 const struct snd_pcm_hw_constraint_list *l) 1320 { 1321 return snd_pcm_hw_rule_add(runtime, cond, var, 1322 snd_pcm_hw_rule_list, (void *)l, 1323 var, -1); 1324 } 1325 EXPORT_SYMBOL(snd_pcm_hw_constraint_list); 1326 1327 static int snd_pcm_hw_rule_ranges(struct snd_pcm_hw_params *params, 1328 struct snd_pcm_hw_rule *rule) 1329 { 1330 struct snd_pcm_hw_constraint_ranges *r = rule->private; 1331 return snd_interval_ranges(hw_param_interval(params, rule->var), 1332 r->count, r->ranges, r->mask); 1333 } 1334 1335 1336 /** 1337 * snd_pcm_hw_constraint_ranges - apply list of range constraints to a parameter 1338 * @runtime: PCM runtime instance 1339 * @cond: condition bits 1340 * @var: hw_params variable to apply the list of range constraints 1341 * @r: ranges 1342 * 1343 * Apply the list of range constraints to an interval parameter. 1344 * 1345 * Return: Zero if successful, or a negative error code on failure. 1346 */ 1347 int snd_pcm_hw_constraint_ranges(struct snd_pcm_runtime *runtime, 1348 unsigned int cond, 1349 snd_pcm_hw_param_t var, 1350 const struct snd_pcm_hw_constraint_ranges *r) 1351 { 1352 return snd_pcm_hw_rule_add(runtime, cond, var, 1353 snd_pcm_hw_rule_ranges, (void *)r, 1354 var, -1); 1355 } 1356 EXPORT_SYMBOL(snd_pcm_hw_constraint_ranges); 1357 1358 static int snd_pcm_hw_rule_ratnums(struct snd_pcm_hw_params *params, 1359 struct snd_pcm_hw_rule *rule) 1360 { 1361 const struct snd_pcm_hw_constraint_ratnums *r = rule->private; 1362 unsigned int num = 0, den = 0; 1363 int err; 1364 err = snd_interval_ratnum(hw_param_interval(params, rule->var), 1365 r->nrats, r->rats, &num, &den); 1366 if (err >= 0 && den && rule->var == SNDRV_PCM_HW_PARAM_RATE) { 1367 params->rate_num = num; 1368 params->rate_den = den; 1369 } 1370 return err; 1371 } 1372 1373 /** 1374 * snd_pcm_hw_constraint_ratnums - apply ratnums constraint to a parameter 1375 * @runtime: PCM runtime instance 1376 * @cond: condition bits 1377 * @var: hw_params variable to apply the ratnums constraint 1378 * @r: struct snd_ratnums constriants 1379 * 1380 * Return: Zero if successful, or a negative error code on failure. 1381 */ 1382 int snd_pcm_hw_constraint_ratnums(struct snd_pcm_runtime *runtime, 1383 unsigned int cond, 1384 snd_pcm_hw_param_t var, 1385 const struct snd_pcm_hw_constraint_ratnums *r) 1386 { 1387 return snd_pcm_hw_rule_add(runtime, cond, var, 1388 snd_pcm_hw_rule_ratnums, (void *)r, 1389 var, -1); 1390 } 1391 EXPORT_SYMBOL(snd_pcm_hw_constraint_ratnums); 1392 1393 static int snd_pcm_hw_rule_ratdens(struct snd_pcm_hw_params *params, 1394 struct snd_pcm_hw_rule *rule) 1395 { 1396 const struct snd_pcm_hw_constraint_ratdens *r = rule->private; 1397 unsigned int num = 0, den = 0; 1398 int err = snd_interval_ratden(hw_param_interval(params, rule->var), 1399 r->nrats, r->rats, &num, &den); 1400 if (err >= 0 && den && rule->var == SNDRV_PCM_HW_PARAM_RATE) { 1401 params->rate_num = num; 1402 params->rate_den = den; 1403 } 1404 return err; 1405 } 1406 1407 /** 1408 * snd_pcm_hw_constraint_ratdens - apply ratdens constraint to a parameter 1409 * @runtime: PCM runtime instance 1410 * @cond: condition bits 1411 * @var: hw_params variable to apply the ratdens constraint 1412 * @r: struct snd_ratdens constriants 1413 * 1414 * Return: Zero if successful, or a negative error code on failure. 1415 */ 1416 int snd_pcm_hw_constraint_ratdens(struct snd_pcm_runtime *runtime, 1417 unsigned int cond, 1418 snd_pcm_hw_param_t var, 1419 const struct snd_pcm_hw_constraint_ratdens *r) 1420 { 1421 return snd_pcm_hw_rule_add(runtime, cond, var, 1422 snd_pcm_hw_rule_ratdens, (void *)r, 1423 var, -1); 1424 } 1425 EXPORT_SYMBOL(snd_pcm_hw_constraint_ratdens); 1426 1427 static int snd_pcm_hw_rule_msbits(struct snd_pcm_hw_params *params, 1428 struct snd_pcm_hw_rule *rule) 1429 { 1430 unsigned int l = (unsigned long) rule->private; 1431 int width = l & 0xffff; 1432 unsigned int msbits = l >> 16; 1433 const struct snd_interval *i = 1434 hw_param_interval_c(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS); 1435 1436 if (!snd_interval_single(i)) 1437 return 0; 1438 1439 if ((snd_interval_value(i) == width) || 1440 (width == 0 && snd_interval_value(i) > msbits)) 1441 params->msbits = min_not_zero(params->msbits, msbits); 1442 1443 return 0; 1444 } 1445 1446 /** 1447 * snd_pcm_hw_constraint_msbits - add a hw constraint msbits rule 1448 * @runtime: PCM runtime instance 1449 * @cond: condition bits 1450 * @width: sample bits width 1451 * @msbits: msbits width 1452 * 1453 * This constraint will set the number of most significant bits (msbits) if a 1454 * sample format with the specified width has been select. If width is set to 0 1455 * the msbits will be set for any sample format with a width larger than the 1456 * specified msbits. 1457 * 1458 * Return: Zero if successful, or a negative error code on failure. 1459 */ 1460 int snd_pcm_hw_constraint_msbits(struct snd_pcm_runtime *runtime, 1461 unsigned int cond, 1462 unsigned int width, 1463 unsigned int msbits) 1464 { 1465 unsigned long l = (msbits << 16) | width; 1466 return snd_pcm_hw_rule_add(runtime, cond, -1, 1467 snd_pcm_hw_rule_msbits, 1468 (void*) l, 1469 SNDRV_PCM_HW_PARAM_SAMPLE_BITS, -1); 1470 } 1471 EXPORT_SYMBOL(snd_pcm_hw_constraint_msbits); 1472 1473 static int snd_pcm_hw_rule_step(struct snd_pcm_hw_params *params, 1474 struct snd_pcm_hw_rule *rule) 1475 { 1476 unsigned long step = (unsigned long) rule->private; 1477 return snd_interval_step(hw_param_interval(params, rule->var), step); 1478 } 1479 1480 /** 1481 * snd_pcm_hw_constraint_step - add a hw constraint step rule 1482 * @runtime: PCM runtime instance 1483 * @cond: condition bits 1484 * @var: hw_params variable to apply the step constraint 1485 * @step: step size 1486 * 1487 * Return: Zero if successful, or a negative error code on failure. 1488 */ 1489 int snd_pcm_hw_constraint_step(struct snd_pcm_runtime *runtime, 1490 unsigned int cond, 1491 snd_pcm_hw_param_t var, 1492 unsigned long step) 1493 { 1494 return snd_pcm_hw_rule_add(runtime, cond, var, 1495 snd_pcm_hw_rule_step, (void *) step, 1496 var, -1); 1497 } 1498 EXPORT_SYMBOL(snd_pcm_hw_constraint_step); 1499 1500 static int snd_pcm_hw_rule_pow2(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule) 1501 { 1502 static const unsigned int pow2_sizes[] = { 1503 1<<0, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7, 1504 1<<8, 1<<9, 1<<10, 1<<11, 1<<12, 1<<13, 1<<14, 1<<15, 1505 1<<16, 1<<17, 1<<18, 1<<19, 1<<20, 1<<21, 1<<22, 1<<23, 1506 1<<24, 1<<25, 1<<26, 1<<27, 1<<28, 1<<29, 1<<30 1507 }; 1508 return snd_interval_list(hw_param_interval(params, rule->var), 1509 ARRAY_SIZE(pow2_sizes), pow2_sizes, 0); 1510 } 1511 1512 /** 1513 * snd_pcm_hw_constraint_pow2 - add a hw constraint power-of-2 rule 1514 * @runtime: PCM runtime instance 1515 * @cond: condition bits 1516 * @var: hw_params variable to apply the power-of-2 constraint 1517 * 1518 * Return: Zero if successful, or a negative error code on failure. 1519 */ 1520 int snd_pcm_hw_constraint_pow2(struct snd_pcm_runtime *runtime, 1521 unsigned int cond, 1522 snd_pcm_hw_param_t var) 1523 { 1524 return snd_pcm_hw_rule_add(runtime, cond, var, 1525 snd_pcm_hw_rule_pow2, NULL, 1526 var, -1); 1527 } 1528 EXPORT_SYMBOL(snd_pcm_hw_constraint_pow2); 1529 1530 static int snd_pcm_hw_rule_noresample_func(struct snd_pcm_hw_params *params, 1531 struct snd_pcm_hw_rule *rule) 1532 { 1533 unsigned int base_rate = (unsigned int)(uintptr_t)rule->private; 1534 struct snd_interval *rate; 1535 1536 rate = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE); 1537 return snd_interval_list(rate, 1, &base_rate, 0); 1538 } 1539 1540 /** 1541 * snd_pcm_hw_rule_noresample - add a rule to allow disabling hw resampling 1542 * @runtime: PCM runtime instance 1543 * @base_rate: the rate at which the hardware does not resample 1544 * 1545 * Return: Zero if successful, or a negative error code on failure. 1546 */ 1547 int snd_pcm_hw_rule_noresample(struct snd_pcm_runtime *runtime, 1548 unsigned int base_rate) 1549 { 1550 return snd_pcm_hw_rule_add(runtime, SNDRV_PCM_HW_PARAMS_NORESAMPLE, 1551 SNDRV_PCM_HW_PARAM_RATE, 1552 snd_pcm_hw_rule_noresample_func, 1553 (void *)(uintptr_t)base_rate, 1554 SNDRV_PCM_HW_PARAM_RATE, -1); 1555 } 1556 EXPORT_SYMBOL(snd_pcm_hw_rule_noresample); 1557 1558 static void _snd_pcm_hw_param_any(struct snd_pcm_hw_params *params, 1559 snd_pcm_hw_param_t var) 1560 { 1561 if (hw_is_mask(var)) { 1562 snd_mask_any(hw_param_mask(params, var)); 1563 params->cmask |= 1 << var; 1564 params->rmask |= 1 << var; 1565 return; 1566 } 1567 if (hw_is_interval(var)) { 1568 snd_interval_any(hw_param_interval(params, var)); 1569 params->cmask |= 1 << var; 1570 params->rmask |= 1 << var; 1571 return; 1572 } 1573 snd_BUG(); 1574 } 1575 1576 void _snd_pcm_hw_params_any(struct snd_pcm_hw_params *params) 1577 { 1578 unsigned int k; 1579 memset(params, 0, sizeof(*params)); 1580 for (k = SNDRV_PCM_HW_PARAM_FIRST_MASK; k <= SNDRV_PCM_HW_PARAM_LAST_MASK; k++) 1581 _snd_pcm_hw_param_any(params, k); 1582 for (k = SNDRV_PCM_HW_PARAM_FIRST_INTERVAL; k <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL; k++) 1583 _snd_pcm_hw_param_any(params, k); 1584 params->info = ~0U; 1585 } 1586 EXPORT_SYMBOL(_snd_pcm_hw_params_any); 1587 1588 /** 1589 * snd_pcm_hw_param_value - return @params field @var value 1590 * @params: the hw_params instance 1591 * @var: parameter to retrieve 1592 * @dir: pointer to the direction (-1,0,1) or %NULL 1593 * 1594 * Return: The value for field @var if it's fixed in configuration space 1595 * defined by @params. -%EINVAL otherwise. 1596 */ 1597 int snd_pcm_hw_param_value(const struct snd_pcm_hw_params *params, 1598 snd_pcm_hw_param_t var, int *dir) 1599 { 1600 if (hw_is_mask(var)) { 1601 const struct snd_mask *mask = hw_param_mask_c(params, var); 1602 if (!snd_mask_single(mask)) 1603 return -EINVAL; 1604 if (dir) 1605 *dir = 0; 1606 return snd_mask_value(mask); 1607 } 1608 if (hw_is_interval(var)) { 1609 const struct snd_interval *i = hw_param_interval_c(params, var); 1610 if (!snd_interval_single(i)) 1611 return -EINVAL; 1612 if (dir) 1613 *dir = i->openmin; 1614 return snd_interval_value(i); 1615 } 1616 return -EINVAL; 1617 } 1618 EXPORT_SYMBOL(snd_pcm_hw_param_value); 1619 1620 void _snd_pcm_hw_param_setempty(struct snd_pcm_hw_params *params, 1621 snd_pcm_hw_param_t var) 1622 { 1623 if (hw_is_mask(var)) { 1624 snd_mask_none(hw_param_mask(params, var)); 1625 params->cmask |= 1 << var; 1626 params->rmask |= 1 << var; 1627 } else if (hw_is_interval(var)) { 1628 snd_interval_none(hw_param_interval(params, var)); 1629 params->cmask |= 1 << var; 1630 params->rmask |= 1 << var; 1631 } else { 1632 snd_BUG(); 1633 } 1634 } 1635 EXPORT_SYMBOL(_snd_pcm_hw_param_setempty); 1636 1637 static int _snd_pcm_hw_param_first(struct snd_pcm_hw_params *params, 1638 snd_pcm_hw_param_t var) 1639 { 1640 int changed; 1641 if (hw_is_mask(var)) 1642 changed = snd_mask_refine_first(hw_param_mask(params, var)); 1643 else if (hw_is_interval(var)) 1644 changed = snd_interval_refine_first(hw_param_interval(params, var)); 1645 else 1646 return -EINVAL; 1647 if (changed > 0) { 1648 params->cmask |= 1 << var; 1649 params->rmask |= 1 << var; 1650 } 1651 return changed; 1652 } 1653 1654 1655 /** 1656 * snd_pcm_hw_param_first - refine config space and return minimum value 1657 * @pcm: PCM instance 1658 * @params: the hw_params instance 1659 * @var: parameter to retrieve 1660 * @dir: pointer to the direction (-1,0,1) or %NULL 1661 * 1662 * Inside configuration space defined by @params remove from @var all 1663 * values > minimum. Reduce configuration space accordingly. 1664 * 1665 * Return: The minimum, or a negative error code on failure. 1666 */ 1667 int snd_pcm_hw_param_first(struct snd_pcm_substream *pcm, 1668 struct snd_pcm_hw_params *params, 1669 snd_pcm_hw_param_t var, int *dir) 1670 { 1671 int changed = _snd_pcm_hw_param_first(params, var); 1672 if (changed < 0) 1673 return changed; 1674 if (params->rmask) { 1675 int err = snd_pcm_hw_refine(pcm, params); 1676 if (err < 0) 1677 return err; 1678 } 1679 return snd_pcm_hw_param_value(params, var, dir); 1680 } 1681 EXPORT_SYMBOL(snd_pcm_hw_param_first); 1682 1683 static int _snd_pcm_hw_param_last(struct snd_pcm_hw_params *params, 1684 snd_pcm_hw_param_t var) 1685 { 1686 int changed; 1687 if (hw_is_mask(var)) 1688 changed = snd_mask_refine_last(hw_param_mask(params, var)); 1689 else if (hw_is_interval(var)) 1690 changed = snd_interval_refine_last(hw_param_interval(params, var)); 1691 else 1692 return -EINVAL; 1693 if (changed > 0) { 1694 params->cmask |= 1 << var; 1695 params->rmask |= 1 << var; 1696 } 1697 return changed; 1698 } 1699 1700 1701 /** 1702 * snd_pcm_hw_param_last - refine config space and return maximum value 1703 * @pcm: PCM instance 1704 * @params: the hw_params instance 1705 * @var: parameter to retrieve 1706 * @dir: pointer to the direction (-1,0,1) or %NULL 1707 * 1708 * Inside configuration space defined by @params remove from @var all 1709 * values < maximum. Reduce configuration space accordingly. 1710 * 1711 * Return: The maximum, or a negative error code on failure. 1712 */ 1713 int snd_pcm_hw_param_last(struct snd_pcm_substream *pcm, 1714 struct snd_pcm_hw_params *params, 1715 snd_pcm_hw_param_t var, int *dir) 1716 { 1717 int changed = _snd_pcm_hw_param_last(params, var); 1718 if (changed < 0) 1719 return changed; 1720 if (params->rmask) { 1721 int err = snd_pcm_hw_refine(pcm, params); 1722 if (err < 0) 1723 return err; 1724 } 1725 return snd_pcm_hw_param_value(params, var, dir); 1726 } 1727 EXPORT_SYMBOL(snd_pcm_hw_param_last); 1728 1729 /** 1730 * snd_pcm_hw_params_bits - Get the number of bits per the sample. 1731 * @p: hardware parameters 1732 * 1733 * Return: The number of bits per sample based on the format, 1734 * subformat and msbits the specified hw params has. 1735 */ 1736 int snd_pcm_hw_params_bits(const struct snd_pcm_hw_params *p) 1737 { 1738 snd_pcm_subformat_t subformat = params_subformat(p); 1739 snd_pcm_format_t format = params_format(p); 1740 1741 switch (format) { 1742 case SNDRV_PCM_FORMAT_S32_LE: 1743 case SNDRV_PCM_FORMAT_U32_LE: 1744 case SNDRV_PCM_FORMAT_S32_BE: 1745 case SNDRV_PCM_FORMAT_U32_BE: 1746 switch (subformat) { 1747 case SNDRV_PCM_SUBFORMAT_MSBITS_20: 1748 return 20; 1749 case SNDRV_PCM_SUBFORMAT_MSBITS_24: 1750 return 24; 1751 case SNDRV_PCM_SUBFORMAT_MSBITS_MAX: 1752 case SNDRV_PCM_SUBFORMAT_STD: 1753 default: 1754 break; 1755 } 1756 fallthrough; 1757 default: 1758 return snd_pcm_format_width(format); 1759 } 1760 } 1761 EXPORT_SYMBOL(snd_pcm_hw_params_bits); 1762 1763 static int snd_pcm_lib_ioctl_reset(struct snd_pcm_substream *substream, 1764 void *arg) 1765 { 1766 struct snd_pcm_runtime *runtime = substream->runtime; 1767 1768 guard(pcm_stream_lock_irqsave)(substream); 1769 if (snd_pcm_running(substream) && 1770 snd_pcm_update_hw_ptr(substream) >= 0) 1771 runtime->status->hw_ptr %= runtime->buffer_size; 1772 else { 1773 runtime->status->hw_ptr = 0; 1774 runtime->hw_ptr_wrap = 0; 1775 } 1776 return 0; 1777 } 1778 1779 static int snd_pcm_lib_ioctl_channel_info(struct snd_pcm_substream *substream, 1780 void *arg) 1781 { 1782 struct snd_pcm_channel_info *info = arg; 1783 struct snd_pcm_runtime *runtime = substream->runtime; 1784 int width; 1785 if (!(runtime->info & SNDRV_PCM_INFO_MMAP)) { 1786 info->offset = -1; 1787 return 0; 1788 } 1789 width = snd_pcm_format_physical_width(runtime->format); 1790 if (width < 0) 1791 return width; 1792 info->offset = 0; 1793 switch (runtime->access) { 1794 case SNDRV_PCM_ACCESS_MMAP_INTERLEAVED: 1795 case SNDRV_PCM_ACCESS_RW_INTERLEAVED: 1796 info->first = info->channel * width; 1797 info->step = runtime->channels * width; 1798 break; 1799 case SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED: 1800 case SNDRV_PCM_ACCESS_RW_NONINTERLEAVED: 1801 { 1802 size_t size = runtime->dma_bytes / runtime->channels; 1803 info->first = info->channel * size * 8; 1804 info->step = width; 1805 break; 1806 } 1807 default: 1808 snd_BUG(); 1809 break; 1810 } 1811 return 0; 1812 } 1813 1814 static int snd_pcm_lib_ioctl_fifo_size(struct snd_pcm_substream *substream, 1815 void *arg) 1816 { 1817 struct snd_pcm_hw_params *params = arg; 1818 snd_pcm_format_t format; 1819 int channels; 1820 ssize_t frame_size; 1821 1822 params->fifo_size = substream->runtime->hw.fifo_size; 1823 if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_FIFO_IN_FRAMES)) { 1824 format = params_format(params); 1825 channels = params_channels(params); 1826 frame_size = snd_pcm_format_size(format, channels); 1827 if (frame_size > 0) 1828 params->fifo_size /= frame_size; 1829 } 1830 return 0; 1831 } 1832 1833 static int snd_pcm_lib_ioctl_sync_id(struct snd_pcm_substream *substream, 1834 void *arg) 1835 { 1836 static const unsigned char id[12] = { 0xff, 0xff, 0xff, 0xff, 1837 0xff, 0xff, 0xff, 0xff, 1838 0xff, 0xff, 0xff, 0xff }; 1839 1840 if (substream->runtime->std_sync_id) 1841 snd_pcm_set_sync_per_card(substream, arg, id, sizeof(id)); 1842 return 0; 1843 } 1844 1845 /** 1846 * snd_pcm_lib_ioctl - a generic PCM ioctl callback 1847 * @substream: the pcm substream instance 1848 * @cmd: ioctl command 1849 * @arg: ioctl argument 1850 * 1851 * Processes the generic ioctl commands for PCM. 1852 * Can be passed as the ioctl callback for PCM ops. 1853 * 1854 * Return: Zero if successful, or a negative error code on failure. 1855 */ 1856 int snd_pcm_lib_ioctl(struct snd_pcm_substream *substream, 1857 unsigned int cmd, void *arg) 1858 { 1859 switch (cmd) { 1860 case SNDRV_PCM_IOCTL1_RESET: 1861 return snd_pcm_lib_ioctl_reset(substream, arg); 1862 case SNDRV_PCM_IOCTL1_CHANNEL_INFO: 1863 return snd_pcm_lib_ioctl_channel_info(substream, arg); 1864 case SNDRV_PCM_IOCTL1_FIFO_SIZE: 1865 return snd_pcm_lib_ioctl_fifo_size(substream, arg); 1866 case SNDRV_PCM_IOCTL1_SYNC_ID: 1867 return snd_pcm_lib_ioctl_sync_id(substream, arg); 1868 } 1869 return -ENXIO; 1870 } 1871 EXPORT_SYMBOL(snd_pcm_lib_ioctl); 1872 1873 /** 1874 * snd_pcm_period_elapsed_under_stream_lock() - update the status of runtime for the next period 1875 * under acquired lock of PCM substream. 1876 * @substream: the instance of pcm substream. 1877 * 1878 * This function is called when the batch of audio data frames as the same size as the period of 1879 * buffer is already processed in audio data transmission. 1880 * 1881 * The call of function updates the status of runtime with the latest position of audio data 1882 * transmission, checks overrun and underrun over buffer, awaken user processes from waiting for 1883 * available audio data frames, sampling audio timestamp, and performs stop or drain the PCM 1884 * substream according to configured threshold. 1885 * 1886 * The function is intended to use for the case that PCM driver operates audio data frames under 1887 * acquired lock of PCM substream; e.g. in callback of any operation of &snd_pcm_ops in process 1888 * context. In any interrupt context, it's preferrable to use ``snd_pcm_period_elapsed()`` instead 1889 * since lock of PCM substream should be acquired in advance. 1890 * 1891 * Developer should pay enough attention that some callbacks in &snd_pcm_ops are done by the call of 1892 * function: 1893 * 1894 * - .pointer - to retrieve current position of audio data transmission by frame count or XRUN state. 1895 * - .trigger - with SNDRV_PCM_TRIGGER_STOP at XRUN or DRAINING state. 1896 * - .get_time_info - to retrieve audio time stamp if needed. 1897 * 1898 * Even if more than one periods have elapsed since the last call, you have to call this only once. 1899 */ 1900 void snd_pcm_period_elapsed_under_stream_lock(struct snd_pcm_substream *substream) 1901 { 1902 struct snd_pcm_runtime *runtime; 1903 1904 if (PCM_RUNTIME_CHECK(substream)) 1905 return; 1906 runtime = substream->runtime; 1907 1908 if (!snd_pcm_running(substream) || 1909 snd_pcm_update_hw_ptr0(substream, 1) < 0) 1910 goto _end; 1911 1912 #ifdef CONFIG_SND_PCM_TIMER 1913 if (substream->timer_running) 1914 snd_timer_interrupt(substream->timer, 1); 1915 #endif 1916 _end: 1917 snd_kill_fasync(runtime->fasync, SIGIO, POLL_IN); 1918 } 1919 EXPORT_SYMBOL(snd_pcm_period_elapsed_under_stream_lock); 1920 1921 /** 1922 * snd_pcm_period_elapsed() - update the status of runtime for the next period by acquiring lock of 1923 * PCM substream. 1924 * @substream: the instance of PCM substream. 1925 * 1926 * This function is mostly similar to ``snd_pcm_period_elapsed_under_stream_lock()`` except for 1927 * acquiring lock of PCM substream voluntarily. 1928 * 1929 * It's typically called by any type of IRQ handler when hardware IRQ occurs to notify event that 1930 * the batch of audio data frames as the same size as the period of buffer is already processed in 1931 * audio data transmission. 1932 */ 1933 void snd_pcm_period_elapsed(struct snd_pcm_substream *substream) 1934 { 1935 if (snd_BUG_ON(!substream)) 1936 return; 1937 1938 guard(pcm_stream_lock_irqsave)(substream); 1939 snd_pcm_period_elapsed_under_stream_lock(substream); 1940 } 1941 EXPORT_SYMBOL(snd_pcm_period_elapsed); 1942 1943 /* 1944 * Wait until avail_min data becomes available 1945 * Returns a negative error code if any error occurs during operation. 1946 * The available space is stored on availp. When err = 0 and avail = 0 1947 * on the capture stream, it indicates the stream is in DRAINING state. 1948 */ 1949 static int wait_for_avail(struct snd_pcm_substream *substream, 1950 snd_pcm_uframes_t *availp) 1951 { 1952 struct snd_pcm_runtime *runtime = substream->runtime; 1953 int is_playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 1954 wait_queue_entry_t wait; 1955 int err = 0; 1956 snd_pcm_uframes_t avail = 0; 1957 long wait_time, tout; 1958 1959 init_waitqueue_entry(&wait, current); 1960 set_current_state(TASK_INTERRUPTIBLE); 1961 add_wait_queue(&runtime->tsleep, &wait); 1962 1963 if (runtime->no_period_wakeup) 1964 wait_time = MAX_SCHEDULE_TIMEOUT; 1965 else { 1966 /* use wait time from substream if available */ 1967 if (substream->wait_time) { 1968 wait_time = substream->wait_time; 1969 } else { 1970 wait_time = 100; 1971 1972 if (runtime->rate) { 1973 long t = runtime->buffer_size * 1100 / runtime->rate; 1974 wait_time = max(t, wait_time); 1975 } 1976 } 1977 wait_time = msecs_to_jiffies(wait_time); 1978 } 1979 1980 for (;;) { 1981 if (signal_pending(current)) { 1982 err = -ERESTARTSYS; 1983 break; 1984 } 1985 1986 /* 1987 * We need to check if space became available already 1988 * (and thus the wakeup happened already) first to close 1989 * the race of space already having become available. 1990 * This check must happen after been added to the waitqueue 1991 * and having current state be INTERRUPTIBLE. 1992 */ 1993 avail = snd_pcm_avail(substream); 1994 if (avail >= runtime->twake) 1995 break; 1996 snd_pcm_stream_unlock_irq(substream); 1997 1998 tout = schedule_timeout(wait_time); 1999 2000 snd_pcm_stream_lock_irq(substream); 2001 set_current_state(TASK_INTERRUPTIBLE); 2002 switch (runtime->state) { 2003 case SNDRV_PCM_STATE_SUSPENDED: 2004 err = -ESTRPIPE; 2005 goto _endloop; 2006 case SNDRV_PCM_STATE_XRUN: 2007 err = -EPIPE; 2008 goto _endloop; 2009 case SNDRV_PCM_STATE_DRAINING: 2010 if (is_playback) 2011 err = -EPIPE; 2012 else 2013 avail = 0; /* indicate draining */ 2014 goto _endloop; 2015 case SNDRV_PCM_STATE_OPEN: 2016 case SNDRV_PCM_STATE_SETUP: 2017 case SNDRV_PCM_STATE_DISCONNECTED: 2018 err = -EBADFD; 2019 goto _endloop; 2020 case SNDRV_PCM_STATE_PAUSED: 2021 continue; 2022 } 2023 if (!tout) { 2024 pcm_dbg(substream->pcm, 2025 "%s timeout (DMA or IRQ trouble?)\n", 2026 is_playback ? "playback write" : "capture read"); 2027 err = -EIO; 2028 break; 2029 } 2030 } 2031 _endloop: 2032 set_current_state(TASK_RUNNING); 2033 remove_wait_queue(&runtime->tsleep, &wait); 2034 *availp = avail; 2035 return err; 2036 } 2037 2038 typedef int (*pcm_transfer_f)(struct snd_pcm_substream *substream, 2039 int channel, unsigned long hwoff, 2040 struct iov_iter *iter, unsigned long bytes); 2041 2042 typedef int (*pcm_copy_f)(struct snd_pcm_substream *, snd_pcm_uframes_t, void *, 2043 snd_pcm_uframes_t, snd_pcm_uframes_t, pcm_transfer_f, 2044 bool); 2045 2046 /* calculate the target DMA-buffer position to be written/read */ 2047 static void *get_dma_ptr(struct snd_pcm_runtime *runtime, 2048 int channel, unsigned long hwoff) 2049 { 2050 return runtime->dma_area + hwoff + 2051 channel * (runtime->dma_bytes / runtime->channels); 2052 } 2053 2054 /* default copy ops for write; used for both interleaved and non- modes */ 2055 static int default_write_copy(struct snd_pcm_substream *substream, 2056 int channel, unsigned long hwoff, 2057 struct iov_iter *iter, unsigned long bytes) 2058 { 2059 if (copy_from_iter(get_dma_ptr(substream->runtime, channel, hwoff), 2060 bytes, iter) != bytes) 2061 return -EFAULT; 2062 return 0; 2063 } 2064 2065 /* fill silence instead of copy data; called as a transfer helper 2066 * from __snd_pcm_lib_write() or directly from noninterleaved_copy() when 2067 * a NULL buffer is passed 2068 */ 2069 static int fill_silence(struct snd_pcm_substream *substream, int channel, 2070 unsigned long hwoff, struct iov_iter *iter, 2071 unsigned long bytes) 2072 { 2073 struct snd_pcm_runtime *runtime = substream->runtime; 2074 2075 if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK) 2076 return 0; 2077 if (substream->ops->fill_silence) 2078 return substream->ops->fill_silence(substream, channel, 2079 hwoff, bytes); 2080 2081 snd_pcm_format_set_silence(runtime->format, 2082 get_dma_ptr(runtime, channel, hwoff), 2083 bytes_to_samples(runtime, bytes)); 2084 return 0; 2085 } 2086 2087 /* default copy ops for read; used for both interleaved and non- modes */ 2088 static int default_read_copy(struct snd_pcm_substream *substream, 2089 int channel, unsigned long hwoff, 2090 struct iov_iter *iter, unsigned long bytes) 2091 { 2092 if (copy_to_iter(get_dma_ptr(substream->runtime, channel, hwoff), 2093 bytes, iter) != bytes) 2094 return -EFAULT; 2095 return 0; 2096 } 2097 2098 /* call transfer with the filled iov_iter */ 2099 static int do_transfer(struct snd_pcm_substream *substream, int c, 2100 unsigned long hwoff, void *data, unsigned long bytes, 2101 pcm_transfer_f transfer, bool in_kernel) 2102 { 2103 struct iov_iter iter; 2104 int err, type; 2105 2106 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 2107 type = ITER_SOURCE; 2108 else 2109 type = ITER_DEST; 2110 2111 if (in_kernel) { 2112 struct kvec kvec = { data, bytes }; 2113 2114 iov_iter_kvec(&iter, type, &kvec, 1, bytes); 2115 return transfer(substream, c, hwoff, &iter, bytes); 2116 } 2117 2118 err = import_ubuf(type, (__force void __user *)data, bytes, &iter); 2119 if (err) 2120 return err; 2121 return transfer(substream, c, hwoff, &iter, bytes); 2122 } 2123 2124 /* call transfer function with the converted pointers and sizes; 2125 * for interleaved mode, it's one shot for all samples 2126 */ 2127 static int interleaved_copy(struct snd_pcm_substream *substream, 2128 snd_pcm_uframes_t hwoff, void *data, 2129 snd_pcm_uframes_t off, 2130 snd_pcm_uframes_t frames, 2131 pcm_transfer_f transfer, 2132 bool in_kernel) 2133 { 2134 struct snd_pcm_runtime *runtime = substream->runtime; 2135 2136 /* convert to bytes */ 2137 hwoff = frames_to_bytes(runtime, hwoff); 2138 off = frames_to_bytes(runtime, off); 2139 frames = frames_to_bytes(runtime, frames); 2140 2141 return do_transfer(substream, 0, hwoff, data + off, frames, transfer, 2142 in_kernel); 2143 } 2144 2145 /* call transfer function with the converted pointers and sizes for each 2146 * non-interleaved channel; when buffer is NULL, silencing instead of copying 2147 */ 2148 static int noninterleaved_copy(struct snd_pcm_substream *substream, 2149 snd_pcm_uframes_t hwoff, void *data, 2150 snd_pcm_uframes_t off, 2151 snd_pcm_uframes_t frames, 2152 pcm_transfer_f transfer, 2153 bool in_kernel) 2154 { 2155 struct snd_pcm_runtime *runtime = substream->runtime; 2156 int channels = runtime->channels; 2157 void **bufs = data; 2158 int c, err; 2159 2160 /* convert to bytes; note that it's not frames_to_bytes() here. 2161 * in non-interleaved mode, we copy for each channel, thus 2162 * each copy is n_samples bytes x channels = whole frames. 2163 */ 2164 off = samples_to_bytes(runtime, off); 2165 frames = samples_to_bytes(runtime, frames); 2166 hwoff = samples_to_bytes(runtime, hwoff); 2167 for (c = 0; c < channels; ++c, ++bufs) { 2168 if (!data || !*bufs) 2169 err = fill_silence(substream, c, hwoff, NULL, frames); 2170 else 2171 err = do_transfer(substream, c, hwoff, *bufs + off, 2172 frames, transfer, in_kernel); 2173 if (err < 0) 2174 return err; 2175 } 2176 return 0; 2177 } 2178 2179 /* fill silence on the given buffer position; 2180 * called from snd_pcm_playback_silence() 2181 */ 2182 static int fill_silence_frames(struct snd_pcm_substream *substream, 2183 snd_pcm_uframes_t off, snd_pcm_uframes_t frames) 2184 { 2185 if (substream->runtime->access == SNDRV_PCM_ACCESS_RW_INTERLEAVED || 2186 substream->runtime->access == SNDRV_PCM_ACCESS_MMAP_INTERLEAVED) 2187 return interleaved_copy(substream, off, NULL, 0, frames, 2188 fill_silence, true); 2189 else 2190 return noninterleaved_copy(substream, off, NULL, 0, frames, 2191 fill_silence, true); 2192 } 2193 2194 /* sanity-check for read/write methods */ 2195 static int pcm_sanity_check(struct snd_pcm_substream *substream) 2196 { 2197 struct snd_pcm_runtime *runtime; 2198 if (PCM_RUNTIME_CHECK(substream)) 2199 return -ENXIO; 2200 runtime = substream->runtime; 2201 if (snd_BUG_ON(!substream->ops->copy && !runtime->dma_area)) 2202 return -EINVAL; 2203 if (runtime->state == SNDRV_PCM_STATE_OPEN) 2204 return -EBADFD; 2205 return 0; 2206 } 2207 2208 static int pcm_accessible_state(struct snd_pcm_runtime *runtime) 2209 { 2210 switch (runtime->state) { 2211 case SNDRV_PCM_STATE_PREPARED: 2212 case SNDRV_PCM_STATE_RUNNING: 2213 case SNDRV_PCM_STATE_PAUSED: 2214 return 0; 2215 case SNDRV_PCM_STATE_XRUN: 2216 return -EPIPE; 2217 case SNDRV_PCM_STATE_SUSPENDED: 2218 return -ESTRPIPE; 2219 default: 2220 return -EBADFD; 2221 } 2222 } 2223 2224 /* update to the given appl_ptr and call ack callback if needed; 2225 * when an error is returned, take back to the original value 2226 */ 2227 int pcm_lib_apply_appl_ptr(struct snd_pcm_substream *substream, 2228 snd_pcm_uframes_t appl_ptr) 2229 { 2230 struct snd_pcm_runtime *runtime = substream->runtime; 2231 snd_pcm_uframes_t old_appl_ptr = runtime->control->appl_ptr; 2232 snd_pcm_sframes_t diff; 2233 int ret; 2234 2235 if (old_appl_ptr == appl_ptr) 2236 return 0; 2237 2238 if (appl_ptr >= runtime->boundary) 2239 return -EINVAL; 2240 /* 2241 * check if a rewind is requested by the application 2242 */ 2243 if (substream->runtime->info & SNDRV_PCM_INFO_NO_REWINDS) { 2244 diff = appl_ptr - old_appl_ptr; 2245 if (diff >= 0) { 2246 if (diff > runtime->buffer_size) 2247 return -EINVAL; 2248 } else { 2249 if (runtime->boundary + diff > runtime->buffer_size) 2250 return -EINVAL; 2251 } 2252 } 2253 2254 runtime->control->appl_ptr = appl_ptr; 2255 if (substream->ops->ack) { 2256 ret = substream->ops->ack(substream); 2257 if (ret < 0) { 2258 runtime->control->appl_ptr = old_appl_ptr; 2259 if (ret == -EPIPE) 2260 __snd_pcm_xrun(substream); 2261 return ret; 2262 } 2263 } 2264 2265 trace_applptr(substream, old_appl_ptr, appl_ptr); 2266 2267 return 0; 2268 } 2269 2270 /* the common loop for read/write data */ 2271 snd_pcm_sframes_t __snd_pcm_lib_xfer(struct snd_pcm_substream *substream, 2272 void *data, bool interleaved, 2273 snd_pcm_uframes_t size, bool in_kernel) 2274 { 2275 struct snd_pcm_runtime *runtime = substream->runtime; 2276 snd_pcm_uframes_t xfer = 0; 2277 snd_pcm_uframes_t offset = 0; 2278 snd_pcm_uframes_t avail; 2279 pcm_copy_f writer; 2280 pcm_transfer_f transfer; 2281 bool nonblock; 2282 bool is_playback; 2283 int err; 2284 2285 err = pcm_sanity_check(substream); 2286 if (err < 0) 2287 return err; 2288 2289 is_playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 2290 if (interleaved) { 2291 if (runtime->access != SNDRV_PCM_ACCESS_RW_INTERLEAVED && 2292 runtime->channels > 1) 2293 return -EINVAL; 2294 writer = interleaved_copy; 2295 } else { 2296 if (runtime->access != SNDRV_PCM_ACCESS_RW_NONINTERLEAVED) 2297 return -EINVAL; 2298 writer = noninterleaved_copy; 2299 } 2300 2301 if (!data) { 2302 if (is_playback) 2303 transfer = fill_silence; 2304 else 2305 return -EINVAL; 2306 } else { 2307 if (substream->ops->copy) 2308 transfer = substream->ops->copy; 2309 else 2310 transfer = is_playback ? 2311 default_write_copy : default_read_copy; 2312 } 2313 2314 if (size == 0) 2315 return 0; 2316 2317 nonblock = !!(substream->f_flags & O_NONBLOCK); 2318 2319 snd_pcm_stream_lock_irq(substream); 2320 err = pcm_accessible_state(runtime); 2321 if (err < 0) 2322 goto _end_unlock; 2323 2324 runtime->twake = runtime->control->avail_min ? : 1; 2325 if (runtime->state == SNDRV_PCM_STATE_RUNNING) 2326 snd_pcm_update_hw_ptr(substream); 2327 2328 /* 2329 * If size < start_threshold, wait indefinitely. Another 2330 * thread may start capture 2331 */ 2332 if (!is_playback && 2333 runtime->state == SNDRV_PCM_STATE_PREPARED && 2334 size >= runtime->start_threshold) { 2335 err = snd_pcm_start(substream); 2336 if (err < 0) 2337 goto _end_unlock; 2338 } 2339 2340 avail = snd_pcm_avail(substream); 2341 2342 while (size > 0) { 2343 snd_pcm_uframes_t frames, appl_ptr, appl_ofs; 2344 snd_pcm_uframes_t cont; 2345 if (!avail) { 2346 if (!is_playback && 2347 runtime->state == SNDRV_PCM_STATE_DRAINING) { 2348 snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP); 2349 goto _end_unlock; 2350 } 2351 if (nonblock) { 2352 err = -EAGAIN; 2353 goto _end_unlock; 2354 } 2355 runtime->twake = min_t(snd_pcm_uframes_t, size, 2356 runtime->control->avail_min ? : 1); 2357 err = wait_for_avail(substream, &avail); 2358 if (err < 0) 2359 goto _end_unlock; 2360 if (!avail) 2361 continue; /* draining */ 2362 } 2363 frames = size > avail ? avail : size; 2364 appl_ptr = READ_ONCE(runtime->control->appl_ptr); 2365 appl_ofs = appl_ptr % runtime->buffer_size; 2366 cont = runtime->buffer_size - appl_ofs; 2367 if (frames > cont) 2368 frames = cont; 2369 if (snd_BUG_ON(!frames)) { 2370 err = -EINVAL; 2371 goto _end_unlock; 2372 } 2373 if (!atomic_inc_unless_negative(&runtime->buffer_accessing)) { 2374 err = -EBUSY; 2375 goto _end_unlock; 2376 } 2377 snd_pcm_stream_unlock_irq(substream); 2378 if (!is_playback) 2379 snd_pcm_dma_buffer_sync(substream, SNDRV_DMA_SYNC_CPU); 2380 err = writer(substream, appl_ofs, data, offset, frames, 2381 transfer, in_kernel); 2382 if (is_playback) 2383 snd_pcm_dma_buffer_sync(substream, SNDRV_DMA_SYNC_DEVICE); 2384 snd_pcm_stream_lock_irq(substream); 2385 atomic_dec(&runtime->buffer_accessing); 2386 if (err < 0) 2387 goto _end_unlock; 2388 err = pcm_accessible_state(runtime); 2389 if (err < 0) 2390 goto _end_unlock; 2391 appl_ptr += frames; 2392 if (appl_ptr >= runtime->boundary) 2393 appl_ptr -= runtime->boundary; 2394 err = pcm_lib_apply_appl_ptr(substream, appl_ptr); 2395 if (err < 0) 2396 goto _end_unlock; 2397 2398 offset += frames; 2399 size -= frames; 2400 xfer += frames; 2401 avail -= frames; 2402 if (is_playback && 2403 runtime->state == SNDRV_PCM_STATE_PREPARED && 2404 snd_pcm_playback_hw_avail(runtime) >= (snd_pcm_sframes_t)runtime->start_threshold) { 2405 err = snd_pcm_start(substream); 2406 if (err < 0) 2407 goto _end_unlock; 2408 } 2409 } 2410 _end_unlock: 2411 runtime->twake = 0; 2412 if (xfer > 0 && err >= 0) 2413 snd_pcm_update_state(substream, runtime); 2414 snd_pcm_stream_unlock_irq(substream); 2415 return xfer > 0 ? (snd_pcm_sframes_t)xfer : err; 2416 } 2417 EXPORT_SYMBOL(__snd_pcm_lib_xfer); 2418 2419 /* 2420 * standard channel mapping helpers 2421 */ 2422 2423 /* default channel maps for multi-channel playbacks, up to 8 channels */ 2424 const struct snd_pcm_chmap_elem snd_pcm_std_chmaps[] = { 2425 { .channels = 1, 2426 .map = { SNDRV_CHMAP_MONO } }, 2427 { .channels = 2, 2428 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } }, 2429 { .channels = 4, 2430 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR, 2431 SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } }, 2432 { .channels = 6, 2433 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR, 2434 SNDRV_CHMAP_RL, SNDRV_CHMAP_RR, 2435 SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE } }, 2436 { .channels = 8, 2437 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR, 2438 SNDRV_CHMAP_RL, SNDRV_CHMAP_RR, 2439 SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE, 2440 SNDRV_CHMAP_SL, SNDRV_CHMAP_SR } }, 2441 { } 2442 }; 2443 EXPORT_SYMBOL_GPL(snd_pcm_std_chmaps); 2444 2445 /* alternative channel maps with CLFE <-> surround swapped for 6/8 channels */ 2446 const struct snd_pcm_chmap_elem snd_pcm_alt_chmaps[] = { 2447 { .channels = 1, 2448 .map = { SNDRV_CHMAP_MONO } }, 2449 { .channels = 2, 2450 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } }, 2451 { .channels = 4, 2452 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR, 2453 SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } }, 2454 { .channels = 6, 2455 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR, 2456 SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE, 2457 SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } }, 2458 { .channels = 8, 2459 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR, 2460 SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE, 2461 SNDRV_CHMAP_RL, SNDRV_CHMAP_RR, 2462 SNDRV_CHMAP_SL, SNDRV_CHMAP_SR } }, 2463 { } 2464 }; 2465 EXPORT_SYMBOL_GPL(snd_pcm_alt_chmaps); 2466 2467 static bool valid_chmap_channels(const struct snd_pcm_chmap *info, int ch) 2468 { 2469 if (ch > info->max_channels) 2470 return false; 2471 return !info->channel_mask || (info->channel_mask & (1U << ch)); 2472 } 2473 2474 static int pcm_chmap_ctl_info(struct snd_kcontrol *kcontrol, 2475 struct snd_ctl_elem_info *uinfo) 2476 { 2477 struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol); 2478 2479 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 2480 uinfo->count = info->max_channels; 2481 uinfo->value.integer.min = 0; 2482 uinfo->value.integer.max = SNDRV_CHMAP_LAST; 2483 return 0; 2484 } 2485 2486 /* get callback for channel map ctl element 2487 * stores the channel position firstly matching with the current channels 2488 */ 2489 static int pcm_chmap_ctl_get(struct snd_kcontrol *kcontrol, 2490 struct snd_ctl_elem_value *ucontrol) 2491 { 2492 struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol); 2493 unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 2494 struct snd_pcm_substream *substream; 2495 const struct snd_pcm_chmap_elem *map; 2496 2497 if (!info->chmap) 2498 return -EINVAL; 2499 substream = snd_pcm_chmap_substream(info, idx); 2500 if (!substream) 2501 return -ENODEV; 2502 memset(ucontrol->value.integer.value, 0, 2503 sizeof(long) * info->max_channels); 2504 if (!substream->runtime) 2505 return 0; /* no channels set */ 2506 for (map = info->chmap; map->channels; map++) { 2507 int i; 2508 if (map->channels == substream->runtime->channels && 2509 valid_chmap_channels(info, map->channels)) { 2510 for (i = 0; i < map->channels; i++) 2511 ucontrol->value.integer.value[i] = map->map[i]; 2512 return 0; 2513 } 2514 } 2515 return -EINVAL; 2516 } 2517 2518 /* tlv callback for channel map ctl element 2519 * expands the pre-defined channel maps in a form of TLV 2520 */ 2521 static int pcm_chmap_ctl_tlv(struct snd_kcontrol *kcontrol, int op_flag, 2522 unsigned int size, unsigned int __user *tlv) 2523 { 2524 struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol); 2525 const struct snd_pcm_chmap_elem *map; 2526 unsigned int __user *dst; 2527 int c, count = 0; 2528 2529 if (!info->chmap) 2530 return -EINVAL; 2531 if (size < 8) 2532 return -ENOMEM; 2533 if (put_user(SNDRV_CTL_TLVT_CONTAINER, tlv)) 2534 return -EFAULT; 2535 size -= 8; 2536 dst = tlv + 2; 2537 for (map = info->chmap; map->channels; map++) { 2538 int chs_bytes = map->channels * 4; 2539 if (!valid_chmap_channels(info, map->channels)) 2540 continue; 2541 if (size < 8) 2542 return -ENOMEM; 2543 if (put_user(SNDRV_CTL_TLVT_CHMAP_FIXED, dst) || 2544 put_user(chs_bytes, dst + 1)) 2545 return -EFAULT; 2546 dst += 2; 2547 size -= 8; 2548 count += 8; 2549 if (size < chs_bytes) 2550 return -ENOMEM; 2551 size -= chs_bytes; 2552 count += chs_bytes; 2553 for (c = 0; c < map->channels; c++) { 2554 if (put_user(map->map[c], dst)) 2555 return -EFAULT; 2556 dst++; 2557 } 2558 } 2559 if (put_user(count, tlv + 1)) 2560 return -EFAULT; 2561 return 0; 2562 } 2563 2564 static void pcm_chmap_ctl_private_free(struct snd_kcontrol *kcontrol) 2565 { 2566 struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol); 2567 info->pcm->streams[info->stream].chmap_kctl = NULL; 2568 kfree(info); 2569 } 2570 2571 /** 2572 * snd_pcm_add_chmap_ctls - create channel-mapping control elements 2573 * @pcm: the assigned PCM instance 2574 * @stream: stream direction 2575 * @chmap: channel map elements (for query) 2576 * @max_channels: the max number of channels for the stream 2577 * @private_value: the value passed to each kcontrol's private_value field 2578 * @info_ret: store struct snd_pcm_chmap instance if non-NULL 2579 * 2580 * Create channel-mapping control elements assigned to the given PCM stream(s). 2581 * Return: Zero if successful, or a negative error value. 2582 */ 2583 int snd_pcm_add_chmap_ctls(struct snd_pcm *pcm, int stream, 2584 const struct snd_pcm_chmap_elem *chmap, 2585 int max_channels, 2586 unsigned long private_value, 2587 struct snd_pcm_chmap **info_ret) 2588 { 2589 struct snd_pcm_chmap *info; 2590 struct snd_kcontrol_new knew = { 2591 .iface = SNDRV_CTL_ELEM_IFACE_PCM, 2592 .access = SNDRV_CTL_ELEM_ACCESS_READ | 2593 SNDRV_CTL_ELEM_ACCESS_VOLATILE | 2594 SNDRV_CTL_ELEM_ACCESS_TLV_READ | 2595 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, 2596 .info = pcm_chmap_ctl_info, 2597 .get = pcm_chmap_ctl_get, 2598 .tlv.c = pcm_chmap_ctl_tlv, 2599 }; 2600 int err; 2601 2602 if (WARN_ON(pcm->streams[stream].chmap_kctl)) 2603 return -EBUSY; 2604 info = kzalloc(sizeof(*info), GFP_KERNEL); 2605 if (!info) 2606 return -ENOMEM; 2607 info->pcm = pcm; 2608 info->stream = stream; 2609 info->chmap = chmap; 2610 info->max_channels = max_channels; 2611 if (stream == SNDRV_PCM_STREAM_PLAYBACK) 2612 knew.name = "Playback Channel Map"; 2613 else 2614 knew.name = "Capture Channel Map"; 2615 knew.device = pcm->device; 2616 knew.count = pcm->streams[stream].substream_count; 2617 knew.private_value = private_value; 2618 info->kctl = snd_ctl_new1(&knew, info); 2619 if (!info->kctl) { 2620 kfree(info); 2621 return -ENOMEM; 2622 } 2623 info->kctl->private_free = pcm_chmap_ctl_private_free; 2624 err = snd_ctl_add(pcm->card, info->kctl); 2625 if (err < 0) 2626 return err; 2627 pcm->streams[stream].chmap_kctl = info->kctl; 2628 if (info_ret) 2629 *info_ret = info; 2630 return 0; 2631 } 2632 EXPORT_SYMBOL_GPL(snd_pcm_add_chmap_ctls); 2633