Julius 4.2
|
00001 00044 /* 00045 * Copyright (c) 1991-2011 Kawahara Lab., Kyoto University 00046 * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology 00047 * Copyright (c) 2005-2011 Julius project team, Nagoya Institute of Technology 00048 * All rights reserved 00049 */ 00050 00051 #include <sent/stddefs.h> 00052 #include <sent/adin.h> 00053 00054 #include <sys/types.h> 00055 #include <sys/stat.h> 00056 #include <fcntl.h> 00057 #include <errno.h> 00058 #include <sys/stropts.h> 00059 00060 /* sound header */ 00061 #include <sys/audioio.h> 00062 00063 static int srate; 00064 static int afd; 00065 static struct audio_info ainfo; 00066 static char *defaultdev = DEFAULT_DEVICE; 00067 static char devname[MAXPATHLEN]; 00068 00070 #define DEFAULT_DEVICE "/dev/audio" 00071 00072 00081 boolean 00082 adin_mic_standby(int sfreq, void *arg) 00083 { 00084 /* store required sampling rate for checking after opening device */ 00085 srate = sfreq; 00086 return TRUE; 00087 } 00088 00096 static boolean 00097 adin_mic_open(char *devstr) 00098 { 00099 /* open the device */ 00100 if ((afd = open(devstr, O_RDONLY)) == -1) { 00101 jlog("Error: adin_sol2: failed to open audio device %s\n", devstr); 00102 return(FALSE); 00103 } 00104 00105 #if 0 00106 { 00107 /* output hardware info (debug) */ 00108 struct audio_device adev; 00109 if (ioctl(afd, AUDIO_GETDEV, &adev)== -1) { 00110 jlog("Erorr: adin_sol2: failed to get hardware info\n"); 00111 return(FALSE); 00112 } 00113 jlog("Stat: adin_sol2: Hardware name: %s\n",adev.name); 00114 jlog("Stat: adin_sol2: Hardware version: %s\n", adev.version); 00115 jlog("Stat: adin_sol2: Properties: %s\n", adev.config); 00116 } 00117 #endif 00118 00119 /* get current setting */ 00120 if (ioctl(afd, AUDIO_GETINFO, &ainfo) == -1) { 00121 jlog("Error: adin_sol2: failed to get current setting from device\n"); 00122 return(FALSE); 00123 } 00124 /* pause for changing setting */ 00125 ainfo.record.pause = 1; 00126 if (ioctl(afd, AUDIO_SETINFO, &ainfo) == -1) { 00127 jlog("Erorr: adin_sol2: failed to pause for changing setting\n"); 00128 return(FALSE); 00129 } 00130 /* flush current input buffer (in old format) */ 00131 if((ioctl(afd , I_FLUSH , FLUSHR)) == -1) { 00132 jlog("Error: adin_sol2: failed to flush current input buffer\n"); 00133 return(FALSE); 00134 } 00135 /* set record setting */ 00136 ainfo.record.sample_rate = srate; 00137 ainfo.record.channels = 1; 00138 ainfo.record.precision = 16; 00139 ainfo.record.encoding = AUDIO_ENCODING_LINEAR; 00140 /* ainfo.record.gain = J_DEF_VOLUME * (AUDIO_MAX_GAIN - AUDIO_MIN_GAIN) / 100 + AUDIO_MIN_GAIN; */ 00141 ainfo.record.port = AUDIO_MICROPHONE; 00142 /* recording should be paused when initialized */ 00143 ainfo.record.pause = 1; 00144 00145 /* set audio setting, remain pause */ 00146 if (ioctl(afd, AUDIO_SETINFO, &ainfo) == -1) { 00147 jlog("Error: adin_sol2: failed to set audio setting\n"); 00148 return(FALSE); 00149 } 00150 00151 return(TRUE); 00152 } 00153 00161 boolean 00162 adin_mic_begin(char *pathname) 00163 { 00164 char *p; 00165 00166 /* set device name */ 00167 if (pathname != NULL) { 00168 strncpy(devname, pathname, MAXPATHLEN); 00169 jlog("Stat: adin_sol2: device name = %s (from argument)\n", devname); 00170 } else if ((p = getenv("AUDIODEV")) != NULL) { 00171 strncpy(devname, p, MAXPATHLEN); 00172 jlog("Stat: adin_sol2: device name = %s (from AUDIODEV)\n", devname); 00173 } else { 00174 strncpy(devname, defaultdev, MAXPATHLEN); 00175 jlog("Stat: adin_sol2: device name = %s (application default)\n", devname); 00176 } 00177 00178 /* open the device */ 00179 if (adin_mic_open(devname) == FALSE) return FALSE; 00180 00181 if (ioctl(afd, AUDIO_GETINFO, &ainfo) == -1) { 00182 jlog("Error: adin_sol2: failed to get audio status\n"); 00183 return(FALSE); 00184 } 00185 ainfo.record.pause = 0; 00186 if (ioctl(afd, AUDIO_SETINFO, &ainfo) == -1) { 00187 jlog("Error: adin_sol2: failed to set audio status\n"); 00188 return(FALSE); 00189 } 00190 00191 return(TRUE); 00192 } 00193 00199 boolean 00200 adin_mic_end() 00201 { 00202 #if 1 00203 close(afd); 00204 #else 00205 if (ioctl(afd, AUDIO_GETINFO, &ainfo) == -1) { 00206 jlog("Error: adin_sol2: failed to get audio status\n"); 00207 return(FALSE); 00208 } 00209 ainfo.record.pause = 1; 00210 if (ioctl(afd, AUDIO_SETINFO, &ainfo) == -1) { 00211 jlog("Error: adin_sol2: failed to set audio status\n"); 00212 return(FALSE); 00213 } 00214 #endif 00215 return(TRUE); 00216 } 00217 00230 int 00231 adin_mic_read(SP16 *buf, int sampnum) 00232 { 00233 int cnt; 00234 cnt = read(afd, buf, sampnum * sizeof(SP16)) / sizeof(SP16); 00235 if (cnt < 0) { 00236 jlog("Error: adin_sol2: failed to read sample\n"); 00237 return(-2); 00238 } 00239 return(cnt); 00240 } 00241 00249 char * 00250 adin_mic_input_name() 00251 { 00252 return(devname); 00253 } 00254 00255 /* end of file */