/** * @file m_adin.c * * * @brief 音声入力デバイスの初期化 * * * * @brief Initialize audio input device * * * @author Akinobu LEE * @date Fri Mar 18 16:17:23 2005 * * $Revision: 1.14 $ * */ /* * 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 /** * Set up device-specific parameters and functions to AD-in work area. * * @param a [i/o] AD-in work area * @param source [in] input source ID @sa adin.h * * @return TRUE on success, FALSE if @a source is not available. */ static boolean adin_select(ADIn *a, int source, int dev) { switch(source) { case SP_RAWFILE: #ifdef HAVE_LIBSNDFILE /* libsndfile interface */ a->ad_standby = adin_sndfile_standby; a->ad_begin = adin_sndfile_begin; a->ad_end = adin_sndfile_end; a->ad_resume = NULL; a->ad_pause = NULL; a->ad_terminate = NULL; a->ad_read = adin_sndfile_read; a->ad_input_name = adin_sndfile_get_current_filename; a->silence_cut_default = FALSE; a->enable_thread = FALSE; #else /* ~HAVE_LIBSNDFILE */ /* built-in RAW/WAV reader */ a->ad_standby = adin_file_standby; a->ad_begin = adin_file_begin; a->ad_end = adin_file_end; a->ad_resume = NULL; a->ad_pause = NULL; a->ad_terminate = NULL; a->ad_read = adin_file_read; a->ad_input_name = adin_file_get_current_filename; a->silence_cut_default = FALSE; a->enable_thread = FALSE; #endif break; #ifdef USE_MIC case SP_MIC: /* microphone input */ a->ad_resume = NULL; a->ad_pause = NULL; a->ad_terminate = NULL; a->silence_cut_default = TRUE; a->enable_thread = TRUE; switch(dev) { case SP_INPUT_DEFAULT: a->ad_standby = adin_mic_standby; a->ad_begin = adin_mic_begin; a->ad_end = adin_mic_end; a->ad_read = adin_mic_read; a->ad_input_name = adin_mic_input_name; break; #ifdef HAS_ALSA case SP_INPUT_ALSA: a->ad_standby = adin_alsa_standby; a->ad_begin = adin_alsa_begin; a->ad_end = adin_alsa_end; a->ad_read = adin_alsa_read; a->ad_input_name = adin_alsa_input_name; break; #endif #ifdef HAS_OSS case SP_INPUT_OSS: a->ad_standby = adin_oss_standby; a->ad_begin = adin_oss_begin; a->ad_end = adin_oss_end; a->ad_read = adin_oss_read; a->ad_input_name = adin_oss_input_name; break; #endif #ifdef HAS_ESD case SP_INPUT_ESD: a->ad_standby = adin_esd_standby; a->ad_begin = adin_esd_begin; a->ad_end = adin_esd_end; a->ad_read = adin_esd_read; a->ad_input_name = adin_esd_input_name; break; #endif #ifdef HAS_PULSEAUDIO case SP_INPUT_PULSEAUDIO: a->ad_standby = adin_pulseaudio_standby; a->ad_begin = adin_pulseaudio_begin; a->ad_end = adin_pulseaudio_end; a->ad_read = adin_pulseaudio_read; a->ad_input_name = adin_pulseaudio_input_name; break; #endif default: jlog("ERROR: m_adin: invalid input device specified\n"); } break; #endif #ifdef USE_NETAUDIO case SP_NETAUDIO: /* DatLink/NetAudio input */ a->ad_standby = adin_netaudio_standby; a->ad_begin = adin_netaudio_begin; a->ad_end = adin_netaudio_end; a->ad_resume = NULL; a->ad_pause = NULL; a->ad_terminate = NULL; a->ad_read = adin_netaudio_read; a->ad_input_name = adin_netaudio_input_name; a->silence_cut_default = TRUE; a->enable_thread = TRUE; break; #endif case SP_ADINNET: /* adinnet network input */ a->ad_standby = adin_tcpip_standby; a->ad_begin = adin_tcpip_begin; a->ad_end = adin_tcpip_end; a->ad_resume = adin_tcpip_send_resume; a->ad_pause = adin_tcpip_send_pause; a->ad_terminate = adin_tcpip_send_terminate; a->ad_read = adin_tcpip_read; a->ad_input_name = adin_tcpip_input_name; a->silence_cut_default = FALSE; a->enable_thread = FALSE; break; case SP_STDIN: /* standard input */ a->ad_standby = adin_stdin_standby; a->ad_begin = adin_stdin_begin; a->ad_end = NULL; a->ad_resume = NULL; a->ad_pause = NULL; a->ad_terminate = NULL; a->ad_read = adin_stdin_read; a->ad_input_name = adin_stdin_input_name; a->silence_cut_default = FALSE; a->enable_thread = FALSE; break; case SP_MFCFILE: /* MFC_FILE is not waveform, so special handling on main routine should be done */ break; default: jlog("Error: m_adin: unknown input ID\n"); return FALSE; } return TRUE; } /** * * 音声入力デバイスを初期化し,音入力切出用パラメータをセットアップする. * * @param adin [in] AD-in ワークエリア * @param jconf [in] 全体設定パラメータ * @param arg [in] デバイス依存引数 * * * Initialize audio device and set up parameters for sound detection. * * @param adin [in] AD-in work area * @param jconf [in] global configuration parameters * @param arg [in] device-specific argument * */ static boolean adin_setup_all(ADIn *adin, Jconf *jconf, void *arg) { if (jconf->input.use_ds48to16) { if (jconf->input.use_ds48to16 && jconf->input.sfreq != 16000) { jlog("ERROR: m_adin: in 48kHz input mode, target sampling rate should be 16k!\n"); return FALSE; } /* setup for 1/3 down sampling */ adin->ds = ds48to16_new(); adin->down_sample = TRUE; /* set device sampling rate to 48kHz */ if (adin_standby(adin, 48000, arg) == FALSE) { /* fail */ jlog("ERROR: m_adin: failed to ready input device\n"); return FALSE; } } else { adin->ds = NULL; adin->down_sample = FALSE; if (adin_standby(adin, jconf->input.sfreq, arg) == FALSE) { /* fail */ jlog("ERROR: m_adin: failed to ready input device\n"); return FALSE; } } /* set parameter for recording/silence detection */ if (adin_setup_param(adin, jconf) == FALSE) { jlog("ERROR: m_adin: failed to set parameter for input device\n"); return FALSE; } adin->input_side_segment = FALSE; return TRUE; } /** * * 設定パラメータに従い音声入力デバイスをセットアップする. * * @param recog [i/o] エンジンインスタンス * * * * Set up audio input device according to the jconf configurations. * * @param recog [i/o] engine instance * * * @callgraph * @callergraph */ boolean adin_initialize(Recog *recog) { char *arg = NULL; ADIn *adin; Jconf *jconf; #ifdef ENABLE_PLUGIN FUNC_INT func; int sid; #endif adin = recog->adin; jconf = recog->jconf; jlog("STAT: ###### initialize input device\n"); /* select input device: file, mic, netaudio, etc... */ #ifdef ENABLE_PLUGIN sid = jconf->input.plugin_source; if (sid >= 0) { /* set plugin properties and functions to adin */ func = (FUNC_INT) plugin_get_func(sid, "adin_get_configuration"); if (func == NULL) { jlog("ERROR: invalid plugin: adin_get_configuration() not exist\n"); return FALSE; } adin->silence_cut_default = (*func)(1); adin->enable_thread = (*func)(2); adin->ad_standby = (boolean (*)(int, void *)) plugin_get_func(sid, "adin_standby"); adin->ad_begin = (boolean (*)(char *)) plugin_get_func(sid, "adin_open"); adin->ad_end = (boolean (*)()) plugin_get_func(sid, "adin_close"); adin->ad_resume = (boolean (*)()) plugin_get_func(sid, "adin_resume"); adin->ad_pause = (boolean (*)()) plugin_get_func(sid, "adin_pause"); adin->ad_terminate = (boolean (*)()) plugin_get_func(sid, "adin_terminate"); adin->ad_read = (int (*)(SP16 *, int)) plugin_get_func(sid, "adin_read"); adin->ad_input_name = (char * (*)()) plugin_get_func(sid, "adin_input_name"); if (adin->ad_read == NULL) { jlog("ERROR: m_adin: selected plugin has no function adin_read()\n"); return FALSE; } } else { #endif /* built-in */ if (adin_select(adin, jconf->input.speech_input, jconf->input.device) == FALSE) { jlog("ERROR: m_adin: failed to select input device\n"); return FALSE; } /* set sampling frequency and device-dependent configuration (argument is device-dependent) */ switch(jconf->input.speech_input) { case SP_ADINNET: /* arg: port number */ arg = mymalloc(100); sprintf(arg, "%d", jconf->input.adinnet_port); break; case SP_RAWFILE: /* arg: filename of file list (if any) */ if (jconf->input.inputlist_filename != NULL) { arg = mymalloc(strlen(jconf->input.inputlist_filename)+1); strcpy(arg, jconf->input.inputlist_filename); } else { arg = NULL; } break; case SP_STDIN: arg = NULL; break; #ifdef USE_NETAUDIO case SP_NETAUDIO: /* netaudio server/port name */ arg = mymalloc(strlen(jconf->input.netaudio_devname)+1); strcpy(arg, jconf->input.netaudio_devname); break; #endif } #ifdef ENABLE_PLUGIN } #endif if (adin_setup_all(adin, jconf, arg) == FALSE) { return FALSE; } if (arg != NULL) free(arg); return TRUE; } /* end of file */