audio_utils_sunos.c

来自「CMU大名鼎鼎的SPHINX-3大词汇量连续语音识别系统」· C语言 代码 · 共 277 行

C
277
字号
/* ==================================================================== * Copyright (c) 1999-2001 Carnegie Mellon University.  All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * This work was supported in part by funding from the Defense Advanced  * Research Projects Agency and the National Science Foundation of the  * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * *//* * audio_utils.c -- From Bob Brennan for Sun audio utilities. *  * HISTORY *  * 15-Jul-98	M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University * 		Removed '#include sun/audioio.h'. *  * 02-Aug-95	M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University * 		Created from Bob Brennan's original. */#include	<stdio.h>#include        <stdlib.h>#include	<sys/types.h>#include	<sys/ioctl.h>#include	<fcntl.h>#include	<stropts.h>#include	<errno.h>#include        <unistd.h>#include	"audio_utils_sunos.h"#define		AUDIO_DEF_GAIN	50#define QUIT(x)		{fprintf x; exit(-1);}static	int	audioFd = -1;static	int	sampleRate;static	int	samplePrecision;static	int	sampleEncoding;/* * Open audio, put it in paused state, and set IO to non-blocking mode. */int	audioOpen(int rate){    int		fd;    int		non_blocking;    if (rate == 16000) {	sampleRate = 16000;	samplePrecision = 16;	sampleEncoding = AUDIO_ENCODING_LINEAR;    }    else if (rate == 8000) {	sampleRate = 8000;	samplePrecision = 8;	sampleEncoding = AUDIO_ENCODING_ULAW;    }    else	QUIT((stderr, "audioOpen: unsupported rate %d\n", rate));    /*     * Open the device for read-only access and do not block (wait) if     * the device is currently busy.     */    fd = open("/dev/audio", O_RDONLY | O_NDELAY);    if (fd < 0) {	if (errno == EBUSY)	    fprintf(stderr, "audioOpen: audio device is busy\n");	else	    perror("audioOpen error");	exit(1);    }    audioFd = fd;    audioPause ();    audioFlush ();    non_blocking = 1;    ioctl (audioFd, FIONBIO, &non_blocking);    return fd;}void	audioPause(void){    audio_info_t	info;    int			err;    /*     * Make sure that the audio device is open     */    if (audioFd < 0)        QUIT((stderr, "audioPauseAndFlush: audio device not open\n"));    /*     * Pause and flush the input stream     */    AUDIO_INITINFO(&info);    info.record.pause = 1;    err = ioctl(audioFd, AUDIO_SETINFO, &info);    if (err)	QUIT((stderr, "pause ioctl err %d\n", err));}void	audioFlush(void){    audio_info_t	info;    int			err;    /*     * Make sure that the audio device is open     */    if (audioFd < 0)	QUIT((stderr, "audioPauseAndFlush: audio device not open\n"));    /*     * Flush the current input queue     */    err = ioctl(audioFd, I_FLUSH, FLUSHR);    if (err)	QUIT((stderr, "flush ioctl err %d\n", err));}void	audioStartRecord(void){    audio_info_t	info;    int			err;    /*     * Make sure that the audio device is open     */    if (audioFd < 0)	QUIT((stderr, "audioStartRecord: audio device not open\n"));    /*     * Setup the input stream the way we want it and start recording.     */    AUDIO_INITINFO(&info);    info.record.sample_rate = sampleRate;    info.record.channels = 1;    info.record.precision = samplePrecision;    info.record.encoding = sampleEncoding;#if 0    info.record.gain = AUDIO_DEF_GAIN;    info.record.port = AUDIO_MICROPHONE;#else    info.record.gain = 85;    info.record.port = AUDIO_LINE_IN;#endif    info.record.samples = 0;    info.record.pause = 0;    info.record.error = 0;    err = ioctl(audioFd, AUDIO_SETINFO, &info);    if (err)        QUIT((stderr, "startRecord ioctl err %d\n", err));}void	audioStopRecord(void){    audioPause();}void	audioClose(void){    /*     * Make sure that the audio device is open     */    if (audioFd < 0)	QUIT((stderr, "audioRecord: audio device not open\n"));    close(audioFd);    audioFd = -1;}int	audioSetRecordGain(int gain){    audio_info_t	info;    int			err;    int			currentGain;    /*     * Make sure that the audio device is open     */    if (audioFd < 0)	QUIT((stderr, "audioSetRecordGain: audio device not open\n"));    /*     * Fetch the current gain     */    err = ioctl(audioFd, AUDIO_GETINFO, &info);    if (err)        QUIT((stderr, "audioSetRecordGain ioctl err %d\n", err));    currentGain = info.record.gain;    /*     * Make sure that desired gain is within an acceptable range     */    if (gain < AUDIO_MIN_GAIN || gain > AUDIO_MAX_GAIN) {	fprintf(stderr, "audioSetRecordGain: gain %d out of range %d-%d\n",	    gain, AUDIO_MIN_GAIN, AUDIO_MAX_GAIN);	return currentGain;    }    /*     * Setup the input stream the way we want it and start recording.     */    AUDIO_INITINFO(&info);    info.record.gain = gain;    err = ioctl(audioFd, AUDIO_SETINFO, &info);    if (err)        QUIT((stderr, "startRecord ioctl err %d\n", err));    return currentGain;}#ifdef MAINvoid main (int argc, char *argv[]){    unsigned short buf[16000];    int audio_fd, i, j, k;    audio_fd = audioOpen (16000);    audioStartRecord ();    for (i = 0; i < 5; i++) {        /* simulate compute for a while */        for (j = 0; j < 200000; j++);	/* read whatever accumulated data is available, upto 16k max */	k = read (audio_fd, buf, 16000*sizeof(short));	/* print some of the new data */	printf (" %5d", k);	for (j = 0; j < 20; j++)	    printf (" %04x", buf[j]);	printf ("\n");	fflush (stdout);    }    /* simulate compute for a while and stop recording */    for (j = 0; j < 1000000; j++);    audioStopRecord ();    /* read whatever accumulated data is available, upto 16k max */    k = read (audio_fd, buf, 16000*sizeof(short));    printf (" %5d\n", k);    audioClose ();}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?