52 #include <jack/jack.h>
54 #define DEFAULT_DEVICE "system:capture_1"
55 #define BUFFER_SIZE 352800
59 const size_t sample_size =
sizeof(jack_default_audio_sample_t);
60 const size_t int16_range_over_two = (-SHRT_MIN + SHRT_MAX) / 2.0;
63 process (jack_nframes_t nframes,
void *arg)
67 size_t buffer_size = jack_ringbuffer_write_space (handle->rbuffer);
69 jack_default_audio_sample_t *in = (jack_default_audio_sample_t *) jack_port_get_buffer (handle->input_port, nframes);
71 if (buffer_size <= 0) {
72 fprintf(stderr,
"JACK: buffer is full. Deactivating JACK client.\n");
77 jack_ringbuffer_write (handle->rbuffer, (
char*) in, sample_size * nframes);
79 #ifdef MIC_SPEAKER_PASSTHROUGH_DEBUG
81 jack_default_audio_sample_t *out = (jack_default_audio_sample_t *) jack_port_get_buffer (handle->output_port, nframes);
84 memcpy (out, in, sample_size * nframes);
92 error (
const char *desc)
94 fprintf (stderr,
"JACK error: %s\n", desc);
98 jack_shutdown (
void *arg)
104 srate (jack_nframes_t nframes,
void *arg)
107 printf (
"JACK: The sample rate is now %u/sec\n", nframes);
117 #ifdef HAVE_SAMPLERATE_H
119 double samplerates_ratio;
120 jack_nframes_t jack_samplerate;
124 dev = DEFAULT_DEVICE;
127 printf(
"JACK: Setting default device: %s\n", dev);
130 fprintf(stderr,
"calloc(%d) failed\n", (
int)
sizeof(
ad_rec_t));
137 jack_set_error_function (error);
140 if ((handle->client = jack_client_open (
"jack_ad", (jack_options_t)0, NULL)) == 0) {
141 fprintf (stderr,
"jack server not running?\n");
145 #ifdef HAVE_SAMPLERATE_H
146 handle->resample_buffer = malloc(BUFFER_SIZE);
148 jack_samplerate = jack_get_sample_rate(handle->client);
149 samplerates_ratio = (double)((
double)jack_samplerate / (double)sps);
151 handle->rbuffer = jack_ringbuffer_create((
int)((
double)BUFFER_SIZE * samplerates_ratio));
152 handle->sample_buffer = malloc((
int)((
double)BUFFER_SIZE * samplerates_ratio));
154 handle->rbuffer = jack_ringbuffer_create(BUFFER_SIZE);
155 handle->sample_buffer = malloc(BUFFER_SIZE);
158 if(handle->rbuffer == NULL) {
159 fprintf (stderr,
"Failed to create jack ringbuffer\n");
166 jack_set_process_callback (handle->client, process, handle);
171 jack_set_sample_rate_callback (handle->client, srate, 0);
177 jack_on_shutdown (handle->client, jack_shutdown, 0);
181 if((handle->input_port = jack_port_register (handle->client,
"jack_ad_input", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0)) == 0) {
182 fprintf (stderr,
"cannot register input port!\n");
186 if((handle->output_port = jack_port_register (handle->client,
"jack_ad_output", JACK_DEFAULT_AUDIO_TYPE, JackPortIsPhysical|JackPortIsOutput, 0)) == 0) {
187 fprintf (stderr,
"cannot register output port!\n");
192 if (jack_activate (handle->client)) {
193 fprintf (stderr,
"cannot activate client");
203 if ((ports = jack_get_ports (handle->client, dev, NULL, JackPortIsOutput)) == NULL) {
204 fprintf(stderr,
"Cannot find any physical capture ports\n");
208 if (jack_connect (handle->client, ports[0], jack_port_name (handle->input_port))) {
209 fprintf (stderr,
"cannot connect input ports\n");
215 #ifdef MIC_SPEAKER_PASSTHROUGH_DEBUG
217 if ((ports = jack_get_ports (handle->client,
"system:playback", NULL,
218 JackPortIsPhysical|JackPortIsInput)) == NULL) {
219 fprintf(stderr,
"Cannot find any physical playback ports\n");
223 for (i = 0; ports[i] != NULL; i++) {
224 if (jack_connect (handle->client, jack_port_name (handle->output_port), ports[i])) {
225 fprintf (stderr,
"cannot connect output ports\n");
232 #ifdef HAVE_SAMPLERATE_H
234 if ((handle->resample_state = src_new (SRC_SINC_BEST_QUALITY, 1, &resample_error)) == NULL) {
235 fprintf (stderr,
"Error : src_new() failed: %s\n", src_strerror(resample_error));
240 handle->recording = 0;
242 handle->
bps =
sizeof(int16);
266 free (handle->sample_buffer);
267 #ifdef HAVE_SAMPLERATE_H
268 free (handle->resample_buffer);
270 jack_ringbuffer_free (handle->rbuffer);
271 jack_client_close (handle->client);
280 if (handle->recording)
283 handle->recording = 1;
291 handle->recording = 0;
297 ad_read(
ad_rec_t * handle, int16 * buf, int32 max)
299 #ifdef HAVE_SAMPLERATE_H
303 if (!handle->recording)
306 size_t length = sample_size * max;
308 #ifdef HAVE_SAMPLERATE_H
313 length = jack_ringbuffer_peek (handle->rbuffer, (
char*) handle->sample_buffer, length);
314 size_t length_in_samples = length / sample_size;
316 if(handle->resample_state == NULL)
320 jack_nframes_t jack_samplerate = jack_get_sample_rate(handle->client);
324 data.data_in = handle->sample_buffer;
325 data.input_frames = length_in_samples;
326 data.data_out = handle->resample_buffer;
327 data.output_frames = BUFFER_SIZE / sample_size;
328 data.src_ratio = (float) handle->
sps / jack_samplerate;
329 data.end_of_input = 0;
331 if ((resample_error = src_process(handle->resample_state, &data)) != 0) {
332 fprintf (stderr,
"resample error %s\n", src_strerror (resample_error));
336 for(
int i=0; i<data.output_frames_gen; i++) {
337 buf[i] = (int16) (int16_range_over_two * (handle->resample_buffer[i] + 1.0) + SHRT_MIN);
340 jack_ringbuffer_read_advance(handle->rbuffer, data.input_frames_used * sample_size);
342 if(length == 0 && (!handle->recording)) {
346 return data.output_frames_gen;
350 length = jack_ringbuffer_read (handle->rbuffer, (
char*) handle->sample_buffer, length);
351 size_t length_in_samples = length / sample_size;
353 for(
int i=0; i<length_in_samples; i++) {
354 buf[i] = (int16) (int16_range_over_two * (handle->sample_buffer[i] + 1.0) + SHRT_MIN);
357 if(length == 0 && (!handle->recording)) {
361 return length_in_samples;
Basic type definitions used in Sphinx.
SPHINXBASE_EXPORT ad_rec_t * ad_open(void)
Open the default audio device.
generic live audio interface for recording and playback
SPHINXBASE_EXPORT ad_rec_t * ad_open_dev(const char *dev, int32 samples_per_sec)
Open a specific audio device for recording.
SPHINXBASE_EXPORT ad_rec_t * ad_open_sps(int32 samples_per_sec)
Open the default audio device with a given sampling rate.