00001
00044
00045
00046
00047
00048
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
00061 #include <sys/audioio.h>
00062 static int afd;
00063 static struct audio_info ainfo;
00064
00066 #define DEFAULT_DEVICE "/dev/audio"
00067
00076 boolean
00077 adin_mic_standby(int sfreq, void *arg)
00078 {
00079 char *defaultdev = DEFAULT_DEVICE;
00080 char *devname;
00081
00082
00083 if ((devname = getenv("AUDIODEV")) == NULL) {
00084 devname = defaultdev;
00085 jlog("Stat: adin_sol2: device name = %s\n", devname);
00086 } else {
00087 jlog("Stat: adin_sol2: device name obtained from AUDIODEV: %s\n", devname);
00088 }
00089
00090
00091 if ((afd = open(devname, O_RDONLY)) == -1) {
00092 jlog("Error: adin_sol2: failed to open audio device %s\n", devname);
00093 return(FALSE);
00094 }
00095
00096 #if 0
00097 {
00098
00099 struct audio_device adev;
00100 if (ioctl(afd, AUDIO_GETDEV, &adev)== -1) {
00101 jlog("Erorr: adin_sol2: failed to get hardware info\n");
00102 return(FALSE);
00103 }
00104 jlog("Stat: adin_sol2: Hardware name: %s\n",adev.name);
00105 jlog("Stat: adin_sol2: Hardware version: %s\n", adev.version);
00106 jlog("Stat: adin_sol2: Properties: %s\n", adev.config);
00107 }
00108 #endif
00109
00110
00111 if (ioctl(afd, AUDIO_GETINFO, &ainfo) == -1) {
00112 jlog("Error: adin_sol2: failed to get current setting from device\n");
00113 return(FALSE);
00114 }
00115
00116 ainfo.record.pause = 1;
00117 if (ioctl(afd, AUDIO_SETINFO, &ainfo) == -1) {
00118 jlog("Erorr: adin_sol2: failed to pause for changing setting\n");
00119 return(FALSE);
00120 }
00121
00122 if((ioctl(afd , I_FLUSH , FLUSHR)) == -1) {
00123 jlog("Error: adin_sol2: failed to flush current input buffer\n");
00124 return(FALSE);
00125 }
00126
00127 ainfo.record.sample_rate = sfreq;
00128 ainfo.record.channels = 1;
00129 ainfo.record.precision = 16;
00130 ainfo.record.encoding = AUDIO_ENCODING_LINEAR;
00131
00132 ainfo.record.port = AUDIO_MICROPHONE;
00133
00134 ainfo.record.pause = 1;
00135
00136
00137 if (ioctl(afd, AUDIO_SETINFO, &ainfo) == -1) {
00138 jlog("Error: adin_sol2: failed to set audio setting\n");
00139 return(FALSE);
00140 }
00141
00142 return(TRUE);
00143
00144 }
00145
00151 boolean
00152 adin_mic_begin()
00153 {
00154 if (ioctl(afd, AUDIO_GETINFO, &ainfo) == -1) {
00155 jlog("Error: adin_sol2: failed to get audio status\n");
00156 return(FALSE);
00157 }
00158 ainfo.record.pause = 0;
00159 if (ioctl(afd, AUDIO_SETINFO, &ainfo) == -1) {
00160 jlog("Error: adin_sol2: failed to set audio status\n");
00161 return(FALSE);
00162 }
00163
00164 return(TRUE);
00165 }
00166
00172 boolean
00173 adin_mic_end()
00174 {
00175 if (ioctl(afd, AUDIO_GETINFO, &ainfo) == -1) {
00176 jlog("Error: adin_sol2: failed to get audio status\n");
00177 return(FALSE);
00178 }
00179 ainfo.record.pause = 1;
00180 if (ioctl(afd, AUDIO_SETINFO, &ainfo) == -1) {
00181 jlog("Error: adin_sol2: failed to set audio status\n");
00182 return(FALSE);
00183 }
00184 return(TRUE);
00185 }
00186
00199 int
00200 adin_mic_read(SP16 *buf, int sampnum)
00201 {
00202 int cnt;
00203 cnt = read(afd, buf, sampnum * sizeof(SP16)) / sizeof(SP16);
00204 if (cnt < 0) {
00205 jlog("Error: adin_sol2: failed to read sample\n");
00206 return(-2);
00207 }
00208 return(cnt);
00209 }