/** * @file adin_na.c * * * @brief NetAudio入力用のサブルーチン * * adin_netaudio.c 用のサブ関数が定義されています. * * NetAudio のライブラリの dat_types.h が * libsent/include/sent/stddefs.h での定義と一部衝突するため, * このようにサブルーチン部分を分離しています. * * * @brief Sub routines for NetAudio input * * This file defines sub functions for NetAudio input in adin_netaudio.c * * These functions are separated from adin_netaudio.c because some definitions * in NetAudio header "dat_types.h" conflicts with the * include header "sent/stddefs.h". * * * @author Akinobu LEE * @date Sun Feb 13 19:40:56 2005 * * $Revision: 1.4 $ * */ /* * 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 /* sound header */ #include #include #define TRUE 1 ///< Should be the same definition in stddefs.h #define FALSE 0 ///< Should be the same definition in stddefs.h typedef short SP16; ///< Should be the same definition in stddefs.h static NAport *port; ///< NetAudio port static int need_swap = FALSE; ///< Incoming data is always BIG ENDIAN /** * Initialize NetAudio device. * * @param sfreq [in] sampling frequency * @param server_devname [in] server host name * * @return 1 on success, 0 on failure. */ int NA_standby(int sfreq, char *server_devname) { NAinfo info; char *buf; int cnt; /* endian check --- incoming data is BE */ #ifdef WORDS_BIGENDIAN need_swap = FALSE; #else /* LITTLE ENDIAN */ need_swap = TRUE; #endif /* WORDS_BIGENDIAN */ /* Initialize '.datlinkrc' processing */ /*InitDefaults(argv[0]);*/ /* Open connection to DAT-Link server on server_devname */ /* if NULL, env AUDIO_DEVICE is used instead. */ /* if AUDIO_DEVICE not specified, local port is used */ port = NAOpen(server_devname); if (port == NULL) { jlog("Error: adin_na: failed to open netaudio server on %s\n", server_devname); return(FALSE); } /* setup parameters */ NAGetDefaultInfo(&info); info.source = DL_ISRC_ALL; /* input source: all */ info.record.sampleRate = sfreq; /* DAT(48kHz)->some freq */ info.record.precision = 16; /* bits per sample */ info.record.encoding = NA_ENCODING_LINEAR; info.record.channels = NA_CHANNELS_LEFT; /* mono */ NASetInfo(port, &info); /* open a data connection for recording */ if (NAOpenData(port, NA_RECORD) == -1) { jlog("Error: adin_na: failed to open data connection\n"); return(FALSE); } jlog("Stat: adin_na: connected to netaudio server on %s\n", server_devname); return(TRUE); } /** * Close port. (actually never used, just for reference...) * */ static void NA_close() { /* Flush (delete) any buffered data for recording */ NAFlush(port, NA_RECORD); /* Close the data connection */ NACloseData(port, 0); /* Close connection */ NAClose(port); } /** * Begin recording. * */ void NA_start() { NABegin(port, NA_RECORD); } /** * Pause the recording. * */ void NA_stop() { NAPause(port, NA_RECORD, 1); } /** * @brief Read samples from NetAudio port. * * 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, -1 if an error occured. */ int NA_read(SP16 *buf, int sampnum) { int cnt; cnt = NARead(port, (char *)buf, sampnum * sizeof(SP16)) / sizeof(SP16); if (need_swap) swap_sample_bytes(buf, cnt); return(cnt); }