Annotation of embedaddon/ntp/util/audio-pcm.c, revision 1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>