/**
* @file adin_mic_sol2.c
*
*
* @brief マイク入力 (Solaris2.x)
*
* Solaris 2.x でマイク入力を使用するための低レベル音声入力関数です.
* Solaris 2.x のマシンではデフォルトでこのファイルが使用されます.
*
* Sun Solaris 2.5.1 および 2.6 で動作確認をしています.
* ビッグエンディアンを前提としているため,Solaris x86 では動きません.
*
* 起動後オーディオ入力はマイクに自動的に切り替わりますが,
* ボリュームは自動調節されません.gaintoolなどで別途調節してください.
*
* デフォルトのデバイス名は "/dev/audio" です.環境変数 AUDIODEV に
* デバイス名を指定することで,他のデバイス名を使用できます.
*
*
* @brief Microphone input on Solaris 2.x
*
* Low level I/O functions for microphone input on Solaris 2.x machines.
* This file is used as default on Solaris 2.x machines.
*
* Tested on Sun Solaris 2.5.1 and 2.6. Also works on later versions.
* Please note that this will not work on Solaris x86, since machine
* byte order is fixed to big endian.
*
* 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 gaintool.
*
* The default device name is "/dev/audio", which can be changed by setting
* environment variable AUDIODEV.
*
*
* @author Akinobu LEE
* @date Sun Feb 13 19:06:46 2005
*
* $Revision: 1.7 $
*
*/
/*
* 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
#include
#include
#include
#include
#include
/* sound header */
#include
/// Default device name, can be overridden by AUDIODEV environment variable
#define DEFAULT_DEVICE "/dev/audio"
static int srate; ///< Required sampling rate
static int afd; ///< Audio file descriptor
static struct audio_info ainfo; ///< Audio format information
static char *defaultdev = DEFAULT_DEVICE;
static char devname[MAXPATHLEN];
/**
* Device initialization: check device capability
*
* @param sfreq [in] required sampling frequency.
* @param arg [in] a dummy data
*
* @return TRUE on success, FALSE on failure.
*/
boolean
adin_mic_standby(int sfreq, void *arg)
{
/* store required sampling rate for checking after opening device */
srate = sfreq;
return TRUE;
}
/**
* Open the specified device and check capability of the opening device.
*
* @param devstr [in] device string to open
*
* @return TRUE on success, FALSE on failure.
*/
static boolean
adin_mic_open(char *devstr)
{
/* open the device */
if ((afd = open(devstr, O_RDONLY)) == -1) {
jlog("Error: adin_sol2: failed to open audio device %s\n", devstr);
return(FALSE);
}
#if 0
{
/* output hardware info (debug) */
struct audio_device adev;
if (ioctl(afd, AUDIO_GETDEV, &adev)== -1) {
jlog("Erorr: adin_sol2: failed to get hardware info\n");
return(FALSE);
}
jlog("Stat: adin_sol2: Hardware name: %s\n",adev.name);
jlog("Stat: adin_sol2: Hardware version: %s\n", adev.version);
jlog("Stat: adin_sol2: Properties: %s\n", adev.config);
}
#endif
/* get current setting */
if (ioctl(afd, AUDIO_GETINFO, &ainfo) == -1) {
jlog("Error: adin_sol2: failed to get current setting from device\n");
return(FALSE);
}
/* pause for changing setting */
ainfo.record.pause = 1;
if (ioctl(afd, AUDIO_SETINFO, &ainfo) == -1) {
jlog("Erorr: adin_sol2: failed to pause for changing setting\n");
return(FALSE);
}
/* flush current input buffer (in old format) */
if((ioctl(afd , I_FLUSH , FLUSHR)) == -1) {
jlog("Error: adin_sol2: failed to flush current input buffer\n");
return(FALSE);
}
/* set record setting */
ainfo.record.sample_rate = srate;
ainfo.record.channels = 1;
ainfo.record.precision = 16;
ainfo.record.encoding = AUDIO_ENCODING_LINEAR;
/* ainfo.record.gain = J_DEF_VOLUME * (AUDIO_MAX_GAIN - AUDIO_MIN_GAIN) / 100 + AUDIO_MIN_GAIN; */
ainfo.record.port = AUDIO_MICROPHONE;
/* recording should be paused when initialized */
ainfo.record.pause = 1;
/* set audio setting, remain pause */
if (ioctl(afd, AUDIO_SETINFO, &ainfo) == -1) {
jlog("Error: adin_sol2: failed to set audio setting\n");
return(FALSE);
}
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)
{
char *p;
/* set device name */
if (pathname != NULL) {
strncpy(devname, pathname, MAXPATHLEN);
jlog("Stat: adin_sol2: device name = %s (from argument)\n", devname);
} else if ((p = getenv("AUDIODEV")) != NULL) {
strncpy(devname, p, MAXPATHLEN);
jlog("Stat: adin_sol2: device name = %s (from AUDIODEV)\n", devname);
} else {
strncpy(devname, defaultdev, MAXPATHLEN);
jlog("Stat: adin_sol2: device name = %s (application default)\n", devname);
}
/* open the device */
if (adin_mic_open(devname) == FALSE) return FALSE;
if (ioctl(afd, AUDIO_GETINFO, &ainfo) == -1) {
jlog("Error: adin_sol2: failed to get audio status\n");
return(FALSE);
}
ainfo.record.pause = 0;
if (ioctl(afd, AUDIO_SETINFO, &ainfo) == -1) {
jlog("Error: adin_sol2: failed to set audio status\n");
return(FALSE);
}
return(TRUE);
}
/**
* Stop recording.
*
* @return TRUE on success, FALSE on failure.
*/
boolean
adin_mic_end()
{
#if 1
close(afd);
#else
if (ioctl(afd, AUDIO_GETINFO, &ainfo) == -1) {
jlog("Error: adin_sol2: failed to get audio status\n");
return(FALSE);
}
ainfo.record.pause = 1;
if (ioctl(afd, AUDIO_SETINFO, &ainfo) == -1) {
jlog("Error: adin_sol2: failed to set audio status\n");
return(FALSE);
}
#endif
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 some samples are 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)
{
int cnt;
cnt = read(afd, buf, sampnum * sizeof(SP16)) / sizeof(SP16);
if (cnt < 0) {
jlog("Error: adin_sol2: failed to read sample\n");
return(-2);
}
return(cnt);
}
/**
*
* Function to return current input source device name
*
* @return string of current input device name.
*
*/
char *
adin_mic_input_name()
{
return(devname);
}
/* end of file */