/contrib/ntp/util/audio-pcm.c

https://bitbucket.org/freebsd/freebsd-head/ · C · 154 lines · 117 code · 22 blank · 15 comment · 28 complexity · 028e7c22173e92157a3ed702a12be492 MD5 · raw file

  1. /*
  2. * audio-pcm.c - Scope out the PCM audio stuff
  3. */
  4. #ifdef HAVE_CONFIG_H
  5. # include <config.h>
  6. #endif
  7. #if defined(HAVE_MACHINE_SOUNDCARD_H) || defined(HAVE_SYS_SOUNDCARD_H)
  8. #include "audio.h"
  9. #include "ntp_stdlib.h"
  10. #include "ntp_syslog.h"
  11. #ifdef HAVE_UNISTD_H
  12. # include <unistd.h>
  13. #endif
  14. #include <stdio.h>
  15. #include "ntp_string.h"
  16. #ifdef HAVE_SYS_IOCTL_H
  17. #include <sys/ioctl.h>
  18. #endif /* HAVE_SYS_IOCTL_H */
  19. #include <fcntl.h>
  20. #ifdef HAVE_MACHINE_SOUNDCARD_H
  21. # include <machine/soundcard.h>
  22. # define PCM_STYLE_SOUND
  23. #else
  24. # ifdef HAVE_SYS_SOUNDCARD_H
  25. # include <sys/soundcard.h>
  26. # define PCM_STYLE_SOUND
  27. # endif
  28. #endif
  29. /*
  30. * Global variables
  31. */
  32. static int ctl_fd; /* audio control file descriptor */
  33. const char *m_names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES ;
  34. void
  35. d_fmt(
  36. unsigned int format
  37. )
  38. {
  39. if (format & AFMT_MU_LAW) printf("MU_LAW ");
  40. if (format & AFMT_A_LAW) printf("A_LAW ");
  41. if (format & AFMT_IMA_ADPCM) printf("IMA_ADPCM ");
  42. if (format & AFMT_U8) printf("U8 ");
  43. if (format & AFMT_S16_LE) printf("S16_LE ");
  44. if (format & AFMT_S16_BE) printf("S16_BE ");
  45. if (format & AFMT_S8) printf("S8 ");
  46. if (format & AFMT_U16_LE) printf("U16_LE ");
  47. if (format & AFMT_U16_BE) printf("U16_BE ");
  48. if (format & AFMT_MPEG) printf("MPEG ");
  49. if (format & AFMT_AC3) printf("AC3 ");
  50. printf("\n");
  51. }
  52. void
  53. d_mixer(
  54. unsigned int mixer
  55. )
  56. {
  57. int i;
  58. int n = 0;
  59. for (i = 0; i < SOUND_MIXER_NRDEVICES; ++i)
  60. if ((1 << i) & mixer) {
  61. if (n)
  62. printf(", ");
  63. printf("%s", m_names[i]);
  64. n = 1;
  65. }
  66. printf("\n");
  67. }
  68. int
  69. main( )
  70. {
  71. int unit = 0; /* device unit (0-3) */
  72. # define AI_DEV "/dev/audio%d"
  73. # define AC_DEV "/dev/mixer%d"
  74. char ai_dev[30];
  75. char ac_dev[30];
  76. struct snd_size s_size;
  77. snd_chan_param s_c_p;
  78. snd_capabilities s_c;
  79. int fd;
  80. int rval;
  81. char *dname = ai_dev; /* device name */
  82. char *actl = ac_dev;
  83. int devmask = 0, recmask = 0, recsrc = 0;
  84. (void)sprintf(ai_dev, AI_DEV, unit);
  85. (void)sprintf(ac_dev, AC_DEV, unit);
  86. /*
  87. * Open audio device. Do not complain if not there.
  88. */
  89. fd = open(dname, O_RDWR | O_NONBLOCK, 0777);
  90. if (fd < 0)
  91. return (fd);
  92. /*
  93. * Open audio control device.
  94. */
  95. ctl_fd = open(actl, O_RDWR);
  96. if (ctl_fd < 0) {
  97. fprintf(stderr, "invalid control device <%s>\n", actl);
  98. close(fd);
  99. return(ctl_fd);
  100. }
  101. printf("input: <%s> %d\n", dname, fd);
  102. printf("control: <%s> %d\n", actl, ctl_fd);
  103. if (ioctl(ctl_fd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1)
  104. printf("SOUND_MIXER_READ_DEVMASK: %s\n", strerror(errno));
  105. if (ioctl(ctl_fd, SOUND_MIXER_READ_RECMASK, &recmask) == -1)
  106. printf("SOUND_MIXER_READ_RECMASK: %s\n", strerror(errno));
  107. if (ioctl(ctl_fd, SOUND_MIXER_READ_RECSRC, &recsrc) == -1)
  108. printf("SOUND_MIXER_READ_RECSRC: %s\n", strerror(errno));
  109. printf("devmask: %#x recmask: %#x recsrc: %#x\n",
  110. devmask, recmask, recsrc);
  111. printf("Devmask: "); d_mixer(devmask);
  112. printf("Recmask: "); d_mixer(recmask);
  113. printf("RecSrc: "); d_mixer(recsrc);
  114. /*
  115. * Set audio device parameters.
  116. */
  117. rval = fd;
  118. if (ioctl(fd, AIOGSIZE, &s_size) == -1)
  119. printf("AIOGSIZE: %s\n", strerror(errno));
  120. else
  121. printf("play_size %d, rec_size %d\n",
  122. s_size.play_size, s_size.rec_size);
  123. if (ioctl(fd, AIOGFMT, &s_c_p) == -1)
  124. printf("AIOGFMT: %s\n", strerror(errno));
  125. else {
  126. printf("play_rate %lu, rec_rate %lu, play_format %#lx, rec_format %#lx\n",
  127. s_c_p.play_rate, s_c_p.rec_rate, s_c_p.play_format, s_c_p.rec_format);
  128. printf("Play format: "); d_fmt(s_c_p.play_format);
  129. printf("Rec format: "); d_fmt(s_c_p.rec_format);
  130. }
  131. }
  132. #endif /* HAVE_{MACHINE_SOUNDCARD,SYS_SOUNDCARD}_H */