1 /* 2 * Digital Audio (PCM) abstract layer 3 * Copyright (c) by Jaroslav Kysela <perex@perex.cz> 4 * Abramo Bagnara <abramo@alsa-project.org> 5 * 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 * 21 */ 22 23 #include <linux/slab.h> 24 #include <linux/time.h> 25 #include <linux/math64.h> 26 #include <linux/export.h> 27 #include <sound/core.h> 28 #include <sound/control.h> 29 #include <sound/info.h> 30 #include <sound/pcm.h> 31 #include <sound/pcm_params.h> 32 #include <sound/timer.h> 33 34 /* 35 * fill ring buffer with silence 36 * runtime->silence_start: starting pointer to silence area 37 * runtime->silence_filled: size filled with silence 38 * runtime->silence_threshold: threshold from application 39 * runtime->silence_size: maximal size from application 40 * 41 * when runtime->silence_size >= runtime->boundary - fill processed area with silence immediately 42 */ 43 void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_uframes_t new_hw_ptr) 44 { 45 struct snd_pcm_runtime *runtime = substream->runtime; 46 snd_pcm_uframes_t frames, ofs, transfer; 47 48 if (runtime->silence_size < runtime->boundary) { 49 snd_pcm_sframes_t noise_dist, n; 50 if (runtime->silence_start != runtime->control->appl_ptr) { 51 n = runtime->control->appl_ptr - runtime->silence_start; 52 if (n < 0) 53 n += runtime->boundary; 54 if ((snd_pcm_uframes_t)n < runtime->silence_filled) 55 runtime->silence_filled -= n; 56 else 57 runtime->silence_filled = 0; 58 runtime->silence_start = runtime->control->appl_ptr; 59 } 60 if (runtime->silence_filled >= runtime->buffer_size) 61 return; 62 noise_dist = snd_pcm_playback_hw_avail(runtime) + runtime->silence_filled; 63 if (noise_dist >= (snd_pcm_sframes_t) runtime->silence_threshold) 64 return; 65 frames = runtime->silence_threshold - noise_dist; 66 if (frames > runtime->silence_size) 67 frames = runtime->silence_size; 68 } else { 69 if (new_hw_ptr == ULONG_MAX) { /* initialization */ 70 snd_pcm_sframes_t avail = snd_pcm_playback_hw_avail(runtime); 71 if (avail > runtime->buffer_size) 72 avail = runtime->buffer_size; 73 runtime->silence_filled = avail > 0 ? avail : 0; 74 runtime->silence_start = (runtime->status->hw_ptr + 75 runtime->silence_filled) % 76 runtime->boundary; 77 } else { 78 ofs = runtime->status->hw_ptr; 79 frames = new_hw_ptr - ofs; 80 if ((snd_pcm_sframes_t)frames < 0) 81 frames += runtime->boundary; 82 runtime->silence_filled -= frames; 83 if ((snd_pcm_sframes_t)runtime->silence_filled < 0) { 84 runtime->silence_filled = 0; 85 runtime->silence_start = new_hw_ptr; 86 } else { 87 runtime->silence_start = ofs; 88 } 89 } 90 frames = runtime->buffer_size - runtime->silence_filled; 91 } 92 if (snd_BUG_ON(frames > runtime->buffer_size)) 93 return; 94 if (frames == 0) 95 return; 96 ofs = runtime->silence_start % runtime->buffer_size; 97 while (frames > 0) { 98 transfer = ofs + frames > runtime->buffer_size ? runtime->buffer_size - ofs : frames; 99 if (runtime->access == SNDRV_PCM_ACCESS_RW_INTERLEAVED || 100 runtime->access == SNDRV_PCM_ACCESS_MMAP_INTERLEAVED) { 101 if (substream->ops->silence) { 102 int err; 103 err = substream->ops->silence(substream, -1, ofs, transfer); 104 snd_BUG_ON(err < 0); 105 } else { 106 char *hwbuf = runtime->dma_area + frames_to_bytes(runtime, ofs); 107 snd_pcm_format_set_silence(runtime->format, hwbuf, transfer * runtime->channels); 108 } 109 } else { 110 unsigned int c; 111 unsigned int channels = runtime->channels; 112 if (substream->ops->silence) { 113 for (c = 0; c < channels; ++c) { 114 int err; 115 err = substream->ops->silence(substream, c, ofs, transfer); 116 snd_BUG_ON(err < 0); 117 } 118 } else { 119 size_t dma_csize = runtime->dma_bytes / channels; 120 for (c = 0; c < channels; ++c) { 121 char *hwbuf = runtime->dma_area + (c * dma_csize) + samples_to_bytes(runtime, ofs); 122 snd_pcm_format_set_silence(runtime->format, hwbuf, transfer); 123 } 124 } 125 } 126 runtime->silence_filled += transfer; 127 frames -= transfer; 128 ofs = 0; 129 } 130 } 131 132 #ifdef CONFIG_SND_DEBUG 133 void snd_pcm_debug_name(struct snd_pcm_substream *substream, 134 char *name, size_t len) 135 { 136 snprintf(name, len, "pcmC%dD%d%c:%d", 137 substream->pcm->card->number, 138 substream->pcm->device, 139 substream->stream ? 'c' : 'p', 140 substream->number); 141 } 142 EXPORT_SYMBOL(snd_pcm_debug_name); 143 #endif 144 145 #define XRUN_DEBUG_BASIC (1<<0) 146 #define XRUN_DEBUG_STACK (1<<1) /* dump also stack */ 147 #define XRUN_DEBUG_JIFFIESCHECK (1<<2) /* do jiffies check */ 148 #define XRUN_DEBUG_PERIODUPDATE (1<<3) /* full period update info */ 149 #define XRUN_DEBUG_HWPTRUPDATE (1<<4) /* full hwptr update info */ 150 #define XRUN_DEBUG_LOG (1<<5) /* show last 10 positions on err */ 151 #define XRUN_DEBUG_LOGONCE (1<<6) /* do above only once */ 152 153 #ifdef CONFIG_SND_PCM_XRUN_DEBUG 154 155 #define xrun_debug(substream, mask) \ 156 ((substream)->pstr->xrun_debug & (mask)) 157 #else 158 #define xrun_debug(substream, mask) 0 159 #endif 160 161 #define dump_stack_on_xrun(substream) do { \ 162 if (xrun_debug(substream, XRUN_DEBUG_STACK)) \ 163 dump_stack(); \ 164 } while (0) 165 166 static void xrun(struct snd_pcm_substream *substream) 167 { 168 struct snd_pcm_runtime *runtime = substream->runtime; 169 170 if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) 171 snd_pcm_gettime(runtime, (struct timespec *)&runtime->status->tstamp); 172 snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN); 173 if (xrun_debug(substream, XRUN_DEBUG_BASIC)) { 174 char name[16]; 175 snd_pcm_debug_name(substream, name, sizeof(name)); 176 snd_printd(KERN_DEBUG "XRUN: %s\n", name); 177 dump_stack_on_xrun(substream); 178 } 179 } 180 181 #ifdef CONFIG_SND_PCM_XRUN_DEBUG 182 #define hw_ptr_error(substream, fmt, args...) \ 183 do { \ 184 if (xrun_debug(substream, XRUN_DEBUG_BASIC)) { \ 185 xrun_log_show(substream); \ 186 if (printk_ratelimit()) { \ 187 snd_printd("PCM: " fmt, ##args); \ 188 } \ 189 dump_stack_on_xrun(substream); \ 190 } \ 191 } while (0) 192 193 #define XRUN_LOG_CNT 10 194 195 struct hwptr_log_entry { 196 unsigned int in_interrupt; 197 unsigned long jiffies; 198 snd_pcm_uframes_t pos; 199 snd_pcm_uframes_t period_size; 200 snd_pcm_uframes_t buffer_size; 201 snd_pcm_uframes_t old_hw_ptr; 202 snd_pcm_uframes_t hw_ptr_base; 203 }; 204 205 struct snd_pcm_hwptr_log { 206 unsigned int idx; 207 unsigned int hit: 1; 208 struct hwptr_log_entry entries[XRUN_LOG_CNT]; 209 }; 210 211 static void xrun_log(struct snd_pcm_substream *substream, 212 snd_pcm_uframes_t pos, int in_interrupt) 213 { 214 struct snd_pcm_runtime *runtime = substream->runtime; 215 struct snd_pcm_hwptr_log *log = runtime->hwptr_log; 216 struct hwptr_log_entry *entry; 217 218 if (log == NULL) { 219 log = kzalloc(sizeof(*log), GFP_ATOMIC); 220 if (log == NULL) 221 return; 222 runtime->hwptr_log = log; 223 } else { 224 if (xrun_debug(substream, XRUN_DEBUG_LOGONCE) && log->hit) 225 return; 226 } 227 entry = &log->entries[log->idx]; 228 entry->in_interrupt = in_interrupt; 229 entry->jiffies = jiffies; 230 entry->pos = pos; 231 entry->period_size = runtime->period_size; 232 entry->buffer_size = runtime->buffer_size; 233 entry->old_hw_ptr = runtime->status->hw_ptr; 234 entry->hw_ptr_base = runtime->hw_ptr_base; 235 log->idx = (log->idx + 1) % XRUN_LOG_CNT; 236 } 237 238 static void xrun_log_show(struct snd_pcm_substream *substream) 239 { 240 struct snd_pcm_hwptr_log *log = substream->runtime->hwptr_log; 241 struct hwptr_log_entry *entry; 242 char name[16]; 243 unsigned int idx; 244 int cnt; 245 246 if (log == NULL) 247 return; 248 if (xrun_debug(substream, XRUN_DEBUG_LOGONCE) && log->hit) 249 return; 250 snd_pcm_debug_name(substream, name, sizeof(name)); 251 for (cnt = 0, idx = log->idx; cnt < XRUN_LOG_CNT; cnt++) { 252 entry = &log->entries[idx]; 253 if (entry->period_size == 0) 254 break; 255 snd_printd("hwptr log: %s: %sj=%lu, pos=%ld/%ld/%ld, " 256 "hwptr=%ld/%ld\n", 257 name, entry->in_interrupt ? "[Q] " : "", 258 entry->jiffies, 259 (unsigned long)entry->pos, 260 (unsigned long)entry->period_size, 261 (unsigned long)entry->buffer_size, 262 (unsigned long)entry->old_hw_ptr, 263 (unsigned long)entry->hw_ptr_base); 264 idx++; 265 idx %= XRUN_LOG_CNT; 266 } 267 log->hit = 1; 268 } 269 270 #else /* ! CONFIG_SND_PCM_XRUN_DEBUG */ 271 272 #define hw_ptr_error(substream, fmt, args...) do { } while (0) 273 #define xrun_log(substream, pos, in_interrupt) do { } while (0) 274 #define xrun_log_show(substream) do { } while (0) 275 276 #endif 277 278 int snd_pcm_update_state(struct snd_pcm_substream *substream, 279 struct snd_pcm_runtime *runtime) 280 { 281 snd_pcm_uframes_t avail; 282 283 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 284 avail = snd_pcm_playback_avail(runtime); 285 else 286 avail = snd_pcm_capture_avail(runtime); 287 if (avail > runtime->avail_max) 288 runtime->avail_max = avail; 289 if (runtime->status->state == SNDRV_PCM_STATE_DRAINING) { 290 if (avail >= runtime->buffer_size) { 291 snd_pcm_drain_done(substream); 292 return -EPIPE; 293 } 294 } else { 295 if (avail >= runtime->stop_threshold) { 296 xrun(substream); 297 return -EPIPE; 298 } 299 } 300 if (runtime->twake) { 301 if (avail >= runtime->twake) 302 wake_up(&runtime->tsleep); 303 } else if (avail >= runtime->control->avail_min) 304 wake_up(&runtime->sleep); 305 return 0; 306 } 307 308 static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream, 309 unsigned int in_interrupt) 310 { 311 struct snd_pcm_runtime *runtime = substream->runtime; 312 snd_pcm_uframes_t pos; 313 snd_pcm_uframes_t old_hw_ptr, new_hw_ptr, hw_base; 314 snd_pcm_sframes_t hdelta, delta; 315 unsigned long jdelta; 316 unsigned long curr_jiffies; 317 struct timespec curr_tstamp; 318 319 old_hw_ptr = runtime->status->hw_ptr; 320 321 /* 322 * group pointer, time and jiffies reads to allow for more 323 * accurate correlations/corrections. 324 * The values are stored at the end of this routine after 325 * corrections for hw_ptr position 326 */ 327 pos = substream->ops->pointer(substream); 328 curr_jiffies = jiffies; 329 if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) 330 snd_pcm_gettime(runtime, (struct timespec *)&curr_tstamp); 331 332 if (pos == SNDRV_PCM_POS_XRUN) { 333 xrun(substream); 334 return -EPIPE; 335 } 336 if (pos >= runtime->buffer_size) { 337 if (printk_ratelimit()) { 338 char name[16]; 339 snd_pcm_debug_name(substream, name, sizeof(name)); 340 xrun_log_show(substream); 341 snd_printd(KERN_ERR "BUG: %s, pos = %ld, " 342 "buffer size = %ld, period size = %ld\n", 343 name, pos, runtime->buffer_size, 344 runtime->period_size); 345 } 346 pos = 0; 347 } 348 pos -= pos % runtime->min_align; 349 if (xrun_debug(substream, XRUN_DEBUG_LOG)) 350 xrun_log(substream, pos, in_interrupt); 351 hw_base = runtime->hw_ptr_base; 352 new_hw_ptr = hw_base + pos; 353 if (in_interrupt) { 354 /* we know that one period was processed */ 355 /* delta = "expected next hw_ptr" for in_interrupt != 0 */ 356 delta = runtime->hw_ptr_interrupt + runtime->period_size; 357 if (delta > new_hw_ptr) { 358 /* check for double acknowledged interrupts */ 359 hdelta = curr_jiffies - runtime->hw_ptr_jiffies; 360 if (hdelta > runtime->hw_ptr_buffer_jiffies/2) { 361 hw_base += runtime->buffer_size; 362 if (hw_base >= runtime->boundary) 363 hw_base = 0; 364 new_hw_ptr = hw_base + pos; 365 goto __delta; 366 } 367 } 368 } 369 /* new_hw_ptr might be lower than old_hw_ptr in case when */ 370 /* pointer crosses the end of the ring buffer */ 371 if (new_hw_ptr < old_hw_ptr) { 372 hw_base += runtime->buffer_size; 373 if (hw_base >= runtime->boundary) 374 hw_base = 0; 375 new_hw_ptr = hw_base + pos; 376 } 377 __delta: 378 delta = new_hw_ptr - old_hw_ptr; 379 if (delta < 0) 380 delta += runtime->boundary; 381 if (xrun_debug(substream, in_interrupt ? 382 XRUN_DEBUG_PERIODUPDATE : XRUN_DEBUG_HWPTRUPDATE)) { 383 char name[16]; 384 snd_pcm_debug_name(substream, name, sizeof(name)); 385 snd_printd("%s_update: %s: pos=%u/%u/%u, " 386 "hwptr=%ld/%ld/%ld/%ld\n", 387 in_interrupt ? "period" : "hwptr", 388 name, 389 (unsigned int)pos, 390 (unsigned int)runtime->period_size, 391 (unsigned int)runtime->buffer_size, 392 (unsigned long)delta, 393 (unsigned long)old_hw_ptr, 394 (unsigned long)new_hw_ptr, 395 (unsigned long)runtime->hw_ptr_base); 396 } 397 398 if (runtime->no_period_wakeup) { 399 snd_pcm_sframes_t xrun_threshold; 400 /* 401 * Without regular period interrupts, we have to check 402 * the elapsed time to detect xruns. 403 */ 404 jdelta = curr_jiffies - runtime->hw_ptr_jiffies; 405 if (jdelta < runtime->hw_ptr_buffer_jiffies / 2) 406 goto no_delta_check; 407 hdelta = jdelta - delta * HZ / runtime->rate; 408 xrun_threshold = runtime->hw_ptr_buffer_jiffies / 2 + 1; 409 while (hdelta > xrun_threshold) { 410 delta += runtime->buffer_size; 411 hw_base += runtime->buffer_size; 412 if (hw_base >= runtime->boundary) 413 hw_base = 0; 414 new_hw_ptr = hw_base + pos; 415 hdelta -= runtime->hw_ptr_buffer_jiffies; 416 } 417 goto no_delta_check; 418 } 419 420 /* something must be really wrong */ 421 if (delta >= runtime->buffer_size + runtime->period_size) { 422 hw_ptr_error(substream, 423 "Unexpected hw_pointer value %s" 424 "(stream=%i, pos=%ld, new_hw_ptr=%ld, " 425 "old_hw_ptr=%ld)\n", 426 in_interrupt ? "[Q] " : "[P]", 427 substream->stream, (long)pos, 428 (long)new_hw_ptr, (long)old_hw_ptr); 429 return 0; 430 } 431 432 /* Do jiffies check only in xrun_debug mode */ 433 if (!xrun_debug(substream, XRUN_DEBUG_JIFFIESCHECK)) 434 goto no_jiffies_check; 435 436 /* Skip the jiffies check for hardwares with BATCH flag. 437 * Such hardware usually just increases the position at each IRQ, 438 * thus it can't give any strange position. 439 */ 440 if (runtime->hw.info & SNDRV_PCM_INFO_BATCH) 441 goto no_jiffies_check; 442 hdelta = delta; 443 if (hdelta < runtime->delay) 444 goto no_jiffies_check; 445 hdelta -= runtime->delay; 446 jdelta = curr_jiffies - runtime->hw_ptr_jiffies; 447 if (((hdelta * HZ) / runtime->rate) > jdelta + HZ/100) { 448 delta = jdelta / 449 (((runtime->period_size * HZ) / runtime->rate) 450 + HZ/100); 451 /* move new_hw_ptr according jiffies not pos variable */ 452 new_hw_ptr = old_hw_ptr; 453 hw_base = delta; 454 /* use loop to avoid checks for delta overflows */ 455 /* the delta value is small or zero in most cases */ 456 while (delta > 0) { 457 new_hw_ptr += runtime->period_size; 458 if (new_hw_ptr >= runtime->boundary) 459 new_hw_ptr -= runtime->boundary; 460 delta--; 461 } 462 /* align hw_base to buffer_size */ 463 hw_ptr_error(substream, 464 "hw_ptr skipping! %s" 465 "(pos=%ld, delta=%ld, period=%ld, " 466 "jdelta=%lu/%lu/%lu, hw_ptr=%ld/%ld)\n", 467 in_interrupt ? "[Q] " : "", 468 (long)pos, (long)hdelta, 469 (long)runtime->period_size, jdelta, 470 ((hdelta * HZ) / runtime->rate), hw_base, 471 (unsigned long)old_hw_ptr, 472 (unsigned long)new_hw_ptr); 473 /* reset values to proper state */ 474 delta = 0; 475 hw_base = new_hw_ptr - (new_hw_ptr % runtime->buffer_size); 476 } 477 no_jiffies_check: 478 if (delta > runtime->period_size + runtime->period_size / 2) { 479 hw_ptr_error(substream, 480 "Lost interrupts? %s" 481 "(stream=%i, delta=%ld, new_hw_ptr=%ld, " 482 "old_hw_ptr=%ld)\n", 483 in_interrupt ? "[Q] " : "", 484 substream->stream, (long)delta, 485 (long)new_hw_ptr, 486 (long)old_hw_ptr); 487 } 488 489 no_delta_check: 490 if (runtime->status->hw_ptr == new_hw_ptr) 491 return 0; 492 493 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && 494 runtime->silence_size > 0) 495 snd_pcm_playback_silence(substream, new_hw_ptr); 496 497 if (in_interrupt) { 498 delta = new_hw_ptr - runtime->hw_ptr_interrupt; 499 if (delta < 0) 500 delta += runtime->boundary; 501 delta -= (snd_pcm_uframes_t)delta % runtime->period_size; 502 runtime->hw_ptr_interrupt += delta; 503 if (runtime->hw_ptr_interrupt >= runtime->boundary) 504 runtime->hw_ptr_interrupt -= runtime->boundary; 505 } 506 runtime->hw_ptr_base = hw_base; 507 runtime->status->hw_ptr = new_hw_ptr; 508 runtime->hw_ptr_jiffies = curr_jiffies; 509 if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) 510 runtime->status->tstamp = curr_tstamp; 511 512 return snd_pcm_update_state(substream, runtime); 513 } 514 515 /* CAUTION: call it with irq disabled */ 516 int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream) 517 { 518 return snd_pcm_update_hw_ptr0(substream, 0); 519 } 520 521 /** 522 * snd_pcm_set_ops - set the PCM operators 523 * @pcm: the pcm instance 524 * @direction: stream direction, SNDRV_PCM_STREAM_XXX 525 * @ops: the operator table 526 * 527 * Sets the given PCM operators to the pcm instance. 528 */ 529 void snd_pcm_set_ops(struct snd_pcm *pcm, int direction, struct snd_pcm_ops *ops) 530 { 531 struct snd_pcm_str *stream = &pcm->streams[direction]; 532 struct snd_pcm_substream *substream; 533 534 for (substream = stream->substream; substream != NULL; substream = substream->next) 535 substream->ops = ops; 536 } 537 538 EXPORT_SYMBOL(snd_pcm_set_ops); 539 540 /** 541 * snd_pcm_sync - set the PCM sync id 542 * @substream: the pcm substream 543 * 544 * Sets the PCM sync identifier for the card. 545 */ 546 void snd_pcm_set_sync(struct snd_pcm_substream *substream) 547 { 548 struct snd_pcm_runtime *runtime = substream->runtime; 549 550 runtime->sync.id32[0] = substream->pcm->card->number; 551 runtime->sync.id32[1] = -1; 552 runtime->sync.id32[2] = -1; 553 runtime->sync.id32[3] = -1; 554 } 555 556 EXPORT_SYMBOL(snd_pcm_set_sync); 557 558 /* 559 * Standard ioctl routine 560 */ 561 562 static inline unsigned int div32(unsigned int a, unsigned int b, 563 unsigned int *r) 564 { 565 if (b == 0) { 566 *r = 0; 567 return UINT_MAX; 568 } 569 *r = a % b; 570 return a / b; 571 } 572 573 static inline unsigned int div_down(unsigned int a, unsigned int b) 574 { 575 if (b == 0) 576 return UINT_MAX; 577 return a / b; 578 } 579 580 static inline unsigned int div_up(unsigned int a, unsigned int b) 581 { 582 unsigned int r; 583 unsigned int q; 584 if (b == 0) 585 return UINT_MAX; 586 q = div32(a, b, &r); 587 if (r) 588 ++q; 589 return q; 590 } 591 592 static inline unsigned int mul(unsigned int a, unsigned int b) 593 { 594 if (a == 0) 595 return 0; 596 if (div_down(UINT_MAX, a) < b) 597 return UINT_MAX; 598 return a * b; 599 } 600 601 static inline unsigned int muldiv32(unsigned int a, unsigned int b, 602 unsigned int c, unsigned int *r) 603 { 604 u_int64_t n = (u_int64_t) a * b; 605 if (c == 0) { 606 snd_BUG_ON(!n); 607 *r = 0; 608 return UINT_MAX; 609 } 610 n = div_u64_rem(n, c, r); 611 if (n >= UINT_MAX) { 612 *r = 0; 613 return UINT_MAX; 614 } 615 return n; 616 } 617 618 /** 619 * snd_interval_refine - refine the interval value of configurator 620 * @i: the interval value to refine 621 * @v: the interval value to refer to 622 * 623 * Refines the interval value with the reference value. 624 * The interval is changed to the range satisfying both intervals. 625 * The interval status (min, max, integer, etc.) are evaluated. 626 * 627 * Returns non-zero if the value is changed, zero if not changed. 628 */ 629 int snd_interval_refine(struct snd_interval *i, const struct snd_interval *v) 630 { 631 int changed = 0; 632 if (snd_BUG_ON(snd_interval_empty(i))) 633 return -EINVAL; 634 if (i->min < v->min) { 635 i->min = v->min; 636 i->openmin = v->openmin; 637 changed = 1; 638 } else if (i->min == v->min && !i->openmin && v->openmin) { 639 i->openmin = 1; 640 changed = 1; 641 } 642 if (i->max > v->max) { 643 i->max = v->max; 644 i->openmax = v->openmax; 645 changed = 1; 646 } else if (i->max == v->max && !i->openmax && v->openmax) { 647 i->openmax = 1; 648 changed = 1; 649 } 650 if (!i->integer && v->integer) { 651 i->integer = 1; 652 changed = 1; 653 } 654 if (i->integer) { 655 if (i->openmin) { 656 i->min++; 657 i->openmin = 0; 658 } 659 if (i->openmax) { 660 i->max--; 661 i->openmax = 0; 662 } 663 } else if (!i->openmin && !i->openmax && i->min == i->max) 664 i->integer = 1; 665 if (snd_interval_checkempty(i)) { 666 snd_interval_none(i); 667 return -EINVAL; 668 } 669 return changed; 670 } 671 672 EXPORT_SYMBOL(snd_interval_refine); 673 674 static int snd_interval_refine_first(struct snd_interval *i) 675 { 676 if (snd_BUG_ON(snd_interval_empty(i))) 677 return -EINVAL; 678 if (snd_interval_single(i)) 679 return 0; 680 i->max = i->min; 681 i->openmax = i->openmin; 682 if (i->openmax) 683 i->max++; 684 return 1; 685 } 686 687 static int snd_interval_refine_last(struct snd_interval *i) 688 { 689 if (snd_BUG_ON(snd_interval_empty(i))) 690 return -EINVAL; 691 if (snd_interval_single(i)) 692 return 0; 693 i->min = i->max; 694 i->openmin = i->openmax; 695 if (i->openmin) 696 i->min--; 697 return 1; 698 } 699 700 void snd_interval_mul(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c) 701 { 702 if (a->empty || b->empty) { 703 snd_interval_none(c); 704 return; 705 } 706 c->empty = 0; 707 c->min = mul(a->min, b->min); 708 c->openmin = (a->openmin || b->openmin); 709 c->max = mul(a->max, b->max); 710 c->openmax = (a->openmax || b->openmax); 711 c->integer = (a->integer && b->integer); 712 } 713 714 /** 715 * snd_interval_div - refine the interval value with division 716 * @a: dividend 717 * @b: divisor 718 * @c: quotient 719 * 720 * c = a / b 721 * 722 * Returns non-zero if the value is changed, zero if not changed. 723 */ 724 void snd_interval_div(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c) 725 { 726 unsigned int r; 727 if (a->empty || b->empty) { 728 snd_interval_none(c); 729 return; 730 } 731 c->empty = 0; 732 c->min = div32(a->min, b->max, &r); 733 c->openmin = (r || a->openmin || b->openmax); 734 if (b->min > 0) { 735 c->max = div32(a->max, b->min, &r); 736 if (r) { 737 c->max++; 738 c->openmax = 1; 739 } else 740 c->openmax = (a->openmax || b->openmin); 741 } else { 742 c->max = UINT_MAX; 743 c->openmax = 0; 744 } 745 c->integer = 0; 746 } 747 748 /** 749 * snd_interval_muldivk - refine the interval value 750 * @a: dividend 1 751 * @b: dividend 2 752 * @k: divisor (as integer) 753 * @c: result 754 * 755 * c = a * b / k 756 * 757 * Returns non-zero if the value is changed, zero if not changed. 758 */ 759 void snd_interval_muldivk(const struct snd_interval *a, const struct snd_interval *b, 760 unsigned int k, struct snd_interval *c) 761 { 762 unsigned int r; 763 if (a->empty || b->empty) { 764 snd_interval_none(c); 765 return; 766 } 767 c->empty = 0; 768 c->min = muldiv32(a->min, b->min, k, &r); 769 c->openmin = (r || a->openmin || b->openmin); 770 c->max = muldiv32(a->max, b->max, k, &r); 771 if (r) { 772 c->max++; 773 c->openmax = 1; 774 } else 775 c->openmax = (a->openmax || b->openmax); 776 c->integer = 0; 777 } 778 779 /** 780 * snd_interval_mulkdiv - refine the interval value 781 * @a: dividend 1 782 * @k: dividend 2 (as integer) 783 * @b: divisor 784 * @c: result 785 * 786 * c = a * k / b 787 * 788 * Returns non-zero if the value is changed, zero if not changed. 789 */ 790 void snd_interval_mulkdiv(const struct snd_interval *a, unsigned int k, 791 const struct snd_interval *b, struct snd_interval *c) 792 { 793 unsigned int r; 794 if (a->empty || b->empty) { 795 snd_interval_none(c); 796 return; 797 } 798 c->empty = 0; 799 c->min = muldiv32(a->min, k, b->max, &r); 800 c->openmin = (r || a->openmin || b->openmax); 801 if (b->min > 0) { 802 c->max = muldiv32(a->max, k, b->min, &r); 803 if (r) { 804 c->max++; 805 c->openmax = 1; 806 } else 807 c->openmax = (a->openmax || b->openmin); 808 } else { 809 c->max = UINT_MAX; 810 c->openmax = 0; 811 } 812 c->integer = 0; 813 } 814 815 /* ---- */ 816 817 818 /** 819 * snd_interval_ratnum - refine the interval value 820 * @i: interval to refine 821 * @rats_count: number of ratnum_t 822 * @rats: ratnum_t array 823 * @nump: pointer to store the resultant numerator 824 * @denp: pointer to store the resultant denominator 825 * 826 * Returns non-zero if the value is changed, zero if not changed. 827 */ 828 int snd_interval_ratnum(struct snd_interval *i, 829 unsigned int rats_count, struct snd_ratnum *rats, 830 unsigned int *nump, unsigned int *denp) 831 { 832 unsigned int best_num, best_den; 833 int best_diff; 834 unsigned int k; 835 struct snd_interval t; 836 int err; 837 unsigned int result_num, result_den; 838 int result_diff; 839 840 best_num = best_den = best_diff = 0; 841 for (k = 0; k < rats_count; ++k) { 842 unsigned int num = rats[k].num; 843 unsigned int den; 844 unsigned int q = i->min; 845 int diff; 846 if (q == 0) 847 q = 1; 848 den = div_up(num, q); 849 if (den < rats[k].den_min) 850 continue; 851 if (den > rats[k].den_max) 852 den = rats[k].den_max; 853 else { 854 unsigned int r; 855 r = (den - rats[k].den_min) % rats[k].den_step; 856 if (r != 0) 857 den -= r; 858 } 859 diff = num - q * den; 860 if (diff < 0) 861 diff = -diff; 862 if (best_num == 0 || 863 diff * best_den < best_diff * den) { 864 best_diff = diff; 865 best_den = den; 866 best_num = num; 867 } 868 } 869 if (best_den == 0) { 870 i->empty = 1; 871 return -EINVAL; 872 } 873 t.min = div_down(best_num, best_den); 874 t.openmin = !!(best_num % best_den); 875 876 result_num = best_num; 877 result_diff = best_diff; 878 result_den = best_den; 879 best_num = best_den = best_diff = 0; 880 for (k = 0; k < rats_count; ++k) { 881 unsigned int num = rats[k].num; 882 unsigned int den; 883 unsigned int q = i->max; 884 int diff; 885 if (q == 0) { 886 i->empty = 1; 887 return -EINVAL; 888 } 889 den = div_down(num, q); 890 if (den > rats[k].den_max) 891 continue; 892 if (den < rats[k].den_min) 893 den = rats[k].den_min; 894 else { 895 unsigned int r; 896 r = (den - rats[k].den_min) % rats[k].den_step; 897 if (r != 0) 898 den += rats[k].den_step - r; 899 } 900 diff = q * den - num; 901 if (diff < 0) 902 diff = -diff; 903 if (best_num == 0 || 904 diff * best_den < best_diff * den) { 905 best_diff = diff; 906 best_den = den; 907 best_num = num; 908 } 909 } 910 if (best_den == 0) { 911 i->empty = 1; 912 return -EINVAL; 913 } 914 t.max = div_up(best_num, best_den); 915 t.openmax = !!(best_num % best_den); 916 t.integer = 0; 917 err = snd_interval_refine(i, &t); 918 if (err < 0) 919 return err; 920 921 if (snd_interval_single(i)) { 922 if (best_diff * result_den < result_diff * best_den) { 923 result_num = best_num; 924 result_den = best_den; 925 } 926 if (nump) 927 *nump = result_num; 928 if (denp) 929 *denp = result_den; 930 } 931 return err; 932 } 933 934 EXPORT_SYMBOL(snd_interval_ratnum); 935 936 /** 937 * snd_interval_ratden - refine the interval value 938 * @i: interval to refine 939 * @rats_count: number of struct ratden 940 * @rats: struct ratden array 941 * @nump: pointer to store the resultant numerator 942 * @denp: pointer to store the resultant denominator 943 * 944 * Returns non-zero if the value is changed, zero if not changed. 945 */ 946 static int snd_interval_ratden(struct snd_interval *i, 947 unsigned int rats_count, struct snd_ratden *rats, 948 unsigned int *nump, unsigned int *denp) 949 { 950 unsigned int best_num, best_diff, best_den; 951 unsigned int k; 952 struct snd_interval t; 953 int err; 954 955 best_num = best_den = best_diff = 0; 956 for (k = 0; k < rats_count; ++k) { 957 unsigned int num; 958 unsigned int den = rats[k].den; 959 unsigned int q = i->min; 960 int diff; 961 num = mul(q, den); 962 if (num > rats[k].num_max) 963 continue; 964 if (num < rats[k].num_min) 965 num = rats[k].num_max; 966 else { 967 unsigned int r; 968 r = (num - rats[k].num_min) % rats[k].num_step; 969 if (r != 0) 970 num += rats[k].num_step - r; 971 } 972 diff = num - q * den; 973 if (best_num == 0 || 974 diff * best_den < best_diff * den) { 975 best_diff = diff; 976 best_den = den; 977 best_num = num; 978 } 979 } 980 if (best_den == 0) { 981 i->empty = 1; 982 return -EINVAL; 983 } 984 t.min = div_down(best_num, best_den); 985 t.openmin = !!(best_num % best_den); 986 987 best_num = best_den = best_diff = 0; 988 for (k = 0; k < rats_count; ++k) { 989 unsigned int num; 990 unsigned int den = rats[k].den; 991 unsigned int q = i->max; 992 int diff; 993 num = mul(q, den); 994 if (num < rats[k].num_min) 995 continue; 996 if (num > rats[k].num_max) 997 num = rats[k].num_max; 998 else { 999 unsigned int r; 1000 r = (num - rats[k].num_min) % rats[k].num_step; 1001 if (r != 0) 1002 num -= r; 1003 } 1004 diff = q * den - num; 1005 if (best_num == 0 || 1006 diff * best_den < best_diff * den) { 1007 best_diff = diff; 1008 best_den = den; 1009 best_num = num; 1010 } 1011 } 1012 if (best_den == 0) { 1013 i->empty = 1; 1014 return -EINVAL; 1015 } 1016 t.max = div_up(best_num, best_den); 1017 t.openmax = !!(best_num % best_den); 1018 t.integer = 0; 1019 err = snd_interval_refine(i, &t); 1020 if (err < 0) 1021 return err; 1022 1023 if (snd_interval_single(i)) { 1024 if (nump) 1025 *nump = best_num; 1026 if (denp) 1027 *denp = best_den; 1028 } 1029 return err; 1030 } 1031 1032 /** 1033 * snd_interval_list - refine the interval value from the list 1034 * @i: the interval value to refine 1035 * @count: the number of elements in the list 1036 * @list: the value list 1037 * @mask: the bit-mask to evaluate 1038 * 1039 * Refines the interval value from the list. 1040 * When mask is non-zero, only the elements corresponding to bit 1 are 1041 * evaluated. 1042 * 1043 * Returns non-zero if the value is changed, zero if not changed. 1044 */ 1045 int snd_interval_list(struct snd_interval *i, unsigned int count, 1046 const unsigned int *list, unsigned int mask) 1047 { 1048 unsigned int k; 1049 struct snd_interval list_range; 1050 1051 if (!count) { 1052 i->empty = 1; 1053 return -EINVAL; 1054 } 1055 snd_interval_any(&list_range); 1056 list_range.min = UINT_MAX; 1057 list_range.max = 0; 1058 for (k = 0; k < count; k++) { 1059 if (mask && !(mask & (1 << k))) 1060 continue; 1061 if (!snd_interval_test(i, list[k])) 1062 continue; 1063 list_range.min = min(list_range.min, list[k]); 1064 list_range.max = max(list_range.max, list[k]); 1065 } 1066 return snd_interval_refine(i, &list_range); 1067 } 1068 1069 EXPORT_SYMBOL(snd_interval_list); 1070 1071 static int snd_interval_step(struct snd_interval *i, unsigned int min, unsigned int step) 1072 { 1073 unsigned int n; 1074 int changed = 0; 1075 n = (i->min - min) % step; 1076 if (n != 0 || i->openmin) { 1077 i->min += step - n; 1078 changed = 1; 1079 } 1080 n = (i->max - min) % step; 1081 if (n != 0 || i->openmax) { 1082 i->max -= n; 1083 changed = 1; 1084 } 1085 if (snd_interval_checkempty(i)) { 1086 i->empty = 1; 1087 return -EINVAL; 1088 } 1089 return changed; 1090 } 1091 1092 /* Info constraints helpers */ 1093 1094 /** 1095 * snd_pcm_hw_rule_add - add the hw-constraint rule 1096 * @runtime: the pcm runtime instance 1097 * @cond: condition bits 1098 * @var: the variable to evaluate 1099 * @func: the evaluation function 1100 * @private: the private data pointer passed to function 1101 * @dep: the dependent variables 1102 * 1103 * Returns zero if successful, or a negative error code on failure. 1104 */ 1105 int snd_pcm_hw_rule_add(struct snd_pcm_runtime *runtime, unsigned int cond, 1106 int var, 1107 snd_pcm_hw_rule_func_t func, void *private, 1108 int dep, ...) 1109 { 1110 struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints; 1111 struct snd_pcm_hw_rule *c; 1112 unsigned int k; 1113 va_list args; 1114 va_start(args, dep); 1115 if (constrs->rules_num >= constrs->rules_all) { 1116 struct snd_pcm_hw_rule *new; 1117 unsigned int new_rules = constrs->rules_all + 16; 1118 new = kcalloc(new_rules, sizeof(*c), GFP_KERNEL); 1119 if (!new) { 1120 va_end(args); 1121 return -ENOMEM; 1122 } 1123 if (constrs->rules) { 1124 memcpy(new, constrs->rules, 1125 constrs->rules_num * sizeof(*c)); 1126 kfree(constrs->rules); 1127 } 1128 constrs->rules = new; 1129 constrs->rules_all = new_rules; 1130 } 1131 c = &constrs->rules[constrs->rules_num]; 1132 c->cond = cond; 1133 c->func = func; 1134 c->var = var; 1135 c->private = private; 1136 k = 0; 1137 while (1) { 1138 if (snd_BUG_ON(k >= ARRAY_SIZE(c->deps))) { 1139 va_end(args); 1140 return -EINVAL; 1141 } 1142 c->deps[k++] = dep; 1143 if (dep < 0) 1144 break; 1145 dep = va_arg(args, int); 1146 } 1147 constrs->rules_num++; 1148 va_end(args); 1149 return 0; 1150 } 1151 1152 EXPORT_SYMBOL(snd_pcm_hw_rule_add); 1153 1154 /** 1155 * snd_pcm_hw_constraint_mask - apply the given bitmap mask constraint 1156 * @runtime: PCM runtime instance 1157 * @var: hw_params variable to apply the mask 1158 * @mask: the bitmap mask 1159 * 1160 * Apply the constraint of the given bitmap mask to a 32-bit mask parameter. 1161 */ 1162 int snd_pcm_hw_constraint_mask(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var, 1163 u_int32_t mask) 1164 { 1165 struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints; 1166 struct snd_mask *maskp = constrs_mask(constrs, var); 1167 *maskp->bits &= mask; 1168 memset(maskp->bits + 1, 0, (SNDRV_MASK_MAX-32) / 8); /* clear rest */ 1169 if (*maskp->bits == 0) 1170 return -EINVAL; 1171 return 0; 1172 } 1173 1174 /** 1175 * snd_pcm_hw_constraint_mask64 - apply the given bitmap mask constraint 1176 * @runtime: PCM runtime instance 1177 * @var: hw_params variable to apply the mask 1178 * @mask: the 64bit bitmap mask 1179 * 1180 * Apply the constraint of the given bitmap mask to a 64-bit mask parameter. 1181 */ 1182 int snd_pcm_hw_constraint_mask64(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var, 1183 u_int64_t mask) 1184 { 1185 struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints; 1186 struct snd_mask *maskp = constrs_mask(constrs, var); 1187 maskp->bits[0] &= (u_int32_t)mask; 1188 maskp->bits[1] &= (u_int32_t)(mask >> 32); 1189 memset(maskp->bits + 2, 0, (SNDRV_MASK_MAX-64) / 8); /* clear rest */ 1190 if (! maskp->bits[0] && ! maskp->bits[1]) 1191 return -EINVAL; 1192 return 0; 1193 } 1194 1195 /** 1196 * snd_pcm_hw_constraint_integer - apply an integer constraint to an interval 1197 * @runtime: PCM runtime instance 1198 * @var: hw_params variable to apply the integer constraint 1199 * 1200 * Apply the constraint of integer to an interval parameter. 1201 */ 1202 int snd_pcm_hw_constraint_integer(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var) 1203 { 1204 struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints; 1205 return snd_interval_setinteger(constrs_interval(constrs, var)); 1206 } 1207 1208 EXPORT_SYMBOL(snd_pcm_hw_constraint_integer); 1209 1210 /** 1211 * snd_pcm_hw_constraint_minmax - apply a min/max range constraint to an interval 1212 * @runtime: PCM runtime instance 1213 * @var: hw_params variable to apply the range 1214 * @min: the minimal value 1215 * @max: the maximal value 1216 * 1217 * Apply the min/max range constraint to an interval parameter. 1218 */ 1219 int snd_pcm_hw_constraint_minmax(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var, 1220 unsigned int min, unsigned int max) 1221 { 1222 struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints; 1223 struct snd_interval t; 1224 t.min = min; 1225 t.max = max; 1226 t.openmin = t.openmax = 0; 1227 t.integer = 0; 1228 return snd_interval_refine(constrs_interval(constrs, var), &t); 1229 } 1230 1231 EXPORT_SYMBOL(snd_pcm_hw_constraint_minmax); 1232 1233 static int snd_pcm_hw_rule_list(struct snd_pcm_hw_params *params, 1234 struct snd_pcm_hw_rule *rule) 1235 { 1236 struct snd_pcm_hw_constraint_list *list = rule->private; 1237 return snd_interval_list(hw_param_interval(params, rule->var), list->count, list->list, list->mask); 1238 } 1239 1240 1241 /** 1242 * snd_pcm_hw_constraint_list - apply a list of constraints to a parameter 1243 * @runtime: PCM runtime instance 1244 * @cond: condition bits 1245 * @var: hw_params variable to apply the list constraint 1246 * @l: list 1247 * 1248 * Apply the list of constraints to an interval parameter. 1249 */ 1250 int snd_pcm_hw_constraint_list(struct snd_pcm_runtime *runtime, 1251 unsigned int cond, 1252 snd_pcm_hw_param_t var, 1253 const struct snd_pcm_hw_constraint_list *l) 1254 { 1255 return snd_pcm_hw_rule_add(runtime, cond, var, 1256 snd_pcm_hw_rule_list, (void *)l, 1257 var, -1); 1258 } 1259 1260 EXPORT_SYMBOL(snd_pcm_hw_constraint_list); 1261 1262 static int snd_pcm_hw_rule_ratnums(struct snd_pcm_hw_params *params, 1263 struct snd_pcm_hw_rule *rule) 1264 { 1265 struct snd_pcm_hw_constraint_ratnums *r = rule->private; 1266 unsigned int num = 0, den = 0; 1267 int err; 1268 err = snd_interval_ratnum(hw_param_interval(params, rule->var), 1269 r->nrats, r->rats, &num, &den); 1270 if (err >= 0 && den && rule->var == SNDRV_PCM_HW_PARAM_RATE) { 1271 params->rate_num = num; 1272 params->rate_den = den; 1273 } 1274 return err; 1275 } 1276 1277 /** 1278 * snd_pcm_hw_constraint_ratnums - apply ratnums constraint to a parameter 1279 * @runtime: PCM runtime instance 1280 * @cond: condition bits 1281 * @var: hw_params variable to apply the ratnums constraint 1282 * @r: struct snd_ratnums constriants 1283 */ 1284 int snd_pcm_hw_constraint_ratnums(struct snd_pcm_runtime *runtime, 1285 unsigned int cond, 1286 snd_pcm_hw_param_t var, 1287 struct snd_pcm_hw_constraint_ratnums *r) 1288 { 1289 return snd_pcm_hw_rule_add(runtime, cond, var, 1290 snd_pcm_hw_rule_ratnums, r, 1291 var, -1); 1292 } 1293 1294 EXPORT_SYMBOL(snd_pcm_hw_constraint_ratnums); 1295 1296 static int snd_pcm_hw_rule_ratdens(struct snd_pcm_hw_params *params, 1297 struct snd_pcm_hw_rule *rule) 1298 { 1299 struct snd_pcm_hw_constraint_ratdens *r = rule->private; 1300 unsigned int num = 0, den = 0; 1301 int err = snd_interval_ratden(hw_param_interval(params, rule->var), 1302 r->nrats, r->rats, &num, &den); 1303 if (err >= 0 && den && rule->var == SNDRV_PCM_HW_PARAM_RATE) { 1304 params->rate_num = num; 1305 params->rate_den = den; 1306 } 1307 return err; 1308 } 1309 1310 /** 1311 * snd_pcm_hw_constraint_ratdens - apply ratdens constraint to a parameter 1312 * @runtime: PCM runtime instance 1313 * @cond: condition bits 1314 * @var: hw_params variable to apply the ratdens constraint 1315 * @r: struct snd_ratdens constriants 1316 */ 1317 int snd_pcm_hw_constraint_ratdens(struct snd_pcm_runtime *runtime, 1318 unsigned int cond, 1319 snd_pcm_hw_param_t var, 1320 struct snd_pcm_hw_constraint_ratdens *r) 1321 { 1322 return snd_pcm_hw_rule_add(runtime, cond, var, 1323 snd_pcm_hw_rule_ratdens, r, 1324 var, -1); 1325 } 1326 1327 EXPORT_SYMBOL(snd_pcm_hw_constraint_ratdens); 1328 1329 static int snd_pcm_hw_rule_msbits(struct snd_pcm_hw_params *params, 1330 struct snd_pcm_hw_rule *rule) 1331 { 1332 unsigned int l = (unsigned long) rule->private; 1333 int width = l & 0xffff; 1334 unsigned int msbits = l >> 16; 1335 struct snd_interval *i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS); 1336 if (snd_interval_single(i) && snd_interval_value(i) == width) 1337 params->msbits = msbits; 1338 return 0; 1339 } 1340 1341 /** 1342 * snd_pcm_hw_constraint_msbits - add a hw constraint msbits rule 1343 * @runtime: PCM runtime instance 1344 * @cond: condition bits 1345 * @width: sample bits width 1346 * @msbits: msbits width 1347 */ 1348 int snd_pcm_hw_constraint_msbits(struct snd_pcm_runtime *runtime, 1349 unsigned int cond, 1350 unsigned int width, 1351 unsigned int msbits) 1352 { 1353 unsigned long l = (msbits << 16) | width; 1354 return snd_pcm_hw_rule_add(runtime, cond, -1, 1355 snd_pcm_hw_rule_msbits, 1356 (void*) l, 1357 SNDRV_PCM_HW_PARAM_SAMPLE_BITS, -1); 1358 } 1359 1360 EXPORT_SYMBOL(snd_pcm_hw_constraint_msbits); 1361 1362 static int snd_pcm_hw_rule_step(struct snd_pcm_hw_params *params, 1363 struct snd_pcm_hw_rule *rule) 1364 { 1365 unsigned long step = (unsigned long) rule->private; 1366 return snd_interval_step(hw_param_interval(params, rule->var), 0, step); 1367 } 1368 1369 /** 1370 * snd_pcm_hw_constraint_step - add a hw constraint step rule 1371 * @runtime: PCM runtime instance 1372 * @cond: condition bits 1373 * @var: hw_params variable to apply the step constraint 1374 * @step: step size 1375 */ 1376 int snd_pcm_hw_constraint_step(struct snd_pcm_runtime *runtime, 1377 unsigned int cond, 1378 snd_pcm_hw_param_t var, 1379 unsigned long step) 1380 { 1381 return snd_pcm_hw_rule_add(runtime, cond, var, 1382 snd_pcm_hw_rule_step, (void *) step, 1383 var, -1); 1384 } 1385 1386 EXPORT_SYMBOL(snd_pcm_hw_constraint_step); 1387 1388 static int snd_pcm_hw_rule_pow2(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule) 1389 { 1390 static unsigned int pow2_sizes[] = { 1391 1<<0, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7, 1392 1<<8, 1<<9, 1<<10, 1<<11, 1<<12, 1<<13, 1<<14, 1<<15, 1393 1<<16, 1<<17, 1<<18, 1<<19, 1<<20, 1<<21, 1<<22, 1<<23, 1394 1<<24, 1<<25, 1<<26, 1<<27, 1<<28, 1<<29, 1<<30 1395 }; 1396 return snd_interval_list(hw_param_interval(params, rule->var), 1397 ARRAY_SIZE(pow2_sizes), pow2_sizes, 0); 1398 } 1399 1400 /** 1401 * snd_pcm_hw_constraint_pow2 - add a hw constraint power-of-2 rule 1402 * @runtime: PCM runtime instance 1403 * @cond: condition bits 1404 * @var: hw_params variable to apply the power-of-2 constraint 1405 */ 1406 int snd_pcm_hw_constraint_pow2(struct snd_pcm_runtime *runtime, 1407 unsigned int cond, 1408 snd_pcm_hw_param_t var) 1409 { 1410 return snd_pcm_hw_rule_add(runtime, cond, var, 1411 snd_pcm_hw_rule_pow2, NULL, 1412 var, -1); 1413 } 1414 1415 EXPORT_SYMBOL(snd_pcm_hw_constraint_pow2); 1416 1417 static int snd_pcm_hw_rule_noresample_func(struct snd_pcm_hw_params *params, 1418 struct snd_pcm_hw_rule *rule) 1419 { 1420 unsigned int base_rate = (unsigned int)(uintptr_t)rule->private; 1421 struct snd_interval *rate; 1422 1423 rate = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE); 1424 return snd_interval_list(rate, 1, &base_rate, 0); 1425 } 1426 1427 /** 1428 * snd_pcm_hw_rule_noresample - add a rule to allow disabling hw resampling 1429 * @runtime: PCM runtime instance 1430 * @base_rate: the rate at which the hardware does not resample 1431 */ 1432 int snd_pcm_hw_rule_noresample(struct snd_pcm_runtime *runtime, 1433 unsigned int base_rate) 1434 { 1435 return snd_pcm_hw_rule_add(runtime, SNDRV_PCM_HW_PARAMS_NORESAMPLE, 1436 SNDRV_PCM_HW_PARAM_RATE, 1437 snd_pcm_hw_rule_noresample_func, 1438 (void *)(uintptr_t)base_rate, 1439 SNDRV_PCM_HW_PARAM_RATE, -1); 1440 } 1441 EXPORT_SYMBOL(snd_pcm_hw_rule_noresample); 1442 1443 static void _snd_pcm_hw_param_any(struct snd_pcm_hw_params *params, 1444 snd_pcm_hw_param_t var) 1445 { 1446 if (hw_is_mask(var)) { 1447 snd_mask_any(hw_param_mask(params, var)); 1448 params->cmask |= 1 << var; 1449 params->rmask |= 1 << var; 1450 return; 1451 } 1452 if (hw_is_interval(var)) { 1453 snd_interval_any(hw_param_interval(params, var)); 1454 params->cmask |= 1 << var; 1455 params->rmask |= 1 << var; 1456 return; 1457 } 1458 snd_BUG(); 1459 } 1460 1461 void _snd_pcm_hw_params_any(struct snd_pcm_hw_params *params) 1462 { 1463 unsigned int k; 1464 memset(params, 0, sizeof(*params)); 1465 for (k = SNDRV_PCM_HW_PARAM_FIRST_MASK; k <= SNDRV_PCM_HW_PARAM_LAST_MASK; k++) 1466 _snd_pcm_hw_param_any(params, k); 1467 for (k = SNDRV_PCM_HW_PARAM_FIRST_INTERVAL; k <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL; k++) 1468 _snd_pcm_hw_param_any(params, k); 1469 params->info = ~0U; 1470 } 1471 1472 EXPORT_SYMBOL(_snd_pcm_hw_params_any); 1473 1474 /** 1475 * snd_pcm_hw_param_value - return @params field @var value 1476 * @params: the hw_params instance 1477 * @var: parameter to retrieve 1478 * @dir: pointer to the direction (-1,0,1) or %NULL 1479 * 1480 * Return the value for field @var if it's fixed in configuration space 1481 * defined by @params. Return -%EINVAL otherwise. 1482 */ 1483 int snd_pcm_hw_param_value(const struct snd_pcm_hw_params *params, 1484 snd_pcm_hw_param_t var, int *dir) 1485 { 1486 if (hw_is_mask(var)) { 1487 const struct snd_mask *mask = hw_param_mask_c(params, var); 1488 if (!snd_mask_single(mask)) 1489 return -EINVAL; 1490 if (dir) 1491 *dir = 0; 1492 return snd_mask_value(mask); 1493 } 1494 if (hw_is_interval(var)) { 1495 const struct snd_interval *i = hw_param_interval_c(params, var); 1496 if (!snd_interval_single(i)) 1497 return -EINVAL; 1498 if (dir) 1499 *dir = i->openmin; 1500 return snd_interval_value(i); 1501 } 1502 return -EINVAL; 1503 } 1504 1505 EXPORT_SYMBOL(snd_pcm_hw_param_value); 1506 1507 void _snd_pcm_hw_param_setempty(struct snd_pcm_hw_params *params, 1508 snd_pcm_hw_param_t var) 1509 { 1510 if (hw_is_mask(var)) { 1511 snd_mask_none(hw_param_mask(params, var)); 1512 params->cmask |= 1 << var; 1513 params->rmask |= 1 << var; 1514 } else if (hw_is_interval(var)) { 1515 snd_interval_none(hw_param_interval(params, var)); 1516 params->cmask |= 1 << var; 1517 params->rmask |= 1 << var; 1518 } else { 1519 snd_BUG(); 1520 } 1521 } 1522 1523 EXPORT_SYMBOL(_snd_pcm_hw_param_setempty); 1524 1525 static int _snd_pcm_hw_param_first(struct snd_pcm_hw_params *params, 1526 snd_pcm_hw_param_t var) 1527 { 1528 int changed; 1529 if (hw_is_mask(var)) 1530 changed = snd_mask_refine_first(hw_param_mask(params, var)); 1531 else if (hw_is_interval(var)) 1532 changed = snd_interval_refine_first(hw_param_interval(params, var)); 1533 else 1534 return -EINVAL; 1535 if (changed) { 1536 params->cmask |= 1 << var; 1537 params->rmask |= 1 << var; 1538 } 1539 return changed; 1540 } 1541 1542 1543 /** 1544 * snd_pcm_hw_param_first - refine config space and return minimum value 1545 * @pcm: PCM instance 1546 * @params: the hw_params instance 1547 * @var: parameter to retrieve 1548 * @dir: pointer to the direction (-1,0,1) or %NULL 1549 * 1550 * Inside configuration space defined by @params remove from @var all 1551 * values > minimum. Reduce configuration space accordingly. 1552 * Return the minimum. 1553 */ 1554 int snd_pcm_hw_param_first(struct snd_pcm_substream *pcm, 1555 struct snd_pcm_hw_params *params, 1556 snd_pcm_hw_param_t var, int *dir) 1557 { 1558 int changed = _snd_pcm_hw_param_first(params, var); 1559 if (changed < 0) 1560 return changed; 1561 if (params->rmask) { 1562 int err = snd_pcm_hw_refine(pcm, params); 1563 if (snd_BUG_ON(err < 0)) 1564 return err; 1565 } 1566 return snd_pcm_hw_param_value(params, var, dir); 1567 } 1568 1569 EXPORT_SYMBOL(snd_pcm_hw_param_first); 1570 1571 static int _snd_pcm_hw_param_last(struct snd_pcm_hw_params *params, 1572 snd_pcm_hw_param_t var) 1573 { 1574 int changed; 1575 if (hw_is_mask(var)) 1576 changed = snd_mask_refine_last(hw_param_mask(params, var)); 1577 else if (hw_is_interval(var)) 1578 changed = snd_interval_refine_last(hw_param_interval(params, var)); 1579 else 1580 return -EINVAL; 1581 if (changed) { 1582 params->cmask |= 1 << var; 1583 params->rmask |= 1 << var; 1584 } 1585 return changed; 1586 } 1587 1588 1589 /** 1590 * snd_pcm_hw_param_last - refine config space and return maximum value 1591 * @pcm: PCM instance 1592 * @params: the hw_params instance 1593 * @var: parameter to retrieve 1594 * @dir: pointer to the direction (-1,0,1) or %NULL 1595 * 1596 * Inside configuration space defined by @params remove from @var all 1597 * values < maximum. Reduce configuration space accordingly. 1598 * Return the maximum. 1599 */ 1600 int snd_pcm_hw_param_last(struct snd_pcm_substream *pcm, 1601 struct snd_pcm_hw_params *params, 1602 snd_pcm_hw_param_t var, int *dir) 1603 { 1604 int changed = _snd_pcm_hw_param_last(params, var); 1605 if (changed < 0) 1606 return changed; 1607 if (params->rmask) { 1608 int err = snd_pcm_hw_refine(pcm, params); 1609 if (snd_BUG_ON(err < 0)) 1610 return err; 1611 } 1612 return snd_pcm_hw_param_value(params, var, dir); 1613 } 1614 1615 EXPORT_SYMBOL(snd_pcm_hw_param_last); 1616 1617 /** 1618 * snd_pcm_hw_param_choose - choose a configuration defined by @params 1619 * @pcm: PCM instance 1620 * @params: the hw_params instance 1621 * 1622 * Choose one configuration from configuration space defined by @params. 1623 * The configuration chosen is that obtained fixing in this order: 1624 * first access, first format, first subformat, min channels, 1625 * min rate, min period time, max buffer size, min tick time 1626 */ 1627 int snd_pcm_hw_params_choose(struct snd_pcm_substream *pcm, 1628 struct snd_pcm_hw_params *params) 1629 { 1630 static int vars[] = { 1631 SNDRV_PCM_HW_PARAM_ACCESS, 1632 SNDRV_PCM_HW_PARAM_FORMAT, 1633 SNDRV_PCM_HW_PARAM_SUBFORMAT, 1634 SNDRV_PCM_HW_PARAM_CHANNELS, 1635 SNDRV_PCM_HW_PARAM_RATE, 1636 SNDRV_PCM_HW_PARAM_PERIOD_TIME, 1637 SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 1638 SNDRV_PCM_HW_PARAM_TICK_TIME, 1639 -1 1640 }; 1641 int err, *v; 1642 1643 for (v = vars; *v != -1; v++) { 1644 if (*v != SNDRV_PCM_HW_PARAM_BUFFER_SIZE) 1645 err = snd_pcm_hw_param_first(pcm, params, *v, NULL); 1646 else 1647 err = snd_pcm_hw_param_last(pcm, params, *v, NULL); 1648 if (snd_BUG_ON(err < 0)) 1649 return err; 1650 } 1651 return 0; 1652 } 1653 1654 static int snd_pcm_lib_ioctl_reset(struct snd_pcm_substream *substream, 1655 void *arg) 1656 { 1657 struct snd_pcm_runtime *runtime = substream->runtime; 1658 unsigned long flags; 1659 snd_pcm_stream_lock_irqsave(substream, flags); 1660 if (snd_pcm_running(substream) && 1661 snd_pcm_update_hw_ptr(substream) >= 0) 1662 runtime->status->hw_ptr %= runtime->buffer_size; 1663 else 1664 runtime->status->hw_ptr = 0; 1665 snd_pcm_stream_unlock_irqrestore(substream, flags); 1666 return 0; 1667 } 1668 1669 static int snd_pcm_lib_ioctl_channel_info(struct snd_pcm_substream *substream, 1670 void *arg) 1671 { 1672 struct snd_pcm_channel_info *info = arg; 1673 struct snd_pcm_runtime *runtime = substream->runtime; 1674 int width; 1675 if (!(runtime->info & SNDRV_PCM_INFO_MMAP)) { 1676 info->offset = -1; 1677 return 0; 1678 } 1679 width = snd_pcm_format_physical_width(runtime->format); 1680 if (width < 0) 1681 return width; 1682 info->offset = 0; 1683 switch (runtime->access) { 1684 case SNDRV_PCM_ACCESS_MMAP_INTERLEAVED: 1685 case SNDRV_PCM_ACCESS_RW_INTERLEAVED: 1686 info->first = info->channel * width; 1687 info->step = runtime->channels * width; 1688 break; 1689 case SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED: 1690 case SNDRV_PCM_ACCESS_RW_NONINTERLEAVED: 1691 { 1692 size_t size = runtime->dma_bytes / runtime->channels; 1693 info->first = info->channel * size * 8; 1694 info->step = width; 1695 break; 1696 } 1697 default: 1698 snd_BUG(); 1699 break; 1700 } 1701 return 0; 1702 } 1703 1704 static int snd_pcm_lib_ioctl_fifo_size(struct snd_pcm_substream *substream, 1705 void *arg) 1706 { 1707 struct snd_pcm_hw_params *params = arg; 1708 snd_pcm_format_t format; 1709 int channels, width; 1710 1711 params->fifo_size = substream->runtime->hw.fifo_size; 1712 if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_FIFO_IN_FRAMES)) { 1713 format = params_format(params); 1714 channels = params_channels(params); 1715 width = snd_pcm_format_physical_width(format); 1716 params->fifo_size /= width * channels; 1717 } 1718 return 0; 1719 } 1720 1721 /** 1722 * snd_pcm_lib_ioctl - a generic PCM ioctl callback 1723 * @substream: the pcm substream instance 1724 * @cmd: ioctl command 1725 * @arg: ioctl argument 1726 * 1727 * Processes the generic ioctl commands for PCM. 1728 * Can be passed as the ioctl callback for PCM ops. 1729 * 1730 * Returns zero if successful, or a negative error code on failure. 1731 */ 1732 int snd_pcm_lib_ioctl(struct snd_pcm_substream *substream, 1733 unsigned int cmd, void *arg) 1734 { 1735 switch (cmd) { 1736 case SNDRV_PCM_IOCTL1_INFO: 1737 return 0; 1738 case SNDRV_PCM_IOCTL1_RESET: 1739 return snd_pcm_lib_ioctl_reset(substream, arg); 1740 case SNDRV_PCM_IOCTL1_CHANNEL_INFO: 1741 return snd_pcm_lib_ioctl_channel_info(substream, arg); 1742 case SNDRV_PCM_IOCTL1_FIFO_SIZE: 1743 return snd_pcm_lib_ioctl_fifo_size(substream, arg); 1744 } 1745 return -ENXIO; 1746 } 1747 1748 EXPORT_SYMBOL(snd_pcm_lib_ioctl); 1749 1750 /** 1751 * snd_pcm_period_elapsed - update the pcm status for the next period 1752 * @substream: the pcm substream instance 1753 * 1754 * This function is called from the interrupt handler when the 1755 * PCM has processed the period size. It will update the current 1756 * pointer, wake up sleepers, etc. 1757 * 1758 * Even if more than one periods have elapsed since the last call, you 1759 * have to call this only once. 1760 */ 1761 void snd_pcm_period_elapsed(struct snd_pcm_substream *substream) 1762 { 1763 struct snd_pcm_runtime *runtime; 1764 unsigned long flags; 1765 1766 if (PCM_RUNTIME_CHECK(substream)) 1767 return; 1768 runtime = substream->runtime; 1769 1770 if (runtime->transfer_ack_begin) 1771 runtime->transfer_ack_begin(substream); 1772 1773 snd_pcm_stream_lock_irqsave(substream, flags); 1774 if (!snd_pcm_running(substream) || 1775 snd_pcm_update_hw_ptr0(substream, 1) < 0) 1776 goto _end; 1777 1778 if (substream->timer_running) 1779 snd_timer_interrupt(substream->timer, 1); 1780 _end: 1781 snd_pcm_stream_unlock_irqrestore(substream, flags); 1782 if (runtime->transfer_ack_end) 1783 runtime->transfer_ack_end(substream); 1784 kill_fasync(&runtime->fasync, SIGIO, POLL_IN); 1785 } 1786 1787 EXPORT_SYMBOL(snd_pcm_period_elapsed); 1788 1789 /* 1790 * Wait until avail_min data becomes available 1791 * Returns a negative error code if any error occurs during operation. 1792 * The available space is stored on availp. When err = 0 and avail = 0 1793 * on the capture stream, it indicates the stream is in DRAINING state. 1794 */ 1795 static int wait_for_avail(struct snd_pcm_substream *substream, 1796 snd_pcm_uframes_t *availp) 1797 { 1798 struct snd_pcm_runtime *runtime = substream->runtime; 1799 int is_playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 1800 wait_queue_t wait; 1801 int err = 0; 1802 snd_pcm_uframes_t avail = 0; 1803 long wait_time, tout; 1804 1805 init_waitqueue_entry(&wait, current); 1806 set_current_state(TASK_INTERRUPTIBLE); 1807 add_wait_queue(&runtime->tsleep, &wait); 1808 1809 if (runtime->no_period_wakeup) 1810 wait_time = MAX_SCHEDULE_TIMEOUT; 1811 else { 1812 wait_time = 10; 1813 if (runtime->rate) { 1814 long t = runtime->period_size * 2 / runtime->rate; 1815 wait_time = max(t, wait_time); 1816 } 1817 wait_time = msecs_to_jiffies(wait_time * 1000); 1818 } 1819 1820 for (;;) { 1821 if (signal_pending(current)) { 1822 err = -ERESTARTSYS; 1823 break; 1824 } 1825 1826 /* 1827 * We need to check if space became available already 1828 * (and thus the wakeup happened already) first to close 1829 * the race of space already having become available. 1830 * This check must happen after been added to the waitqueue 1831 * and having current state be INTERRUPTIBLE. 1832 */ 1833 if (is_playback) 1834 avail = snd_pcm_playback_avail(runtime); 1835 else 1836 avail = snd_pcm_capture_avail(runtime); 1837 if (avail >= runtime->twake) 1838 break; 1839 snd_pcm_stream_unlock_irq(substream); 1840 1841 tout = schedule_timeout(wait_time); 1842 1843 snd_pcm_stream_lock_irq(substream); 1844 set_current_state(TASK_INTERRUPTIBLE); 1845 switch (runtime->status->state) { 1846 case SNDRV_PCM_STATE_SUSPENDED: 1847 err = -ESTRPIPE; 1848 goto _endloop; 1849 case SNDRV_PCM_STATE_XRUN: 1850 err = -EPIPE; 1851 goto _endloop; 1852 case SNDRV_PCM_STATE_DRAINING: 1853 if (is_playback) 1854 err = -EPIPE; 1855 else 1856 avail = 0; /* indicate draining */ 1857 goto _endloop; 1858 case SNDRV_PCM_STATE_OPEN: 1859 case SNDRV_PCM_STATE_SETUP: 1860 case SNDRV_PCM_STATE_DISCONNECTED: 1861 err = -EBADFD; 1862 goto _endloop; 1863 } 1864 if (!tout) { 1865 snd_printd("%s write error (DMA or IRQ trouble?)\n", 1866 is_playback ? "playback" : "capture"); 1867 err = -EIO; 1868 break; 1869 } 1870 } 1871 _endloop: 1872 set_current_state(TASK_RUNNING); 1873 remove_wait_queue(&runtime->tsleep, &wait); 1874 *availp = avail; 1875 return err; 1876 } 1877 1878 static int snd_pcm_lib_write_transfer(struct snd_pcm_substream *substream, 1879 unsigned int hwoff, 1880 unsigned long data, unsigned int off, 1881 snd_pcm_uframes_t frames) 1882 { 1883 struct snd_pcm_runtime *runtime = substream->runtime; 1884 int err; 1885 char __user *buf = (char __user *) data + frames_to_bytes(runtime, off); 1886 if (substream->ops->copy) { 1887 if ((err = substream->ops->copy(substream, -1, hwoff, buf, frames)) < 0) 1888 return err; 1889 } else { 1890 char *hwbuf = runtime->dma_area + frames_to_bytes(runtime, hwoff); 1891 if (copy_from_user(hwbuf, buf, frames_to_bytes(runtime, frames))) 1892 return -EFAULT; 1893 } 1894 return 0; 1895 } 1896 1897 typedef int (*transfer_f)(struct snd_pcm_substream *substream, unsigned int hwoff, 1898 unsigned long data, unsigned int off, 1899 snd_pcm_uframes_t size); 1900 1901 static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream, 1902 unsigned long data, 1903 snd_pcm_uframes_t size, 1904 int nonblock, 1905 transfer_f transfer) 1906 { 1907 struct snd_pcm_runtime *runtime = substream->runtime; 1908 snd_pcm_uframes_t xfer = 0; 1909 snd_pcm_uframes_t offset = 0; 1910 snd_pcm_uframes_t avail; 1911 int err = 0; 1912 1913 if (size == 0) 1914 return 0; 1915 1916 snd_pcm_stream_lock_irq(substream); 1917 switch (runtime->status->state) { 1918 case SNDRV_PCM_STATE_PREPARED: 1919 case SNDRV_PCM_STATE_RUNNING: 1920 case SNDRV_PCM_STATE_PAUSED: 1921 break; 1922 case SNDRV_PCM_STATE_XRUN: 1923 err = -EPIPE; 1924 goto _end_unlock; 1925 case SNDRV_PCM_STATE_SUSPENDED: 1926 err = -ESTRPIPE; 1927 goto _end_unlock; 1928 default: 1929 err = -EBADFD; 1930 goto _end_unlock; 1931 } 1932 1933 runtime->twake = runtime->control->avail_min ? : 1; 1934 if (runtime->status->state == SNDRV_PCM_STATE_RUNNING) 1935 snd_pcm_update_hw_ptr(substream); 1936 avail = snd_pcm_playback_avail(runtime); 1937 while (size > 0) { 1938 snd_pcm_uframes_t frames, appl_ptr, appl_ofs; 1939 snd_pcm_uframes_t cont; 1940 if (!avail) { 1941 if (nonblock) { 1942 err = -EAGAIN; 1943 goto _end_unlock; 1944 } 1945 runtime->twake = min_t(snd_pcm_uframes_t, size, 1946 runtime->control->avail_min ? : 1); 1947 err = wait_for_avail(substream, &avail); 1948 if (err < 0) 1949 goto _end_unlock; 1950 } 1951 frames = size > avail ? avail : size; 1952 cont = runtime->buffer_size - runtime->control->appl_ptr % runtime->buffer_size; 1953 if (frames > cont) 1954 frames = cont; 1955 if (snd_BUG_ON(!frames)) { 1956 runtime->twake = 0; 1957 snd_pcm_stream_unlock_irq(substream); 1958 return -EINVAL; 1959 } 1960 appl_ptr = runtime->control->appl_ptr; 1961 appl_ofs = appl_ptr % runtime->buffer_size; 1962 snd_pcm_stream_unlock_irq(substream); 1963 err = transfer(substream, appl_ofs, data, offset, frames); 1964 snd_pcm_stream_lock_irq(substream); 1965 if (err < 0) 1966 goto _end_unlock; 1967 switch (runtime->status->state) { 1968 case SNDRV_PCM_STATE_XRUN: 1969 err = -EPIPE; 1970 goto _end_unlock; 1971 case SNDRV_PCM_STATE_SUSPENDED: 1972 err = -ESTRPIPE; 1973 goto _end_unlock; 1974 default: 1975 break; 1976 } 1977 appl_ptr += frames; 1978 if (appl_ptr >= runtime->boundary) 1979 appl_ptr -= runtime->boundary; 1980 runtime->control->appl_ptr = appl_ptr; 1981 if (substream->ops->ack) 1982 substream->ops->ack(substream); 1983 1984 offset += frames; 1985 size -= frames; 1986 xfer += frames; 1987 avail -= frames; 1988 if (runtime->status->state == SNDRV_PCM_STATE_PREPARED && 1989 snd_pcm_playback_hw_avail(runtime) >= (snd_pcm_sframes_t)runtime->start_threshold) { 1990 err = snd_pcm_start(substream); 1991 if (err < 0) 1992 goto _end_unlock; 1993 } 1994 } 1995 _end_unlock: 1996 runtime->twake = 0; 1997 if (xfer > 0 && err >= 0) 1998 snd_pcm_update_state(substream, runtime); 1999 snd_pcm_stream_unlock_irq(substream); 2000 return xfer > 0 ? (snd_pcm_sframes_t)xfer : err; 2001 } 2002 2003 /* sanity-check for read/write methods */ 2004 static int pcm_sanity_check(struct snd_pcm_substream *substream) 2005 { 2006 struct snd_pcm_runtime *runtime; 2007 if (PCM_RUNTIME_CHECK(substream)) 2008 return -ENXIO; 2009 runtime = substream->runtime; 2010 if (snd_BUG_ON(!substream->ops->copy && !runtime->dma_area)) 2011 return -EINVAL; 2012 if (runtime->status->state == SNDRV_PCM_STATE_OPEN) 2013 return -EBADFD; 2014 return 0; 2015 } 2016 2017 snd_pcm_sframes_t snd_pcm_lib_write(struct snd_pcm_substream *substream, const void __user *buf, snd_pcm_uframes_t size) 2018 { 2019 struct snd_pcm_runtime *runtime; 2020 int nonblock; 2021 int err; 2022 2023 err = pcm_sanity_check(substream); 2024 if (err < 0) 2025 return err; 2026 runtime = substream->runtime; 2027 nonblock = !!(substream->f_flags & O_NONBLOCK); 2028 2029 if (runtime->access != SNDRV_PCM_ACCESS_RW_INTERLEAVED && 2030 runtime->channels > 1) 2031 return -EINVAL; 2032 return snd_pcm_lib_write1(substream, (unsigned long)buf, size, nonblock, 2033 snd_pcm_lib_write_transfer); 2034 } 2035 2036 EXPORT_SYMBOL(snd_pcm_lib_write); 2037 2038 static int snd_pcm_lib_writev_transfer(struct snd_pcm_substream *substream, 2039 unsigned int hwoff, 2040 unsigned long data, unsigned int off, 2041 snd_pcm_uframes_t frames) 2042 { 2043 struct snd_pcm_runtime *runtime = substream->runtime; 2044 int err; 2045 void __user **bufs = (void __user **)data; 2046 int channels = runtime->channels; 2047 int c; 2048 if (substream->ops->copy) { 2049 if (snd_BUG_ON(!substream->ops->silence)) 2050 return -EINVAL; 2051 for (c = 0; c < channels; ++c, ++bufs) { 2052 if (*bufs == NULL) { 2053 if ((err = substream->ops->silence(substream, c, hwoff, frames)) < 0) 2054 return err; 2055 } else { 2056 char __user *buf = *bufs + samples_to_bytes(runtime, off); 2057 if ((err = substream->ops->copy(substream, c, hwoff, buf, frames)) < 0) 2058 return err; 2059 } 2060 } 2061 } else { 2062 /* default transfer behaviour */ 2063 size_t dma_csize = runtime->dma_bytes / channels; 2064 for (c = 0; c < channels; ++c, ++bufs) { 2065 char *hwbuf = runtime->dma_area + (c * dma_csize) + samples_to_bytes(runtime, hwoff); 2066 if (*bufs == NULL) { 2067 snd_pcm_format_set_silence(runtime->format, hwbuf, frames); 2068 } else { 2069 char __user *buf = *bufs + samples_to_bytes(runtime, off); 2070 if (copy_from_user(hwbuf, buf, samples_to_bytes(runtime, frames))) 2071 return -EFAULT; 2072 } 2073 } 2074 } 2075 return 0; 2076 } 2077 2078 snd_pcm_sframes_t snd_pcm_lib_writev(struct snd_pcm_substream *substream, 2079 void __user **bufs, 2080 snd_pcm_uframes_t frames) 2081 { 2082 struct snd_pcm_runtime *runtime; 2083 int nonblock; 2084 int err; 2085 2086 err = pcm_sanity_check(substream); 2087 if (err < 0) 2088 return err; 2089 runtime = substream->runtime; 2090 nonblock = !!(substream->f_flags & O_NONBLOCK); 2091 2092 if (runtime->access != SNDRV_PCM_ACCESS_RW_NONINTERLEAVED) 2093 return -EINVAL; 2094 return snd_pcm_lib_write1(substream, (unsigned long)bufs, frames, 2095 nonblock, snd_pcm_lib_writev_transfer); 2096 } 2097 2098 EXPORT_SYMBOL(snd_pcm_lib_writev); 2099 2100 static int snd_pcm_lib_read_transfer(struct snd_pcm_substream *substream, 2101 unsigned int hwoff, 2102 unsigned long data, unsigned int off, 2103 snd_pcm_uframes_t frames) 2104 { 2105 struct snd_pcm_runtime *runtime = substream->runtime; 2106 int err; 2107 char __user *buf = (char __user *) data + frames_to_bytes(runtime, off); 2108 if (substream->ops->copy) { 2109 if ((err = substream->ops->copy(substream, -1, hwoff, buf, frames)) < 0) 2110 return err; 2111 } else { 2112 char *hwbuf = runtime->dma_area + frames_to_bytes(runtime, hwoff); 2113 if (copy_to_user(buf, hwbuf, frames_to_bytes(runtime, frames))) 2114 return -EFAULT; 2115 } 2116 return 0; 2117 } 2118 2119 static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream, 2120 unsigned long data, 2121 snd_pcm_uframes_t size, 2122 int nonblock, 2123 transfer_f transfer) 2124 { 2125 struct snd_pcm_runtime *runtime = substream->runtime; 2126 snd_pcm_uframes_t xfer = 0; 2127 snd_pcm_uframes_t offset = 0; 2128 snd_pcm_uframes_t avail; 2129 int err = 0; 2130 2131 if (size == 0) 2132 return 0; 2133 2134 snd_pcm_stream_lock_irq(substream); 2135 switch (runtime->status->state) { 2136 case SNDRV_PCM_STATE_PREPARED: 2137 if (size >= runtime->start_threshold) { 2138 err = snd_pcm_start(substream); 2139 if (err < 0) 2140 goto _end_unlock; 2141 } 2142 break; 2143 case SNDRV_PCM_STATE_DRAINING: 2144 case SNDRV_PCM_STATE_RUNNING: 2145 case SNDRV_PCM_STATE_PAUSED: 2146 break; 2147 case SNDRV_PCM_STATE_XRUN: 2148 err = -EPIPE; 2149 goto _end_unlock; 2150 case SNDRV_PCM_STATE_SUSPENDED: 2151 err = -ESTRPIPE; 2152 goto _end_unlock; 2153 default: 2154 err = -EBADFD; 2155 goto _end_unlock; 2156 } 2157 2158 runtime->twake = runtime->control->avail_min ? : 1; 2159 if (runtime->status->state == SNDRV_PCM_STATE_RUNNING) 2160 snd_pcm_update_hw_ptr(substream); 2161 avail = snd_pcm_capture_avail(runtime); 2162 while (size > 0) { 2163 snd_pcm_uframes_t frames, appl_ptr, appl_ofs; 2164 snd_pcm_uframes_t cont; 2165 if (!avail) { 2166 if (runtime->status->state == 2167 SNDRV_PCM_STATE_DRAINING) { 2168 snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP); 2169 goto _end_unlock; 2170 } 2171 if (nonblock) { 2172 err = -EAGAIN; 2173 goto _end_unlock; 2174 } 2175 runtime->twake = min_t(snd_pcm_uframes_t, size, 2176 runtime->control->avail_min ? : 1); 2177 err = wait_for_avail(substream, &avail); 2178 if (err < 0) 2179 goto _end_unlock; 2180 if (!avail) 2181 continue; /* draining */ 2182 } 2183 frames = size > avail ? avail : size; 2184 cont = runtime->buffer_size - runtime->control->appl_ptr % runtime->buffer_size; 2185 if (frames > cont) 2186 frames = cont; 2187 if (snd_BUG_ON(!frames)) { 2188 runtime->twake = 0; 2189 snd_pcm_stream_unlock_irq(substream); 2190 return -EINVAL; 2191 } 2192 appl_ptr = runtime->control->appl_ptr; 2193 appl_ofs = appl_ptr % runtime->buffer_size; 2194 snd_pcm_stream_unlock_irq(substream); 2195 err = transfer(substream, appl_ofs, data, offset, frames); 2196 snd_pcm_stream_lock_irq(substream); 2197 if (err < 0) 2198 goto _end_unlock; 2199 switch (runtime->status->state) { 2200 case SNDRV_PCM_STATE_XRUN: 2201 err = -EPIPE; 2202 goto _end_unlock; 2203 case SNDRV_PCM_STATE_SUSPENDED: 2204 err = -ESTRPIPE; 2205 goto _end_unlock; 2206 default: 2207 break; 2208 } 2209 appl_ptr += frames; 2210 if (appl_ptr >= runtime->boundary) 2211 appl_ptr -= runtime->boundary; 2212 runtime->control->appl_ptr = appl_ptr; 2213 if (substream->ops->ack) 2214 substream->ops->ack(substream); 2215 2216 offset += frames; 2217 size -= frames; 2218 xfer += frames; 2219 avail -= frames; 2220 } 2221 _end_unlock: 2222 runtime->twake = 0; 2223 if (xfer > 0 && err >= 0) 2224 snd_pcm_update_state(substream, runtime); 2225 snd_pcm_stream_unlock_irq(substream); 2226 return xfer > 0 ? (snd_pcm_sframes_t)xfer : err; 2227 } 2228 2229 snd_pcm_sframes_t snd_pcm_lib_read(struct snd_pcm_substream *substream, void __user *buf, snd_pcm_uframes_t size) 2230 { 2231 struct snd_pcm_runtime *runtime; 2232 int nonblock; 2233 int err; 2234 2235 err = pcm_sanity_check(substream); 2236 if (err < 0) 2237 return err; 2238 runtime = substream->runtime; 2239 nonblock = !!(substream->f_flags & O_NONBLOCK); 2240 if (runtime->access != SNDRV_PCM_ACCESS_RW_INTERLEAVED) 2241 return -EINVAL; 2242 return snd_pcm_lib_read1(substream, (unsigned long)buf, size, nonblock, snd_pcm_lib_read_transfer); 2243 } 2244 2245 EXPORT_SYMBOL(snd_pcm_lib_read); 2246 2247 static int snd_pcm_lib_readv_transfer(struct snd_pcm_substream *substream, 2248 unsigned int hwoff, 2249 unsigned long data, unsigned int off, 2250 snd_pcm_uframes_t frames) 2251 { 2252 struct snd_pcm_runtime *runtime = substream->runtime; 2253 int err; 2254 void __user **bufs = (void __user **)data; 2255 int channels = runtime->channels; 2256 int c; 2257 if (substream->ops->copy) { 2258 for (c = 0; c < channels; ++c, ++bufs) { 2259 char __user *buf; 2260 if (*bufs == NULL) 2261 continue; 2262 buf = *bufs + samples_to_bytes(runtime, off); 2263 if ((err = substream->ops->copy(substream, c, hwoff, buf, frames)) < 0) 2264 return err; 2265 } 2266 } else { 2267 snd_pcm_uframes_t dma_csize = runtime->dma_bytes / channels; 2268 for (c = 0; c < channels; ++c, ++bufs) { 2269 char *hwbuf; 2270 char __user *buf; 2271 if (*bufs == NULL) 2272 continue; 2273 2274 hwbuf = runtime->dma_area + (c * dma_csize) + samples_to_bytes(runtime, hwoff); 2275 buf = *bufs + samples_to_bytes(runtime, off); 2276 if (copy_to_user(buf, hwbuf, samples_to_bytes(runtime, frames))) 2277 return -EFAULT; 2278 } 2279 } 2280 return 0; 2281 } 2282 2283 snd_pcm_sframes_t snd_pcm_lib_readv(struct snd_pcm_substream *substream, 2284 void __user **bufs, 2285 snd_pcm_uframes_t frames) 2286 { 2287 struct snd_pcm_runtime *runtime; 2288 int nonblock; 2289 int err; 2290 2291 err = pcm_sanity_check(substream); 2292 if (err < 0) 2293 return err; 2294 runtime = substream->runtime; 2295 if (runtime->status->state == SNDRV_PCM_STATE_OPEN) 2296 return -EBADFD; 2297 2298 nonblock = !!(substream->f_flags & O_NONBLOCK); 2299 if (runtime->access != SNDRV_PCM_ACCESS_RW_NONINTERLEAVED) 2300 return -EINVAL; 2301 return snd_pcm_lib_read1(substream, (unsigned long)bufs, frames, nonblock, snd_pcm_lib_readv_transfer); 2302 } 2303 2304 EXPORT_SYMBOL(snd_pcm_lib_readv); 2305