UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
Loading...
Searching...
No Matches
jack.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define _JACK_H_
 

Functions

int is_jack_receiver (void *state)
 
int is_jack_sender (void *state)
 
bool jack_receive (void *state, void *data)
 Receives data from JACK.
 
void jack_send (void *s, struct audio_frame *frame)
 
void * jack_start (const char *cfg)
 

Detailed Description

Author
Martin Pulec marti.nosp@m.n.pu.nosp@m.lec@c.nosp@m.esne.nosp@m.t.cz

Definition in file jack.h.

Macro Definition Documentation

◆ _JACK_H_

#define _JACK_H_

Definition at line 44 of file jack.h.

Function Documentation

◆ is_jack_receiver()

int is_jack_receiver ( void * state)

Definition at line 426 of file jack.c.

427{
428 return ((struct state_jack *) state)->receiver;
429}
void ** state

References state.

Referenced by audio_start().

◆ is_jack_sender()

int is_jack_sender ( void * state)

Definition at line 421 of file jack.c.

422{
423 return ((struct state_jack *) state)->sender;
424}

References state.

Referenced by audio_start().

◆ jack_receive()

bool jack_receive ( void * state,
void * data )

Receives data from JACK.

Parameters
[in]statestate returned by jack_init()
[out]datapbuf_audio_data
Return values
trueif some data are receied
falseif no data were receied
Todo
repair this

Definition at line 387 of file jack.c.

388{
389 struct state_jack *s = (struct state_jack *) state;
390 struct pbuf_audio_data *audio_data = (struct pbuf_audio_data *) data;
391 struct audio_frame *buffer = &audio_data->buffer;
392
394 while(s->rec_buffer_start == s->rec_buffer_end);
395 //fprintf(stderr, "%d ", s->record.data_len);
396 int end = s->rec_buffer_end;
397
398 buffer->ch_count = s->record.ch_count;
399 buffer->bps = s->record.bps;
400 buffer->sample_rate = s->record.sample_rate;
401
402 buffer->data_len = end - s->rec_buffer_start;
403 if (buffer->data_len < 0) buffer->data_len += BUFF_SIZE;
404 buffer->data = (char *) malloc(buffer->data_len);
405
406 if (s->rec_buffer_start < end) {
407 memcpy(buffer->data, s->rec_buffer + s->rec_buffer_start,
408 buffer->data_len);
409 } else {
410 memcpy(buffer->data, s->rec_buffer + s->rec_buffer_start,
412 memcpy(buffer->data + BUFF_SIZE - s->rec_buffer_start,
413 s->rec_buffer,
414 buffer->data_len + BUFF_SIZE - s->rec_buffer_start);
415 }
417
418 return true;
419}
#define BUFF_SIZE
Definition jack.c:58
struct used to comunicate with audio capture/playback device
Definition types.h:99
int sample_rate
Definition types.h:101
char * data
Definition types.h:102
int ch_count
Definition types.h:104
int data_len
Definition types.h:103
int bps
Definition types.h:100
audio_frame buffer
Definition pbuf.h:99
struct audio_frame record
Definition jack.c:70
char * rec_buffer
Definition jack.c:75
volatile int rec_buffer_end
Definition jack.c:76
volatile int rec_buffer_start
Definition jack.c:76

References audio_frame::bps, BUFF_SIZE, pbuf_audio_data::buffer, audio_frame::ch_count, audio_frame::data, audio_frame::data_len, state_jack::rec_buffer, state_jack::rec_buffer_end, state_jack::rec_buffer_start, state_jack::record, audio_frame::sample_rate, and state.

Referenced by audio_receiver_thread().

◆ jack_send()

void jack_send ( void * s,
struct audio_frame * frame )

Definition at line 355 of file jack.c.

356{
357 //float *tmp = (char *) s->play_buffer + s->play_buffer_end;
358 struct state_jack *s = (struct state_jack *) state;
359 char *in_ptr = frame->data;
360
361 int i;
362
363 if(s->out_channel_count != frame->ch_count)
364 reconfigure_send_ch_count(s, frame->ch_count);
365
366 for(i = 0; i < frame->data_len; i+= frame->bps * frame->ch_count) {
367 int channels;
368 for (channels = 0; channels < s->out_channel_count; ++channels) {
369 float *pos = (float *)(void *) &s->play_buffer[channels][(s->play_buffer_end + i * 4
370 / (frame->ch_count * frame->bps)) % BUFF_SIZE];
371 *pos = (*((int *)(void *) (in_ptr + channels * frame->bps)) << (32 - frame->bps * 8)) / (float) INT_MAX;
372 }
373
374 in_ptr += frame->bps * frame->ch_count;
375 }
376 s->play_buffer_end = (s->play_buffer_end + frame->data_len / (frame->bps * frame->ch_count) * sizeof(float)) % BUFF_SIZE;
377}
int int channels
struct video_frame * frame
void reconfigure_send_ch_count(struct state_jack *s, int ch_count)
Definition jack.c:147
char * play_buffer[MAX_PORTS]
Definition jack.c:73
int play_buffer_end
Definition jack.c:74
int out_channel_count
Definition jack.c:85

References BUFF_SIZE, channels, frame, state_jack::out_channel_count, state_jack::play_buffer, state_jack::play_buffer_end, reconfigure_send_ch_count(), and state.

Referenced by audio_sender_thread().

Here is the call graph for this function:

◆ jack_start()

void * jack_start ( const char * cfg)

Definition at line 264 of file jack.c.

265{
266 struct state_jack *s;
267
268 s = (struct state_jack *) malloc(sizeof(struct state_jack));
269 assert (s != NULL);
270 s->libjack = open_libjack();
271 if (s->libjack == NULL) {
272 free(s);
273 return NULL;
274 }
275
276 s->in_port_pattern = NULL;
277 s->out_port_pattern = NULL;
278 s->in_ch_count = 1;
281 s->sender = FALSE;
282 s->receiver = FALSE;
283 s->out_channel_count = 0;
284
285 char *cfg_copy = strdup(cfg);
286 int ret = settings_init(s, cfg_copy);
287 free(cfg_copy);
288 if (ret != 0) {
289 log_msg(LOG_LEVEL_ERROR, MOD_NAME "Setting JACK failed. Check configuration ('-j' option).\n");
290 goto error;
291 }
292
293 if(!s->sender && !s->receiver) {
294 goto error;
295 }
296
297 s->client = s->libjack->client_open(CLIENT_NAME, JackNullOption, NULL);
298 if(s->libjack->set_process_callback(s->client, jack_process_callback, (void *) s) != 0) {
299 log_msg(LOG_LEVEL_ERROR, MOD_NAME "Callback initialization problem.\n");
300 goto error;
301 }
302
303 if(s->libjack->set_sample_rate_callback(s->client,
305 log_msg(LOG_LEVEL_ERROR, MOD_NAME "Sample rate callback initialization problem.\n");
306 goto error;
307 }
308
309 //jack_on_shutdown (client, jack_shutdown, 0);
310
311 if(s->sender) {
312 char name[30];
313 int i;
314
315 for(i = 0; i < MAX_PORTS; ++i) {
316 snprintf(name, 30, "out_%02u", i);
317 s->output_port[i] = s->libjack->port_register (s->client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
318 }
319
320 s->out_channel_count = s->out_channel_count_req = 0;
321 }
322
323 if(s->receiver) {
324 char name[30];
325 int i;
326
327 for(i = 0; i < s->in_ch_count; ++i) {
328 snprintf(name, 30, "in_%02u", i);
329 s->input_port[i] = s->libjack->port_register (s->client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
330 }
331
332 s->record.sample_rate = s->libjack->get_sample_rate (s->client);
333 s->record.bps = sizeof(int32_t);
334 s->record.ch_count = s->in_ch_count;
335 s->rec_buffer = s->record.data = (void *) malloc(BUFF_SIZE);
336 }
337
338 if (s->libjack->activate (s->client)) {
339 fprintf (stderr, "cannot activate client");
340 goto error;
341 }
342
343 if(s->receiver) {
344 if(!attach_input_ports(s))
345 goto error;
346 }
347
348 return s;
349error:
350 close_libjack(s->libjack);
351 free(s);
352 return NULL;
353}
static int jack_process_callback(jack_nframes_t nframes, void *arg)
Definition jack.c:89
static int jack_samplerate_changed_callback(jack_nframes_t nframes, void *arg)
Definition jack.c:80
#define MOD_NAME
Definition jack.c:54
@ MAX_PORTS
Definition jack.c:57
#define FALSE
void log_msg(int level, const char *format,...)
Definition debug.cpp:130
#define LOG_LEVEL_ERROR
general errors
Definition debug.h:59
static int attach_input_ports(struct state_jack *s)
Definition jack.c:237
#define CLIENT_NAME
Definition jack.c:56
static int settings_init(struct state_jack *s, char *cfg)
Definition jack.c:186
static void close_libjack(struct libjack_connection *s)
static struct libjack_connection * open_libjack(void)
const char * name
Definition settings.cpp:193
jack_client_open_t client_open
jack_set_process_callback_t set_process_callback
unsigned int sender
Definition jack.c:65
int play_buffer_start
Definition jack.c:74
int in_ch_count
Definition jack.c:82
unsigned int receiver
Definition jack.c:66
char * out_port_pattern
Definition jack.c:84
struct libjack_connection * libjack
Definition jack.c:63
char * in_port_pattern
Definition jack.c:81
jack_client_t * client
Definition jack.c:68

References libjack_connection::activate, attach_input_ports(), audio_frame::bps, BUFF_SIZE, audio_frame::ch_count, state_jack::client, CLIENT_NAME, libjack_connection::client_open, close_libjack(), audio_frame::data, FALSE, libjack_connection::get_sample_rate, state_jack::in_ch_count, state_jack::in_port_pattern, state_jack::input_port, jack_process_callback(), jack_samplerate_changed_callback(), state_jack::libjack, LOG_LEVEL_ERROR, log_msg(), MAX_PORTS, MOD_NAME, name, open_libjack(), state_jack::out_channel_count, state_jack::out_channel_count_req, state_jack::out_port_pattern, state_jack::output_port, state_jack::play_buffer_end, state_jack::play_buffer_start, libjack_connection::port_register, state_jack::rec_buffer, state_jack::rec_buffer_end, state_jack::rec_buffer_start, state_jack::receiver, state_jack::record, audio_frame::sample_rate, state_jack::sender, libjack_connection::set_process_callback, libjack_connection::set_sample_rate_callback, and settings_init().

Referenced by audio_start().

Here is the call graph for this function: