void destroy_pavn(pararray_vn** pavn) { int cnt; if (*pavn != NULL) { destroy_vn(&(*pavn)->result); for (cnt = 0; cnt < (*pavn)->elements; cnt ++) destroy_pa(&(*pavn)->pa[cnt]); btfree((void**)pavn); } }
int soundio_pulseaudio_init(struct SoundIoPrivate *si) { struct SoundIo *soundio = &si->pub; struct SoundIoPulseAudio *sipa = &si->backend_data.pulseaudio; sipa->device_scan_queued = true; sipa->main_loop = pa_threaded_mainloop_new(); if (!sipa->main_loop) { destroy_pa(si); return SoundIoErrorNoMem; } pa_mainloop_api *main_loop_api = pa_threaded_mainloop_get_api(sipa->main_loop); sipa->props = pa_proplist_new(); if (!sipa->props) { destroy_pa(si); return SoundIoErrorNoMem; } sipa->pulse_context = pa_context_new_with_proplist(main_loop_api, soundio->app_name, sipa->props); if (!sipa->pulse_context) { destroy_pa(si); return SoundIoErrorNoMem; } pa_context_set_subscribe_callback(sipa->pulse_context, subscribe_callback, si); pa_context_set_state_callback(sipa->pulse_context, context_state_callback, si); int err = pa_context_connect(sipa->pulse_context, NULL, (pa_context_flags_t)0, NULL); if (err) { destroy_pa(si); return SoundIoErrorInitAudioBackend; } if (pa_threaded_mainloop_start(sipa->main_loop)) { destroy_pa(si); return SoundIoErrorNoMem; } pa_threaded_mainloop_lock(sipa->main_loop); // block until ready while (!sipa->ready_flag) pa_threaded_mainloop_wait(sipa->main_loop); if (sipa->connection_err) { pa_threaded_mainloop_unlock(sipa->main_loop); destroy_pa(si); return sipa->connection_err; } if ((err = subscribe_to_events(si))) { pa_threaded_mainloop_unlock(sipa->main_loop); destroy_pa(si); return err; } pa_threaded_mainloop_unlock(sipa->main_loop); si->destroy = destroy_pa; si->flush_events = flush_events_pa; si->wait_events = wait_events_pa; si->wakeup = wakeup_pa; si->force_device_scan = force_device_scan_pa; si->outstream_open = outstream_open_pa; si->outstream_destroy = outstream_destroy_pa; si->outstream_start = outstream_start_pa; si->outstream_begin_write = outstream_begin_write_pa; si->outstream_end_write = outstream_end_write_pa; si->outstream_clear_buffer = outstream_clear_buffer_pa; si->outstream_pause = outstream_pause_pa; si->outstream_get_latency = outstream_get_latency_pa; si->instream_open = instream_open_pa; si->instream_destroy = instream_destroy_pa; si->instream_start = instream_start_pa; si->instream_begin_read = instream_begin_read_pa; si->instream_end_read = instream_end_read_pa; si->instream_pause = instream_pause_pa; si->instream_get_latency = instream_get_latency_pa; return 0; }