Lines Matching +full:multi +full:- +full:attr

80             qpa_logerr(pa_context_errno((c)->context), msg);    \
87 if (!(c)->context || !PA_CONTEXT_IS_GOOD (pa_context_get_state((c)->context)) || \
89 if (((c)->context && pa_context_get_state ((c)->context) == PA_CONTEXT_FAILED) || \
91 qpa_logerr(pa_context_errno((c)->context), msg); \
102 PAConnection *c = p->g->conn; in qpa_get_buffer_in()
105 pa_threaded_mainloop_lock(c->mainloop); in qpa_get_buffer_in()
107 CHECK_DEAD_GOTO(c, p->stream, unlock_and_fail, in qpa_get_buffer_in()
110 if (!p->read_length) { in qpa_get_buffer_in()
111 r = pa_stream_peek(p->stream, &p->read_data, &p->read_length); in qpa_get_buffer_in()
116 *size = MIN(p->read_length, *size); in qpa_get_buffer_in()
118 pa_threaded_mainloop_unlock(c->mainloop); in qpa_get_buffer_in()
119 return (void *) p->read_data; in qpa_get_buffer_in()
122 pa_threaded_mainloop_unlock(c->mainloop); in qpa_get_buffer_in()
130 PAConnection *c = p->g->conn; in qpa_put_buffer_in()
133 pa_threaded_mainloop_lock(c->mainloop); in qpa_put_buffer_in()
135 CHECK_DEAD_GOTO(c, p->stream, unlock, in qpa_put_buffer_in()
138 assert(buf == p->read_data && size <= p->read_length); in qpa_put_buffer_in()
140 p->read_data += size; in qpa_put_buffer_in()
141 p->read_length -= size; in qpa_put_buffer_in()
143 if (size && !p->read_length) { in qpa_put_buffer_in()
144 r = pa_stream_drop(p->stream); in qpa_put_buffer_in()
149 pa_threaded_mainloop_unlock(c->mainloop); in qpa_put_buffer_in()
155 PAConnection *c = p->g->conn; in qpa_read()
158 pa_threaded_mainloop_lock(c->mainloop); in qpa_read()
160 CHECK_DEAD_GOTO(c, p->stream, unlock_and_fail, in qpa_read()
162 if (pa_stream_get_state(p->stream) != PA_STREAM_READY) { in qpa_read()
171 if (!p->read_length) { in qpa_read()
172 r = pa_stream_peek(p->stream, &p->read_data, &p->read_length); in qpa_read()
175 if (!p->read_length) { in qpa_read()
181 l = MIN(p->read_length, length - total); in qpa_read()
182 memcpy((char *)data + total, p->read_data, l); in qpa_read()
184 p->read_data += l; in qpa_read()
185 p->read_length -= l; in qpa_read()
188 if (!p->read_length) { in qpa_read()
189 r = pa_stream_drop(p->stream); in qpa_read()
196 pa_threaded_mainloop_unlock(c->mainloop); in qpa_read()
200 pa_threaded_mainloop_unlock(c->mainloop); in qpa_read()
207 PAConnection *c = p->g->conn; in qpa_buffer_get_free()
210 pa_threaded_mainloop_lock(c->mainloop); in qpa_buffer_get_free()
212 CHECK_DEAD_GOTO(c, p->stream, unlock_and_fail, in qpa_buffer_get_free()
214 if (pa_stream_get_state(p->stream) != PA_STREAM_READY) { in qpa_buffer_get_free()
220 l = pa_stream_writable_size(p->stream); in qpa_buffer_get_free()
221 CHECK_SUCCESS_GOTO(c, l != (size_t) -1, unlock_and_fail, in qpa_buffer_get_free()
225 pa_threaded_mainloop_unlock(c->mainloop); in qpa_buffer_get_free()
229 pa_threaded_mainloop_unlock(c->mainloop); in qpa_buffer_get_free()
236 PAConnection *c = p->g->conn; in qpa_get_buffer_out()
240 pa_threaded_mainloop_lock(c->mainloop); in qpa_get_buffer_out()
242 CHECK_DEAD_GOTO(c, p->stream, unlock_and_fail, in qpa_get_buffer_out()
245 *size = -1; in qpa_get_buffer_out()
246 r = pa_stream_begin_write(p->stream, &ret, size); in qpa_get_buffer_out()
250 pa_threaded_mainloop_unlock(c->mainloop); in qpa_get_buffer_out()
254 pa_threaded_mainloop_unlock(c->mainloop); in qpa_get_buffer_out()
262 PAConnection *c = p->g->conn; in qpa_put_buffer_out()
265 pa_threaded_mainloop_lock(c->mainloop); in qpa_put_buffer_out()
267 CHECK_DEAD_GOTO(c, p->stream, unlock_and_fail, in qpa_put_buffer_out()
270 r = pa_stream_write(p->stream, data, length, NULL, 0LL, PA_SEEK_RELATIVE); in qpa_put_buffer_out()
273 pa_threaded_mainloop_unlock(c->mainloop); in qpa_put_buffer_out()
277 pa_threaded_mainloop_unlock(c->mainloop); in qpa_put_buffer_out()
284 PAConnection *c = p->g->conn; in qpa_write()
288 pa_threaded_mainloop_lock(c->mainloop); in qpa_write()
290 CHECK_DEAD_GOTO(c, p->stream, unlock_and_fail, in qpa_write()
292 if (pa_stream_get_state(p->stream) != PA_STREAM_READY) { in qpa_write()
298 l = pa_stream_writable_size(p->stream); in qpa_write()
300 CHECK_SUCCESS_GOTO(c, l != (size_t) -1, unlock_and_fail, in qpa_write()
307 r = pa_stream_write(p->stream, data, l, NULL, 0LL, PA_SEEK_RELATIVE); in qpa_write()
311 pa_threaded_mainloop_unlock(c->mainloop); in qpa_write()
315 pa_threaded_mainloop_unlock(c->mainloop); in qpa_write()
384 pa_threaded_mainloop_signal(conn->mainloop, 0); in context_state_cb()
404 pa_threaded_mainloop_signal(c->mainloop, 0); in stream_state_cb()
419 const pa_buffer_attr *attr, in qpa_simple_new() argument
427 pa_threaded_mainloop_lock(c->mainloop); in qpa_simple_new()
430 map.channels = ss->channels; in qpa_simple_new()
434 * channels is the usb-audio. We will need some means to set channel in qpa_simple_new()
435 * order when a new frontend gains multi-channel support. in qpa_simple_new()
437 switch (ss->channels) { in qpa_simple_new()
468 dolog("Internal error: unsupported channel count %d\n", ss->channels); in qpa_simple_new()
472 stream = pa_stream_new(c->context, name, ss, &map); in qpa_simple_new()
487 r = pa_stream_connect_playback(stream, dev, attr, flags, NULL, NULL); in qpa_simple_new()
489 r = pa_stream_connect_record(stream, dev, attr, flags); in qpa_simple_new()
496 pa_threaded_mainloop_unlock(c->mainloop); in qpa_simple_new()
501 pa_threaded_mainloop_unlock(c->mainloop); in qpa_simple_new()
507 *rerror = pa_context_errno(c->context); in qpa_simple_new()
520 paaudio *g = pa->g = drv_opaque; in qpa_init_out()
521 AudiodevPaOptions *popts = &g->dev->u.pa; in qpa_init_out()
522 AudiodevPaPerDirectionOptions *ppdo = popts->out; in qpa_init_out()
523 PAConnection *c = g->conn; in qpa_init_out()
525 ss.format = audfmt_to_pa (as->fmt, as->endianness); in qpa_init_out()
526 ss.channels = as->nchannels; in qpa_init_out()
527 ss.rate = as->freq; in qpa_init_out()
529 ba.tlength = pa_usec_to_bytes(ppdo->latency, &ss); in qpa_init_out()
530 ba.minreq = pa_usec_to_bytes(MIN(ppdo->latency >> 2, in qpa_init_out()
531 (g->dev->timer_period >> 2) * 3), &ss); in qpa_init_out()
532 ba.maxlength = -1; in qpa_init_out()
533 ba.prebuf = -1; in qpa_init_out()
537 pa->stream = qpa_simple_new ( in qpa_init_out()
539 ppdo->stream_name ?: g->dev->id, in qpa_init_out()
541 ppdo->name, in qpa_init_out()
546 if (!pa->stream) { in qpa_init_out()
551 audio_pcm_init_info (&hw->info, &obt_as); in qpa_init_out()
552 /* hw->samples counts in frames */ in qpa_init_out()
553 hw->samples = audio_buffer_frames( in qpa_init_out()
559 return -1; in qpa_init_out()
569 paaudio *g = pa->g = drv_opaque; in qpa_init_in()
570 AudiodevPaOptions *popts = &g->dev->u.pa; in qpa_init_in()
571 AudiodevPaPerDirectionOptions *ppdo = popts->in; in qpa_init_in()
572 PAConnection *c = g->conn; in qpa_init_in()
574 ss.format = audfmt_to_pa (as->fmt, as->endianness); in qpa_init_in()
575 ss.channels = as->nchannels; in qpa_init_in()
576 ss.rate = as->freq; in qpa_init_in()
578 ba.fragsize = pa_usec_to_bytes((g->dev->timer_period >> 1) * 3, &ss); in qpa_init_in()
580 MAX(ppdo->latency, g->dev->timer_period * 3), &ss); in qpa_init_in()
581 ba.minreq = -1; in qpa_init_in()
582 ba.prebuf = -1; in qpa_init_in()
586 pa->stream = qpa_simple_new ( in qpa_init_in()
588 ppdo->stream_name ?: g->dev->id, in qpa_init_in()
590 ppdo->name, in qpa_init_in()
595 if (!pa->stream) { in qpa_init_in()
600 audio_pcm_init_info (&hw->info, &obt_as); in qpa_init_in()
601 /* hw->samples counts in frames */ in qpa_init_in()
602 hw->samples = audio_buffer_frames( in qpa_init_in()
608 return -1; in qpa_init_in()
620 pa_threaded_mainloop_wait(c->mainloop); in qpa_simple_disconnect()
634 if (pa->stream) { in qpa_fini_out()
635 PAConnection *c = pa->g->conn; in qpa_fini_out()
637 pa_threaded_mainloop_lock(c->mainloop); in qpa_fini_out()
638 qpa_simple_disconnect(c, pa->stream); in qpa_fini_out()
639 pa->stream = NULL; in qpa_fini_out()
640 pa_threaded_mainloop_unlock(c->mainloop); in qpa_fini_out()
648 if (pa->stream) { in qpa_fini_in()
649 PAConnection *c = pa->g->conn; in qpa_fini_in()
651 pa_threaded_mainloop_lock(c->mainloop); in qpa_fini_in()
652 if (pa->read_length) { in qpa_fini_in()
653 int r = pa_stream_drop(pa->stream); in qpa_fini_in()
655 qpa_logerr(pa_context_errno(c->context), in qpa_fini_in()
658 pa->read_length = 0; in qpa_fini_in()
660 qpa_simple_disconnect(c, pa->stream); in qpa_fini_in()
661 pa->stream = NULL; in qpa_fini_in()
662 pa_threaded_mainloop_unlock(c->mainloop); in qpa_fini_in()
671 PAConnection *c = pa->g->conn; in qpa_volume_out()
678 v.channels = vol->channels; in qpa_volume_out()
679 for (i = 0; i < vol->channels; ++i) { in qpa_volume_out()
680 v.values[i] = ((PA_VOLUME_NORM - PA_VOLUME_MUTED) * vol->vol[i]) / 255; in qpa_volume_out()
683 pa_threaded_mainloop_lock(c->mainloop); in qpa_volume_out()
685 op = pa_context_set_sink_input_volume(c->context, in qpa_volume_out()
686 pa_stream_get_index(pa->stream), in qpa_volume_out()
689 qpa_logerr(pa_context_errno(c->context), in qpa_volume_out()
695 op = pa_context_set_sink_input_mute(c->context, in qpa_volume_out()
696 pa_stream_get_index(pa->stream), in qpa_volume_out()
697 vol->mute, NULL, NULL); in qpa_volume_out()
699 qpa_logerr(pa_context_errno(c->context), in qpa_volume_out()
705 pa_threaded_mainloop_unlock(c->mainloop); in qpa_volume_out()
713 PAConnection *c = pa->g->conn; in qpa_volume_in()
720 v.channels = vol->channels; in qpa_volume_in()
721 for (i = 0; i < vol->channels; ++i) { in qpa_volume_in()
722 v.values[i] = ((PA_VOLUME_NORM - PA_VOLUME_MUTED) * vol->vol[i]) / 255; in qpa_volume_in()
725 pa_threaded_mainloop_lock(c->mainloop); in qpa_volume_in()
727 op = pa_context_set_source_output_volume(c->context, in qpa_volume_in()
728 pa_stream_get_index(pa->stream), in qpa_volume_in()
731 qpa_logerr(pa_context_errno(c->context), in qpa_volume_in()
737 op = pa_context_set_source_output_mute(c->context, in qpa_volume_in()
738 pa_stream_get_index(pa->stream), in qpa_volume_in()
739 vol->mute, NULL, NULL); in qpa_volume_in()
741 qpa_logerr(pa_context_errno(c->context), in qpa_volume_in()
747 pa_threaded_mainloop_unlock(c->mainloop); in qpa_volume_in()
753 if (!pdo->has_latency) { in qpa_validate_per_direction_opts()
754 pdo->has_latency = true; in qpa_validate_per_direction_opts()
755 pdo->latency = 46440; in qpa_validate_per_direction_opts()
766 c->mainloop = pa_threaded_mainloop_new(); in qpa_conn_init()
767 if (!c->mainloop) { in qpa_conn_init()
771 c->context = pa_context_new(pa_threaded_mainloop_get_api(c->mainloop), in qpa_conn_init()
773 if (!c->context) { in qpa_conn_init()
777 pa_context_set_state_callback(c->context, context_state_cb, c); in qpa_conn_init()
779 if (pa_context_connect(c->context, server, 0, NULL) < 0) { in qpa_conn_init()
780 qpa_logerr(pa_context_errno(c->context), in qpa_conn_init()
785 pa_threaded_mainloop_lock(c->mainloop); in qpa_conn_init()
787 if (pa_threaded_mainloop_start(c->mainloop) < 0) { in qpa_conn_init()
794 state = pa_context_get_state(c->context); in qpa_conn_init()
801 qpa_logerr(pa_context_errno(c->context), in qpa_conn_init()
807 pa_threaded_mainloop_wait(c->mainloop); in qpa_conn_init()
810 pa_threaded_mainloop_unlock(c->mainloop); in qpa_conn_init()
814 pa_threaded_mainloop_unlock(c->mainloop); in qpa_conn_init()
824 AudiodevPaOptions *popts = &dev->u.pa; in qpa_audio_init()
828 assert(dev->driver == AUDIODEV_DRIVER_PA); in qpa_audio_init()
830 if (!popts->server) { in qpa_audio_init()
847 if (!qpa_validate_per_direction_opts(dev, popts->in)) { in qpa_audio_init()
850 if (!qpa_validate_per_direction_opts(dev, popts->out)) { in qpa_audio_init()
855 server = popts->server; in qpa_audio_init()
857 g->dev = dev; in qpa_audio_init()
860 if (server == NULL || c->server == NULL ? in qpa_audio_init()
861 server == c->server : in qpa_audio_init()
862 strcmp(server, c->server) == 0) { in qpa_audio_init()
863 g->conn = c; in qpa_audio_init()
867 if (!g->conn) { in qpa_audio_init()
868 g->conn = qpa_conn_init(server); in qpa_audio_init()
870 if (!g->conn) { in qpa_audio_init()
876 ++g->conn->refcount; in qpa_audio_init()
882 if (c->mainloop) { in qpa_conn_fini()
883 pa_threaded_mainloop_stop(c->mainloop); in qpa_conn_fini()
886 if (c->context) { in qpa_conn_fini()
887 pa_context_disconnect(c->context); in qpa_conn_fini()
888 pa_context_unref(c->context); in qpa_conn_fini()
891 if (c->mainloop) { in qpa_conn_fini()
892 pa_threaded_mainloop_free(c->mainloop); in qpa_conn_fini()
902 PAConnection *c = g->conn; in qpa_audio_fini()
904 if (--c->refcount == 0) { in qpa_audio_fini()