/** * @file adin_mic_sp.c * * * @brief マイク入力 (spAudioライブラリ) * * spAudioライブラリを使用したマイク入力のための低レベル関数です. * 使用するには configure 時に "--with-mictype=sp" を指定して下さい. * * JuliusはLinuxではミキサーデバイスの設定を一切行いません.録音デバイスの * 選択(マイク/ライン)や録音ボリュームの調節は xmixer など他のツールで * 行なって下さい. * * このコードは坂野秀樹さんの作です.spAudio については以下もご覧下さい. * * @sa http://www.sp.m.is.nagoya-u.ac.jp/people/banno/spLibs/index-j.html * * * * @brief Microphone input using spAudio library * * Low level I/O functions for microphone input using spAudio library. * To use, please specify "--with-mictype=sp" options to configure script. * * Julius does not alter any mixer device setting at all on Linux. You should * configure the mixer for recording source (mic/line) and recording volume * correctly using other audio tool such as xmixer. * * This code has been contributed by Hideaki Banno. * * @sa http://www.sp.m.is.nagoya-u.ac.jp/people/banno/spLibs/index.html * * * * @author Akinobu LEE * @date Sun Feb 13 19:16:43 2005 * * $Revision: 1.4 $ * */ /* adin_mic_sp.c --- adin microphone library for spAudio * by Hideki Banno */ #include #include #include static spAudio audio = NULL; ///< Audio descriptor static long buffer_length = 256; ///< Buffer length static float rate; ///< Sampling rate specified in adin_mic_standby() /** * 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) { rate = sfreq; if (adin_mic_start() == FALSE) return FALSE; if (adin_mic_stop() == FALSE) 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) { if (audio == NULL) { audio = spInitAudio(); } spSetAudioSampleRate(audio, rate); spSetAudioChannel(audio, 1); spSetAudioSampleBit(audio, 16); #ifdef SP_AUDIO_NONBLOCKING spSetAudioBlockingMode(audio, SP_AUDIO_NONBLOCKING); #endif if (!spOpenAudioDevice(audio, "ro")) { jlog("Error: adin_sp: failed to open device\n"); return FALSE; } return TRUE; } /** * Stop recording. * * @return TRUE on success, FALSE on failure. */ boolean adin_mic_end() { spCloseAudioDevice(audio); 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) { long nread; #ifdef SP_AUDIO_NONBLOCKING nread = sampnum; #else if (sampnum <= buffer_length) { nread = sampnum; } else { nread = buffer_length; } #endif nread = spReadAudio(audio, (short *)buf, nread); return nread; } /** * * Function to return current input source device name * * @return string of current input device name. * */ char * adin_mic_input_name() { return("SP default device"); }