Lines Matching +full:memcpy +full:- +full:channels
28 #include "qemu/main-loop.h"
47 int channels; member
96 static void qjack_buffer_create(QJackBuffer *buffer, int channels, int frames) in qjack_buffer_create() argument
98 buffer->channels = channels; in qjack_buffer_create()
99 buffer->frames = frames; in qjack_buffer_create()
100 buffer->used = 0; in qjack_buffer_create()
101 buffer->rptr = 0; in qjack_buffer_create()
102 buffer->wptr = 0; in qjack_buffer_create()
103 buffer->data = g_new(float *, channels); in qjack_buffer_create()
104 for (int i = 0; i < channels; ++i) { in qjack_buffer_create()
105 buffer->data[i] = g_new(float, frames); in qjack_buffer_create()
111 assert(buffer->data); in qjack_buffer_clear()
112 qatomic_store_release(&buffer->used, 0); in qjack_buffer_clear()
113 buffer->rptr = 0; in qjack_buffer_clear()
114 buffer->wptr = 0; in qjack_buffer_clear()
119 if (!buffer->data) { in qjack_buffer_free()
123 for (int i = 0; i < buffer->channels; ++i) { in qjack_buffer_free()
124 g_free(buffer->data[i]); in qjack_buffer_free()
127 g_free(buffer->data); in qjack_buffer_free()
128 buffer->data = NULL; in qjack_buffer_free()
134 assert(buffer->data); in qjack_buffer_write()
136 int frames = samples / buffer->channels; in qjack_buffer_write()
137 const int avail = buffer->frames - qatomic_load_acquire(&buffer->used); in qjack_buffer_write()
144 int wptr = buffer->wptr; in qjack_buffer_write()
148 for (int c = 0; c < buffer->channels; ++c) { in qjack_buffer_write()
149 buffer->data[c][wptr] = *data++; in qjack_buffer_write()
152 if (++wptr == buffer->frames) { in qjack_buffer_write()
156 --copy; in qjack_buffer_write()
159 buffer->wptr = wptr; in qjack_buffer_write()
161 qatomic_add(&buffer->used, frames); in qjack_buffer_write()
162 return frames * buffer->channels * sizeof(float); in qjack_buffer_write()
168 assert(buffer->data); in qjack_buffer_write_l()
169 const int avail = buffer->frames - qatomic_load_acquire(&buffer->used); in qjack_buffer_write_l()
170 int wptr = buffer->wptr; in qjack_buffer_write_l()
176 int right = buffer->frames - wptr; in qjack_buffer_write_l()
181 const int left = frames - right; in qjack_buffer_write_l()
182 for (int c = 0; c < buffer->channels; ++c) { in qjack_buffer_write_l()
183 memcpy(buffer->data[c] + wptr, dest[c] , right * sizeof(float)); in qjack_buffer_write_l()
184 memcpy(buffer->data[c] , dest[c] + right, left * sizeof(float)); in qjack_buffer_write_l()
188 if (wptr >= buffer->frames) { in qjack_buffer_write_l()
189 wptr -= buffer->frames; in qjack_buffer_write_l()
191 buffer->wptr = wptr; in qjack_buffer_write_l()
193 qatomic_add(&buffer->used, frames); in qjack_buffer_write_l()
200 assert(buffer->data); in qjack_buffer_read()
202 int frames = samples / buffer->channels; in qjack_buffer_read()
203 const int avail = qatomic_load_acquire(&buffer->used); in qjack_buffer_read()
210 int rptr = buffer->rptr; in qjack_buffer_read()
214 for (int c = 0; c < buffer->channels; ++c) { in qjack_buffer_read()
215 *dest++ = buffer->data[c][rptr]; in qjack_buffer_read()
218 if (++rptr == buffer->frames) { in qjack_buffer_read()
222 --copy; in qjack_buffer_read()
225 buffer->rptr = rptr; in qjack_buffer_read()
227 qatomic_sub(&buffer->used, frames); in qjack_buffer_read()
228 return frames * buffer->channels * sizeof(float); in qjack_buffer_read()
234 assert(buffer->data); in qjack_buffer_read_l()
236 const int used = qatomic_load_acquire(&buffer->used); in qjack_buffer_read_l()
237 int rptr = buffer->rptr; in qjack_buffer_read_l()
243 int right = buffer->frames - rptr; in qjack_buffer_read_l()
248 const int left = copy - right; in qjack_buffer_read_l()
249 for (int c = 0; c < buffer->channels; ++c) { in qjack_buffer_read_l()
250 memcpy(dest[c] , buffer->data[c] + rptr, right * sizeof(float)); in qjack_buffer_read_l()
251 memcpy(dest[c] + right, buffer->data[c] , left * sizeof(float)); in qjack_buffer_read_l()
255 if (rptr >= buffer->frames) { in qjack_buffer_read_l()
256 rptr -= buffer->frames; in qjack_buffer_read_l()
258 buffer->rptr = rptr; in qjack_buffer_read_l()
260 qatomic_sub(&buffer->used, copy); in qjack_buffer_read_l()
268 if (c->state != QJACK_STATE_RUNNING) { in qjack_process()
273 for (int i = 0; i < c->nchannels; ++i) { in qjack_process()
274 c->process_buffers[i] = jack_port_get_buffer(c->port[i], nframes); in qjack_process()
277 if (c->out) { in qjack_process()
278 if (likely(c->enabled)) { in qjack_process()
279 qjack_buffer_read_l(&c->fifo, c->process_buffers, nframes); in qjack_process()
281 for (int i = 0; i < c->nchannels; ++i) { in qjack_process()
282 memset(c->process_buffers[i], 0, nframes * sizeof(float)); in qjack_process()
286 if (likely(c->enabled)) { in qjack_process()
287 qjack_buffer_write_l(&c->fifo, c->process_buffers, nframes); in qjack_process()
298 c->connect_ports = true; in qjack_port_registration()
305 if (c->state != QJACK_STATE_RUNNING) { in qjack_xrun()
309 qjack_buffer_clear(&c->fifo); in qjack_xrun()
322 c->state = QJACK_STATE_SHUTDOWN; in qjack_shutdown()
323 qemu_bh_schedule(c->shutdown_bh); in qjack_shutdown()
328 if (c->state != QJACK_STATE_DISCONNECTED) { in qjack_client_recover()
333 if (c->packets % 100 == 0) { in qjack_client_recover()
336 if (c->enabled) { in qjack_client_recover()
346 ++jo->c.packets; in qjack_write()
348 if (jo->c.state != QJACK_STATE_RUNNING) { in qjack_write()
349 qjack_client_recover(&jo->c); in qjack_write()
353 qjack_client_connect_ports(&jo->c); in qjack_write()
354 return qjack_buffer_write(&jo->c.fifo, buf, len); in qjack_write()
360 ++ji->c.packets; in qjack_read()
362 if (ji->c.state != QJACK_STATE_RUNNING) { in qjack_read()
363 qjack_client_recover(&ji->c); in qjack_read()
367 qjack_client_connect_ports(&ji->c); in qjack_read()
368 return qjack_buffer_read(&ji->c.fifo, buf, len); in qjack_read()
373 if (!c->connect_ports || !c->opt->connect_ports) { in qjack_client_connect_ports()
377 c->connect_ports = false; in qjack_client_connect_ports()
379 ports = jack_get_ports(c->client, c->opt->connect_ports, NULL, in qjack_client_connect_ports()
380 c->out ? JackPortIsInput : JackPortIsOutput); in qjack_client_connect_ports()
386 for (int i = 0; i < c->nchannels && ports[i]; ++i) { in qjack_client_connect_ports()
387 const char *p = jack_port_name(c->port[i]); in qjack_client_connect_ports()
388 if (jack_port_connected_to(c->port[i], ports[i])) { in qjack_client_connect_ports()
392 if (c->out) { in qjack_client_connect_ports()
393 dolog("connect %s -> %s\n", p, ports[i]); in qjack_client_connect_ports()
394 jack_connect(c->client, p, ports[i]); in qjack_client_connect_ports()
396 dolog("connect %s -> %s\n", ports[i], p); in qjack_client_connect_ports()
397 jack_connect(c->client, ports[i], p); in qjack_client_connect_ports()
409 if (c->state == QJACK_STATE_RUNNING) { in qjack_client_init()
413 c->connect_ports = true; in qjack_client_init()
415 snprintf(client_name, client_name_len, "%s-%s", in qjack_client_init()
416 c->out ? "out" : "in", in qjack_client_init()
417 c->opt->client_name ? c->opt->client_name : audio_application_name()); in qjack_client_init()
419 if (c->opt->exact_name) { in qjack_client_init()
423 if (!c->opt->start_server) { in qjack_client_init()
427 if (c->opt->server_name) { in qjack_client_init()
431 c->client = jack_client_open(client_name, options, &status, in qjack_client_init()
432 c->opt->server_name); in qjack_client_init()
434 if (c->client == NULL) { in qjack_client_init()
439 return -1; in qjack_client_init()
442 c->freq = jack_get_sample_rate(c->client); in qjack_client_init()
450 jack_get_client_name(c->client)); in qjack_client_init()
454 c->process_buffers = g_new(float *, c->nchannels); in qjack_client_init()
456 jack_set_process_callback(c->client, qjack_process , c); in qjack_client_init()
457 jack_set_port_registration_callback(c->client, qjack_port_registration, c); in qjack_client_init()
458 jack_set_xrun_callback(c->client, qjack_xrun, c); in qjack_client_init()
459 jack_on_shutdown(c->client, qjack_shutdown, c); in qjack_client_init()
462 c->port = g_new(jack_port_t *, c->nchannels); in qjack_client_init()
463 for (int i = 0; i < c->nchannels; ++i) { in qjack_client_init()
469 c->out ? "output %d" : "input %d", in qjack_client_init()
472 c->port[i] = jack_port_register( in qjack_client_init()
473 c->client, in qjack_client_init()
476 c->out ? JackPortIsOutput : JackPortIsInput, in qjack_client_init()
481 jack_activate(c->client); in qjack_client_init()
482 c->buffersize = jack_get_buffer_size(c->client); in qjack_client_init()
488 if (c->buffersize < 512) { in qjack_client_init()
489 c->buffersize = 512; in qjack_client_init()
493 qjack_buffer_create(&c->fifo, c->nchannels, c->buffersize * 3); in qjack_client_init()
496 c->state = QJACK_STATE_RUNNING; in qjack_client_init()
506 jo->c.out = true; in qjack_init_out()
507 jo->c.enabled = false; in qjack_init_out()
508 jo->c.nchannels = as->nchannels; in qjack_init_out()
509 jo->c.opt = dev->u.jack.out; in qjack_init_out()
511 jo->c.shutdown_bh = qemu_bh_new(qjack_shutdown_bh, &jo->c); in qjack_init_out()
513 int ret = qjack_client_init(&jo->c); in qjack_init_out()
515 qemu_bh_delete(jo->c.shutdown_bh); in qjack_init_out()
520 hw->samples = jo->c.buffersize; in qjack_init_out()
524 .freq = jo->c.freq, in qjack_init_out()
525 .nchannels = jo->c.nchannels, in qjack_init_out()
529 audio_pcm_init_info(&hw->info, &os); in qjack_init_out()
532 jo->c.freq, jo->c.buffersize); in qjack_init_out()
543 ji->c.out = false; in qjack_init_in()
544 ji->c.enabled = false; in qjack_init_in()
545 ji->c.nchannels = as->nchannels; in qjack_init_in()
546 ji->c.opt = dev->u.jack.in; in qjack_init_in()
548 ji->c.shutdown_bh = qemu_bh_new(qjack_shutdown_bh, &ji->c); in qjack_init_in()
550 int ret = qjack_client_init(&ji->c); in qjack_init_in()
552 qemu_bh_delete(ji->c.shutdown_bh); in qjack_init_in()
557 hw->samples = ji->c.buffersize; in qjack_init_in()
561 .freq = ji->c.freq, in qjack_init_in()
562 .nchannels = ji->c.nchannels, in qjack_init_in()
566 audio_pcm_init_info(&hw->info, &is); in qjack_init_in()
569 ji->c.freq, ji->c.buffersize); in qjack_init_in()
576 switch (c->state) { in qjack_client_fini_locked()
578 jack_deactivate(c->client); in qjack_client_fini_locked()
582 jack_client_close(c->client); in qjack_client_fini_locked()
583 c->client = NULL; in qjack_client_fini_locked()
585 qjack_buffer_free(&c->fifo); in qjack_client_fini_locked()
586 g_free(c->port); in qjack_client_fini_locked()
587 g_free(c->process_buffers); in qjack_client_fini_locked()
589 c->state = QJACK_STATE_DISCONNECTED; in qjack_client_fini_locked()
607 qjack_client_fini(&jo->c); in qjack_fini_out()
609 qemu_bh_delete(jo->c.shutdown_bh); in qjack_fini_out()
615 qjack_client_fini(&ji->c); in qjack_fini_in()
617 qemu_bh_delete(ji->c.shutdown_bh); in qjack_fini_in()
623 jo->c.enabled = enable; in qjack_enable_out()
629 ji->c.enabled = enable; in qjack_enable_in()
642 pthread_setname_np(*thread, "jack-client"); in qjack_thread_creator()
650 assert(dev->driver == AUDIODEV_DRIVER_JACK); in qjack_init()