sndstat.c (fb9013f215211f013eccc54786f299e39a1f8773) | sndstat.c (bbca3a75bb412f7106a569b82c616404103be084) |
---|---|
1/*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2005-2009 Ariff Abdullah <ariff@FreeBSD.org> 5 * Copyright (c) 2001 Cameron Grant <cg@FreeBSD.org> 6 * Copyright (c) 2020 The FreeBSD Foundation 7 * All rights reserved. 8 * Copyright (c) 2024 The FreeBSD Foundation --- 378 unchanged lines hidden (view full) --- 387 nvlist_add_number(nv, SNDST_DSPS_INFO_MIN_CHN, min_chn); 388 nvlist_add_number(nv, SNDST_DSPS_INFO_MAX_CHN, max_chn); 389 return (nv); 390} 391 392static int 393sndstat_build_sound4_nvlist(struct snddev_info *d, nvlist_t **dip) 394{ | 1/*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2005-2009 Ariff Abdullah <ariff@FreeBSD.org> 5 * Copyright (c) 2001 Cameron Grant <cg@FreeBSD.org> 6 * Copyright (c) 2020 The FreeBSD Foundation 7 * All rights reserved. 8 * Copyright (c) 2024 The FreeBSD Foundation --- 378 unchanged lines hidden (view full) --- 387 nvlist_add_number(nv, SNDST_DSPS_INFO_MIN_CHN, min_chn); 388 nvlist_add_number(nv, SNDST_DSPS_INFO_MAX_CHN, max_chn); 389 return (nv); 390} 391 392static int 393sndstat_build_sound4_nvlist(struct snddev_info *d, nvlist_t **dip) 394{ |
395 struct pcm_channel *c; 396 struct pcm_feeder *f; 397 struct sbuf sb; |
|
395 uint32_t maxrate, minrate, fmts, minchn, maxchn; | 398 uint32_t maxrate, minrate, fmts, minchn, maxchn; |
396 nvlist_t *di = NULL, *sound4di = NULL, *diinfo = NULL; 397 int err; | 399 nvlist_t *di = NULL, *sound4di = NULL, *diinfo = NULL, *cdi = NULL; 400 int err, nchan; |
398 399 di = nvlist_create(0); 400 if (di == NULL) { 401 err = ENOMEM; 402 goto done; 403 } 404 sound4di = nvlist_create(0); 405 if (sound4di == NULL) { --- 40 unchanged lines hidden (view full) --- 446 } 447 448 nvlist_add_number(sound4di, SNDST_DSPS_SOUND4_UNIT, 449 device_get_unit(d->dev)); // XXX: I want signed integer here 450 nvlist_add_bool( 451 sound4di, SNDST_DSPS_SOUND4_BITPERFECT, d->flags & SD_F_BITPERFECT); 452 nvlist_add_number(sound4di, SNDST_DSPS_SOUND4_PVCHAN, d->pvchancount); 453 nvlist_add_number(sound4di, SNDST_DSPS_SOUND4_RVCHAN, d->rvchancount); | 401 402 di = nvlist_create(0); 403 if (di == NULL) { 404 err = ENOMEM; 405 goto done; 406 } 407 sound4di = nvlist_create(0); 408 if (sound4di == NULL) { --- 40 unchanged lines hidden (view full) --- 449 } 450 451 nvlist_add_number(sound4di, SNDST_DSPS_SOUND4_UNIT, 452 device_get_unit(d->dev)); // XXX: I want signed integer here 453 nvlist_add_bool( 454 sound4di, SNDST_DSPS_SOUND4_BITPERFECT, d->flags & SD_F_BITPERFECT); 455 nvlist_add_number(sound4di, SNDST_DSPS_SOUND4_PVCHAN, d->pvchancount); 456 nvlist_add_number(sound4di, SNDST_DSPS_SOUND4_RVCHAN, d->rvchancount); |
457 458 nchan = 0; 459 CHN_FOREACH(c, d, channels.pcm) { 460 sbuf_new(&sb, NULL, 4096, SBUF_AUTOEXTEND); 461 cdi = nvlist_create(0); 462 if (cdi == NULL) { 463 sbuf_delete(&sb); 464 PCM_RELEASE_QUICK(d); 465 err = ENOMEM; 466 goto done; 467 } 468 469 nvlist_add_string(cdi, SNDST_DSPS_SOUND4_CHAN_NAME, c->name); 470 nvlist_add_string(cdi, SNDST_DSPS_SOUND4_CHAN_PARENTCHAN, 471 c->parentchannel != NULL ? c->parentchannel->name : ""); 472 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_UNIT, nchan++); 473 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_LATENCY, 474 c->latency); 475 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_RATE, c->speed); 476 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_FORMAT, 477 c->format); 478 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_PID, c->pid); 479 nvlist_add_string(cdi, SNDST_DSPS_SOUND4_CHAN_COMM, c->comm); 480 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_INTR, 481 c->interrupts); 482 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_FEEDCNT, 483 c->feedcount); 484 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_XRUNS, c->xruns); 485 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_LEFTVOL, 486 CHN_GETVOLUME(c, SND_VOL_C_PCM, SND_CHN_T_FL)); 487 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_RIGHTVOL, 488 CHN_GETVOLUME(c, SND_VOL_C_PCM, SND_CHN_T_FR)); 489 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_HWBUF_FORMAT, 490 sndbuf_getfmt(c->bufhard)); 491 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_HWBUF_SIZE, 492 sndbuf_getsize(c->bufhard)); 493 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_HWBUF_BLKSZ, 494 sndbuf_getblksz(c->bufhard)); 495 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_HWBUF_BLKCNT, 496 sndbuf_getblkcnt(c->bufhard)); 497 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_HWBUF_FREE, 498 sndbuf_getfree(c->bufhard)); 499 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_HWBUF_READY, 500 sndbuf_getready(c->bufhard)); 501 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_SWBUF_FORMAT, 502 sndbuf_getfmt(c->bufsoft)); 503 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_SWBUF_SIZE, 504 sndbuf_getsize(c->bufsoft)); 505 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_SWBUF_BLKSZ, 506 sndbuf_getblksz(c->bufsoft)); 507 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_SWBUF_BLKCNT, 508 sndbuf_getblkcnt(c->bufsoft)); 509 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_SWBUF_FREE, 510 sndbuf_getfree(c->bufsoft)); 511 nvlist_add_number(cdi, SNDST_DSPS_SOUND4_CHAN_SWBUF_READY, 512 sndbuf_getready(c->bufsoft)); 513 514 sbuf_printf(&sb, "[%s", 515 (c->direction == PCMDIR_REC) ? "hardware" : "userland"); 516 sbuf_printf(&sb, " -> "); 517 f = c->feeder; 518 while (f->source != NULL) 519 f = f->source; 520 while (f != NULL) { 521 sbuf_printf(&sb, "%s", f->class->name); 522 if (f->desc->type == FEEDER_FORMAT) { 523 sbuf_printf(&sb, "(0x%08x -> 0x%08x)", 524 f->desc->in, f->desc->out); 525 } else if (f->desc->type == FEEDER_MATRIX) { 526 sbuf_printf(&sb, "(%d.%d -> %d.%d)", 527 AFMT_CHANNEL(f->desc->in) - 528 AFMT_EXTCHANNEL(f->desc->in), 529 AFMT_EXTCHANNEL(f->desc->in), 530 AFMT_CHANNEL(f->desc->out) - 531 AFMT_EXTCHANNEL(f->desc->out), 532 AFMT_EXTCHANNEL(f->desc->out)); 533 } else if (f->desc->type == FEEDER_RATE) { 534 sbuf_printf(&sb, 535 "(0x%08x q:%d %d -> %d)", 536 f->desc->out, 537 FEEDER_GET(f, FEEDRATE_QUALITY), 538 FEEDER_GET(f, FEEDRATE_SRC), 539 FEEDER_GET(f, FEEDRATE_DST)); 540 } else { 541 sbuf_printf(&sb, "(0x%08x)", 542 f->desc->out); 543 } 544 sbuf_printf(&sb, " -> "); 545 f = f->parent; 546 } 547 sbuf_printf(&sb, "%s]", 548 (c->direction == PCMDIR_REC) ? "userland" : "hardware"); 549 550 sbuf_finish(&sb); 551 nvlist_add_string(cdi, SNDST_DSPS_SOUND4_CHAN_FEEDERCHAIN, 552 sbuf_data(&sb)); 553 sbuf_delete(&sb); 554 555 nvlist_append_nvlist_array(sound4di, 556 SNDST_DSPS_SOUND4_CHAN_INFO, cdi); 557 nvlist_destroy(cdi); 558 err = nvlist_error(sound4di); 559 if (err) { 560 PCM_RELEASE_QUICK(d); 561 goto done; 562 } 563 } |
|
454 nvlist_move_nvlist(di, SNDST_DSPS_PROVIDER_INFO, sound4di); 455 sound4di = NULL; | 564 nvlist_move_nvlist(di, SNDST_DSPS_PROVIDER_INFO, sound4di); 565 sound4di = NULL; |
566 |
|
456 PCM_RELEASE_QUICK(d); 457 nvlist_add_string(di, SNDST_DSPS_PROVIDER, SNDST_DSPS_SOUND4_PROVIDER); 458 459 err = nvlist_error(di); 460 if (err) 461 goto done; 462 463 *dip = di; --- 850 unchanged lines hidden --- | 567 PCM_RELEASE_QUICK(d); 568 nvlist_add_string(di, SNDST_DSPS_PROVIDER, SNDST_DSPS_SOUND4_PROVIDER); 569 570 err = nvlist_error(di); 571 if (err) 572 goto done; 573 574 *dip = di; --- 850 unchanged lines hidden --- |