/**
* @file adin_pulseaudio.c
*
*
* @brief PulseAudio入力
*
* 入力ソースとして PulseAudio API を使用します。
* PulseAudio はコンパイル時にライブラリが存在する場合、
* デフォルトのマイク入力APIとして "-input mic" あるいは "-input pulseaudio"
* で使用できます。
*
*
* @brief Audio input via PulseAudio API
*
* Low level I/O functions for audio input via PulseAudio API.
* This API will be the default API when compiled with PulseAudio library,
* i.e. if development files exist at compilation, "-input mic" will use
* This API. Or you can explicitly specify "-input pulseaudio" to use it.
*
*
* @author Akinobu LEE
* @date Thu Feb 24 00:18:22 2011
*
* $Revision: 1.2 $
*
*/
/*
* Copyright (c) 2010-2012 Julius project team, Nagoya Institute of Technology
* All rights reserved
*/
#include
#include
#ifdef HAS_PULSEAUDIO
#include
#include
#define BUFSIZE 512
static pa_simple *s = NULL;
static int srate;
static char name_buf[] = "PulseAudio default device";
#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_pulseaudio_standby(int sfreq, void *dummy)
{
#ifndef HAS_PULSEAUDIO
jlog("Error: PulseAudio not compiled in\n");
return FALSE;
#else
srate = sfreq;
return TRUE;
#endif
}
/**
* Start recording.
* @a pathname is dummy.
*
* @param arg [in] argument
*
* @return TRUE on success, FALSE on failure.
*/
boolean
adin_pulseaudio_begin(char *arg)
{
#ifndef HAS_PULSEAUDIO
jlog("Error: PulseAudio not compiled in\n");
return FALSE;
#else
pa_sample_spec ss;
int error;
ss.format = PA_SAMPLE_S16LE;
ss.rate = srate;
ss.channels = 1;
if (!(s = pa_simple_new(NULL, "Julius", PA_STREAM_RECORD, NULL, "record", &ss, NULL, NULL, &error))) {
jlog("Error: adin_pulseaudio: pa_simple_new() failed: %s\n", pa_strerror(error));
return FALSE;
}
return TRUE;
#endif
}
/**
* Stop recording.
*
* @return TRUE on success, FALSE on failure.
*/
boolean
adin_pulseaudio_end()
{
#ifndef HAS_PULSEAUDIO
jlog("Error: PulseAudio not compiled in\n");
return FALSE;
#else
if (s != NULL) {
pa_simple_free(s);
s = NULL;
}
return TRUE;
#endif
}
/**
* @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 one sample was 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_pulseaudio_read(SP16 *buf, int sampnum)
{
#ifndef HAS_PULSEAUDIO
return -2;
#else
int error;
int cnt, bufsize;
bufsize = sampnum * sizeof(SP16);
if (bufsize > BUFSIZE) bufsize = BUFSIZE;
if (pa_simple_read(s, buf, bufsize, &error) < 0) {
jlog("Error: adin_pulseaudio: pa_simple_read() failed: %s\n", pa_strerror(error));
return (-2);
}
cnt = bufsize / sizeof(SP16);
return(cnt);
#endif
}
/**
*
* Function to return current input source device name
*
* @return string of current input device name.
*
*/
char *
adin_pulseaudio_input_name()
{
#ifndef HAS_PULSEAUDIO
return NULL;
#else
return(name_buf);
#endif
}