/**
* @file adin_esd.c
*
*
* @brief ネットワーク入力:Enlightened Sound Daemon (EsounD) からの音声入力
*
* 入力ソースとして Enlightened Sound Daemon (EsounD, 以下 esd) を
* 使用する低レベル関数です.
* 使用には esd が動作していることが必要です.
* 使用するには configure 時に "--with-mictype=esd" を指定して下さい.
*
*
* @brief Audio input from Englightened Sound Daemon (EsounD)
*
* Low level I/O functions for audio input via the Enlightened Sound
* Daemon (EsounD, or esd in short). If you want to use this API,
* please specify "--with-mictype=esd" options at compilation time
* to configure script.
*
*
* @author Akinobu LEE
* @date Sun Feb 13 16:18:26 2005
*
* $Revision: 1.7 $
*
*/
/*
* Copyright (c) 2004-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
#ifdef HAS_ESD
#include
static int sock; ///< Audio socket
static char name_buf[ESD_NAME_MAX]; ///< Unique identifier of this process that will be passed to EsounD
static int latency = 50; ///< Lantency time in msec
#endif
/**
* Connection initialization: check connectivity 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_esd_standby(int sfreq, void *dummy)
{
#ifndef HAS_ESD
jlog("Error: esd not compiled in\n");
return FALSE;
#else
esd_format_t format = ESD_BITS16 | ESD_MONO | ESD_STREAM | ESD_RECORD;
/* generate uniq ID */
snprintf(name_buf, ESD_NAME_MAX, "julius%d", getpid());
/* open stream */
jlog("adin_esd: opening socket, format = 0x%08x at %d Hz id=%s\n", format, sfreq, name_buf);
sock = esd_record_stream_fallback(format, sfreq, NULL, name_buf);
if (sock <= 0) {
jlog("Error: adin_esd: failed to connect to esd\n");
return FALSE;
}
return TRUE;
#endif
}
/**
* Start recording.
* @a pathname is dummy.
*
* @param pathname [in] path name to open or NULL for default
*
* @return TRUE on success, FALSE on failure.
*/
boolean
adin_esd_begin(char *pathname)
{
return(TRUE);
}
/**
* Stop recording.
*
* @return TRUE on success, FALSE on failure.
*/
boolean
adin_esd_end()
{
return TRUE;
}
/**
* @brief Read samples from the daemon.
*
* Try to read @a sampnum samples and returns actual number of recorded
* samples currently available. This function will block until
* at least one sample can be 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_esd_read(SP16 *buf, int sampnum)
{
#ifndef HAS_ESD
return -2;
#else
int size, cnt;
size = sampnum;
if (size > ESD_BUF_SIZE) size = ESD_BUF_SIZE;
size *= sizeof(SP16);
while((cnt = read(sock, buf, size)) <= 0) {
if (cnt < 0) {
perror("adin_esd_read: read error\n");
return ( -2 );
}
usleep(latency * 1000);
}
cnt /= sizeof(SP16);
return(cnt);
#endif
}
/**
*
* Function to return current input source device name
*
* @return string of current input device name.
*
*/
char *
adin_esd_input_name()
{
#ifndef HAS_ESD
return NULL;
#else
return(name_buf);
#endif
}