Julius 4.2
libsent/src/adin/adin_mic_sol2.c
説明を見る。
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 */