Print this page
1031 Minor audioctl save-controls issue with newlines in hardware info
10620 audioctl: don't return failure because of illegal enum value
10617 audiohd: don't create record-source control if there is none


 482                 (void) snprintf(valbuf, sizeof (valbuf), "%s",
 483                     cval.value ? _("on") : _("off"));
 484                 break;
 485 
 486         case MIXT_MONOSLIDER:
 487                 (void) snprintf(valbuf, sizeof (valbuf), "%d",
 488                     cval.value & 0xff);
 489                 break;
 490 
 491         case MIXT_STEREOSLIDER:
 492                 (void) snprintf(valbuf, sizeof (valbuf), "%d:%d",
 493                     (int)AUDIO_CTRL_STEREO_LEFT(cval.value),
 494                     (int)AUDIO_CTRL_STEREO_RIGHT(cval.value));
 495                 break;
 496 
 497         case MIXT_ENUM:
 498                 str = get_enum_str(cinfop, cval.value);
 499                 if (str == NULL) {
 500                         warn(_("Bad enum index %d for control '%s'\n"),
 501                             cval.value, cinfop->ci.extname);
 502                         return (EINVAL);






 503                 }
 504 
 505                 (void) snprintf(valbuf, sizeof (valbuf), "%s", str);
 506                 break;
 507 
 508         default:
 509                 return (0);
 510         }
 511 
 512         /*
 513          * possible control values (range/selection)
 514          */
 515         switch (cinfop->ci.type) {
 516         case MIXT_ONOFF:
 517                 (void) snprintf(selbuf, sizeof (selbuf), _("on,off"));
 518                 break;
 519 
 520         case MIXT_MONOSLIDER:
 521                 (void) snprintf(selbuf, sizeof (selbuf), "%d-%d",
 522                     cinfop->ci.minvalue, cinfop->ci.maxvalue);


 815 
 816                 if ((d->mixer.enabled == 0) && (!verbose))
 817                         continue;
 818 
 819                 if (verbose) {
 820                         msg(_("%s (%s)\n"), d->card.shortname,
 821                             d->mixer.devnode);
 822                 } else {
 823                         msg(_("%s\n"), d->card.shortname);
 824                 }
 825         }
 826 
 827         return (0);
 828 }
 829 
 830 int
 831 do_show_device(int argc, char **argv)
 832 {
 833         int             optc;
 834         char            *devname = NULL;


 835         device_t        *d;
 836 
 837         while ((optc = getopt(argc, argv, "d:v")) != EOF) {
 838                 switch (optc) {
 839                 case 'd':
 840                         devname = optarg;
 841                         break;
 842                 case 'v':
 843                         break;
 844                 default:
 845                         help();
 846                         return (-1);
 847                 }
 848         }
 849         argc -= optind;
 850         argv += optind;
 851         if (argc != 0) {
 852                 help();
 853                 return (-1);
 854         }
 855 
 856         if ((d = find_device(devname)) == NULL) {
 857                 return (ENODEV);
 858         }
 859 
 860         msg(_("Device: %s\n"), d->mixer.devnode);
 861         msg(_("  Name    = %s\n"), d->card.shortname);
 862         msg(_("  Config  = %s\n"), d->card.longname);
 863 
 864         if (strlen(d->card.hw_info)) {
 865                 msg(_("  HW Info = %s"), d->card.hw_info);




 866         }
 867 
 868         return (0);
 869 }
 870 
 871 int
 872 do_show_control(int argc, char **argv)
 873 {
 874         int             optc;
 875         int             rval = 0;
 876         int             verbose = 0;
 877         device_t        *d;
 878         char            *devname = NULL;
 879         int             i;
 880         int             j;
 881         int             rv;
 882         char            *n;
 883         cinfo_t         *cinfop;
 884 
 885         while ((optc = getopt(argc, argv, "d:v")) != EOF) {


 993                 warn(_("No such control: %s\n"), cname);
 994         }
 995 
 996         return (rval);
 997 }
 998 
 999 int
1000 do_save_controls(int argc, char **argv)
1001 {
1002         int             optc;
1003         int             rval = 0;
1004         device_t        *d;
1005         char            *devname = NULL;
1006         char            *fname;
1007         int             i;
1008         int             rv;
1009         cinfo_t         *cinfop;
1010         FILE            *fp;
1011         int             fd;
1012         int             mode;


1013 
1014         mode = O_WRONLY | O_CREAT | O_EXCL;
1015 
1016         while ((optc = getopt(argc, argv, "d:f")) != EOF) {
1017                 switch (optc) {
1018                 case 'd':
1019                         devname = optarg;
1020                         break;
1021                 case 'f':
1022                         mode &= ~O_EXCL;
1023                         mode |= O_TRUNC;
1024                         break;
1025                 default:
1026                         help();
1027                         return (-1);
1028                 }
1029         }
1030         argc -= optind;
1031         argv += optind;
1032 


1039         if ((d = find_device(devname)) == NULL) {
1040                 return (ENODEV);
1041         }
1042 
1043         if ((fd = open(fname, mode, 0666)) < 0) {
1044                 perror(_("Failed to create file"));
1045                 return (errno);
1046         }
1047 
1048         if ((fp = fdopen(fd, "w")) == NULL) {
1049                 perror(_("Unable to open file\n"));
1050                 (void) close(fd);
1051                 (void) unlink(fname);
1052                 return (errno);
1053         }
1054 
1055         (void) fprintf(fp, "# Device: %s\n", d->mixer.devnode);
1056         (void) fprintf(fp, "# Name    = %s\n", d->card.shortname);
1057         (void) fprintf(fp, "# Config  = %s\n", d->card.longname);
1058 
1059         if (strlen(d->card.hw_info)) {
1060                 (void) fprintf(fp, "# HW Info = %s", d->card.hw_info);




1061         }
1062         (void) fprintf(fp, "#\n");
1063 
1064         print_header(fp, 0);
1065 
1066         for (i = 0; i < d->cmax; i++) {
1067                 cinfop = &d->controls[i];
1068                 rv = print_control(fp, d, cinfop, 0);
1069                 rval = rval ? rval : rv;
1070         }
1071 
1072         (void) fclose(fp);
1073 
1074         return (rval);
1075 }
1076 
1077 int
1078 do_load_controls(int argc, char **argv)
1079 {
1080         int     optc;




 482                 (void) snprintf(valbuf, sizeof (valbuf), "%s",
 483                     cval.value ? _("on") : _("off"));
 484                 break;
 485 
 486         case MIXT_MONOSLIDER:
 487                 (void) snprintf(valbuf, sizeof (valbuf), "%d",
 488                     cval.value & 0xff);
 489                 break;
 490 
 491         case MIXT_STEREOSLIDER:
 492                 (void) snprintf(valbuf, sizeof (valbuf), "%d:%d",
 493                     (int)AUDIO_CTRL_STEREO_LEFT(cval.value),
 494                     (int)AUDIO_CTRL_STEREO_RIGHT(cval.value));
 495                 break;
 496 
 497         case MIXT_ENUM:
 498                 str = get_enum_str(cinfop, cval.value);
 499                 if (str == NULL) {
 500                         warn(_("Bad enum index %d for control '%s'\n"),
 501                             cval.value, cinfop->ci.extname);
 502                         /*
 503                          * Apparently the driver gave us bogus data for this
 504                          * control, so we will ignore it.
 505                          *
 506                          * Don't confuse the user by returning an error status.
 507                          */
 508                         return (0);
 509                 }
 510 
 511                 (void) snprintf(valbuf, sizeof (valbuf), "%s", str);
 512                 break;
 513 
 514         default:
 515                 return (0);
 516         }
 517 
 518         /*
 519          * possible control values (range/selection)
 520          */
 521         switch (cinfop->ci.type) {
 522         case MIXT_ONOFF:
 523                 (void) snprintf(selbuf, sizeof (selbuf), _("on,off"));
 524                 break;
 525 
 526         case MIXT_MONOSLIDER:
 527                 (void) snprintf(selbuf, sizeof (selbuf), "%d-%d",
 528                     cinfop->ci.minvalue, cinfop->ci.maxvalue);


 821 
 822                 if ((d->mixer.enabled == 0) && (!verbose))
 823                         continue;
 824 
 825                 if (verbose) {
 826                         msg(_("%s (%s)\n"), d->card.shortname,
 827                             d->mixer.devnode);
 828                 } else {
 829                         msg(_("%s\n"), d->card.shortname);
 830                 }
 831         }
 832 
 833         return (0);
 834 }
 835 
 836 int
 837 do_show_device(int argc, char **argv)
 838 {
 839         int             optc;
 840         char            *devname = NULL;
 841         char            *p, *n;
 842         const char      *m;
 843         device_t        *d;
 844 
 845         while ((optc = getopt(argc, argv, "d:v")) != EOF) {
 846                 switch (optc) {
 847                 case 'd':
 848                         devname = optarg;
 849                         break;
 850                 case 'v':
 851                         break;
 852                 default:
 853                         help();
 854                         return (-1);
 855                 }
 856         }
 857         argc -= optind;
 858         argv += optind;
 859         if (argc != 0) {
 860                 help();
 861                 return (-1);
 862         }
 863 
 864         if ((d = find_device(devname)) == NULL) {
 865                 return (ENODEV);
 866         }
 867 
 868         msg(_("Device: %s\n"), d->mixer.devnode);
 869         msg(_("  Name    = %s\n"), d->card.shortname);
 870         msg(_("  Config  = %s\n"), d->card.longname);
 871 
 872         for (m = "  HW Info = %s\n", p = d->card.hw_info;
 873             p != NULL && strlen(p) != 0;
 874             m = "\t    %s\n", p = n) {
 875                 if ((n = strchr(p, '\n')) != NULL)
 876                         *n++ = '\0';
 877                 msg(_(m), p);
 878         }
 879 
 880         return (0);
 881 }
 882 
 883 int
 884 do_show_control(int argc, char **argv)
 885 {
 886         int             optc;
 887         int             rval = 0;
 888         int             verbose = 0;
 889         device_t        *d;
 890         char            *devname = NULL;
 891         int             i;
 892         int             j;
 893         int             rv;
 894         char            *n;
 895         cinfo_t         *cinfop;
 896 
 897         while ((optc = getopt(argc, argv, "d:v")) != EOF) {


1005                 warn(_("No such control: %s\n"), cname);
1006         }
1007 
1008         return (rval);
1009 }
1010 
1011 int
1012 do_save_controls(int argc, char **argv)
1013 {
1014         int             optc;
1015         int             rval = 0;
1016         device_t        *d;
1017         char            *devname = NULL;
1018         char            *fname;
1019         int             i;
1020         int             rv;
1021         cinfo_t         *cinfop;
1022         FILE            *fp;
1023         int             fd;
1024         int             mode;
1025         char            *p, *n;
1026         const char      *m;
1027 
1028         mode = O_WRONLY | O_CREAT | O_EXCL;
1029 
1030         while ((optc = getopt(argc, argv, "d:f")) != EOF) {
1031                 switch (optc) {
1032                 case 'd':
1033                         devname = optarg;
1034                         break;
1035                 case 'f':
1036                         mode &= ~O_EXCL;
1037                         mode |= O_TRUNC;
1038                         break;
1039                 default:
1040                         help();
1041                         return (-1);
1042                 }
1043         }
1044         argc -= optind;
1045         argv += optind;
1046 


1053         if ((d = find_device(devname)) == NULL) {
1054                 return (ENODEV);
1055         }
1056 
1057         if ((fd = open(fname, mode, 0666)) < 0) {
1058                 perror(_("Failed to create file"));
1059                 return (errno);
1060         }
1061 
1062         if ((fp = fdopen(fd, "w")) == NULL) {
1063                 perror(_("Unable to open file\n"));
1064                 (void) close(fd);
1065                 (void) unlink(fname);
1066                 return (errno);
1067         }
1068 
1069         (void) fprintf(fp, "# Device: %s\n", d->mixer.devnode);
1070         (void) fprintf(fp, "# Name    = %s\n", d->card.shortname);
1071         (void) fprintf(fp, "# Config  = %s\n", d->card.longname);
1072 
1073         for (m = "# HW Info = %s\n", p = d->card.hw_info;
1074             p != NULL && strlen(p) != 0;
1075             m = "#\t    %s\n", p = n) {
1076                 if ((n = strchr(p, '\n')) != NULL)
1077                         *n++ = '\0';
1078                 fprintf(fp, m, p);
1079         }
1080         (void) fprintf(fp, "#\n");
1081 
1082         print_header(fp, 0);
1083 
1084         for (i = 0; i < d->cmax; i++) {
1085                 cinfop = &d->controls[i];
1086                 rv = print_control(fp, d, cinfop, 0);
1087                 rval = rval ? rval : rv;
1088         }
1089 
1090         (void) fclose(fp);
1091 
1092         return (rval);
1093 }
1094 
1095 int
1096 do_load_controls(int argc, char **argv)
1097 {
1098         int     optc;