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 ---