/** * @file adin_mic_o2.c * * * @brief マイク入力 (SGI IRIX) * * SGI IRIX のマイク入力を使用する低レベル音声入力関数です. * IRIXマシンではデフォルトでこれが使用されます. * * SGI O2 Workstation (IRIX6.3) で動作確認をしています. * * 起動後オーディオ入力はマイクに自動的に切り替わりますが, * ボリュームは自動調節されません.apanelコマンドで別途調節してください. * * * @brief Microphone input on SGI IRIX machine * * Low level I/O functions for microphone input on a SGI IRIX machine. * This file is used as default on IRIX machines. * * Tested on IRIX 6.3, SGI O2 Workstation. * * The microphone input device will be automatically selected by Julius * on startup. Please note that the recoding volue will not be * altered by Julius, and appropriate value should be set by another tool * such as apanel. * * * @author Akinobu LEE * @date Sun Feb 13 18:42:22 2005 * * $Revision: 1.6 $ * */ /* * Copyright (c) 1991-2012 Kawahara Lab., Kyoto University * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology * Copyright (c) 2005-2012 Julius project team, Nagoya Institute of Technology * All rights reserved */ #include #include /* sound header */ #include static ALconfig ac; ///< Local port settings static ALport aport; ///< Audio port /** * Initialize global audio interface to use microphone input. * * @param rate [in] sampling rate in Hz * * @return TRUE on success, FALSE on failure. */ static boolean adin_o2_setup_global(double rate) { int device; ALpv setPVbuf[4]; setPVbuf[0].param = AL_INTERFACE; setPVbuf[0].value.i = alGetResourceByName(AL_SYSTEM, "Microphone", AL_INTERFACE_TYPE); setPVbuf[1].param = AL_MASTER_CLOCK; setPVbuf[1].value.i = AL_CRYSTAL_MCLK_TYPE; setPVbuf[2].param = AL_RATE; setPVbuf[2].value.ll= alDoubleToFixed(rate); device = alGetResourceByName(AL_SYSTEM, "Microphone", AL_DEVICE_TYPE); if (alSetParams(device, setPVbuf, 3) < 0) { return FALSE; } else { return TRUE; } } /** * Device initialization: check device capability and open for recording. * * @param sfreq [in] required sampling frequency. * @param dummy [in] a dummy data * * @return TRUE on success, FALSE on failure. */ boolean adin_mic_standby(int sfreq, void *dummy) { long rate; long prec = AL_SAMPLE_16; long encd = AL_SAMPFMT_TWOSCOMP; long chan = AL_MONO; /* global setup */ rate = sfreq; if (adin_o2_setup_global((double)rate) == FALSE) { /* failed */ jlog("Error: adin_o2: cannot setup microphone device (global)\n"); return(FALSE); } /* local parameter setup */ if ((ac = ALnewconfig()) == 0) { jlog("Error: adin_o2: cannot config microphone device (local)\n"); return(FALSE); } ALsetqueuesize(ac, rate * 2 * 1); /* 2 sec. of mono. */ ALsetwidth(ac, prec); ALsetchannels(ac, chan); ALsetsampfmt(ac, encd); jlog("Stat: adin_o2: local microphone port successfully initialized\n"); return(TRUE); } /** * Start recording. * * @param pathname [in] path name to open or NULL for default * * @return TRUE on success, FALSE on failure. */ boolean adin_mic_begin(char *pathname) { /* open audio port */ if (pathname != NULL) { jlog("Stat: adin_o2: opening audio device \"%s\"\n", pathname); aport = ALopenport(pathname,"r",ac); } else { aport = ALopenport("mic","r",ac); } if (aport == (ALport)(0)) { jlog("Error: adin_o2: cannot open microphone audio port for reading\n"); return(FALSE); } return(TRUE); } /** * Stop recording. * * @return TRUE on success, FALSE on failure. */ boolean adin_mic_end() { /* close audio port */ ALcloseport(aport); return(TRUE); } /** * @brief Read samples from device * * Try to read @a sampnum samples and returns actual number of recorded * samples currently available. This function will block until * at least one sample can be obtained. * * @param buf [out] samples obtained in this function * @param sampnum [in] wanted number of samples to be read * * @return actural number of read samples, -2 if an error occured. */ int adin_mic_read(SP16 *buf, int sampnum) { long cnt; cnt = ALgetfilled(aport); /* get samples currently stored in queue */ if (cnt > sampnum) cnt = sampnum; if (ALreadsamps(aport, buf, cnt) < 0) { /* get them */ jlog("Error: adin_o2: failed to read sample\n"); return(-2); /* return negative on error */ } return cnt; } /** * * Function to return current input source device name * * @return string of current input device name. * */ char * adin_mic_input_name() { return("Microphone"); } /* end of file */