mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-05 13:30:02 -05:00
implement more api
This commit is contained in:
parent
b90101bf5b
commit
2254a124af
4 changed files with 603 additions and 139 deletions
146
src/mainloop.c
146
src/mainloop.c
|
|
@ -32,68 +32,183 @@ static void do_stop(void *data, uint64_t count)
|
|||
this->quit = true;
|
||||
}
|
||||
|
||||
static enum spa_io map_flags_to_spa(pa_io_event_flags_t flags) {
|
||||
return (enum spa_io)
|
||||
((flags & PA_IO_EVENT_INPUT ? SPA_IO_IN : 0) |
|
||||
(flags & PA_IO_EVENT_OUTPUT ? SPA_IO_OUT : 0) |
|
||||
(flags & PA_IO_EVENT_ERROR ? SPA_IO_ERR : 0) |
|
||||
(flags & PA_IO_EVENT_HANGUP ? SPA_IO_HUP : 0));
|
||||
}
|
||||
|
||||
static pa_io_event_flags_t map_flags_from_spa(enum spa_io flags) {
|
||||
return (flags & SPA_IO_IN ? PA_IO_EVENT_INPUT : 0) |
|
||||
(flags & SPA_IO_OUT ? PA_IO_EVENT_OUTPUT : 0) |
|
||||
(flags & SPA_IO_ERR ? PA_IO_EVENT_ERROR : 0) |
|
||||
(flags & SPA_IO_HUP ? PA_IO_EVENT_HANGUP : 0);
|
||||
}
|
||||
|
||||
static void source_io_func(void *data, int fd, enum spa_io mask)
|
||||
{
|
||||
pa_io_event *ev = data;
|
||||
if (ev->cb)
|
||||
ev->cb(&ev->mainloop->api, ev, ev->fd, map_flags_from_spa(mask), ev->userdata);
|
||||
}
|
||||
|
||||
static pa_io_event* api_io_new(pa_mainloop_api*a, int fd, pa_io_event_flags_t events, pa_io_event_cb_t cb, void *userdata)
|
||||
{
|
||||
pw_log_warn("Not Implemented");
|
||||
return NULL;
|
||||
pa_mainloop *mainloop = SPA_CONTAINER_OF(a, pa_mainloop, api);
|
||||
pa_io_event *ev;
|
||||
|
||||
pa_assert(a);
|
||||
pa_assert(fd >= 0);
|
||||
pa_assert(cb);
|
||||
|
||||
ev = calloc(1, sizeof(pa_io_event));
|
||||
ev->source = pw_loop_add_io(mainloop->loop, fd,
|
||||
map_flags_to_spa(events), false, source_io_func, ev);
|
||||
ev->fd = fd;
|
||||
ev->events = events;
|
||||
ev->mainloop = mainloop;
|
||||
ev->cb = cb;
|
||||
ev->userdata = userdata;
|
||||
|
||||
return ev;
|
||||
}
|
||||
|
||||
static void api_io_enable(pa_io_event* e, pa_io_event_flags_t events)
|
||||
{
|
||||
pw_log_warn("Not Implemented");
|
||||
pa_assert(e);
|
||||
|
||||
if (e->events == events)
|
||||
return;
|
||||
|
||||
e->events = events;
|
||||
pw_loop_update_io(e->mainloop->loop, e->source, map_flags_to_spa(events));
|
||||
}
|
||||
|
||||
static void api_io_free(pa_io_event* e)
|
||||
{
|
||||
pw_log_warn("Not Implemented");
|
||||
pa_assert(e);
|
||||
pw_loop_destroy_source(e->mainloop->loop, e->source);
|
||||
if (e->destroy)
|
||||
e->destroy(&e->mainloop->api, e, e->userdata);
|
||||
free(e);
|
||||
}
|
||||
|
||||
static void api_io_set_destroy(pa_io_event *e, pa_io_event_destroy_cb_t cb)
|
||||
{
|
||||
pw_log_warn("Not Implemented");
|
||||
pa_assert(e);
|
||||
e->destroy = cb;
|
||||
}
|
||||
|
||||
static void source_timer_func(void *data, uint64_t expirations)
|
||||
{
|
||||
pa_time_event *ev = data;
|
||||
struct timeval tv;
|
||||
if (ev->cb)
|
||||
ev->cb(&ev->mainloop->api, ev, &tv, ev->userdata);
|
||||
}
|
||||
|
||||
static pa_time_event* api_time_new(pa_mainloop_api*a, const struct timeval *tv, pa_time_event_cb_t cb, void *userdata)
|
||||
{
|
||||
pw_log_warn("Not Implemented");
|
||||
return NULL;
|
||||
pa_mainloop *mainloop = SPA_CONTAINER_OF(a, pa_mainloop, api);
|
||||
pa_time_event *ev;
|
||||
struct timespec ts;
|
||||
|
||||
ev = calloc(1, sizeof(pa_time_event));
|
||||
ev->source = pw_loop_add_timer(mainloop->loop, source_timer_func, ev);
|
||||
ev->mainloop = mainloop;
|
||||
ev->cb = cb;
|
||||
ev->userdata = userdata;
|
||||
|
||||
if (tv == NULL) {
|
||||
ts.tv_sec = 0;
|
||||
ts.tv_nsec = 1;
|
||||
}
|
||||
else {
|
||||
ts.tv_sec = tv->tv_sec;
|
||||
ts.tv_nsec = tv->tv_usec * 1000LL;
|
||||
}
|
||||
pw_loop_update_timer(mainloop->loop, ev->source, &ts, NULL, true);
|
||||
|
||||
return ev;
|
||||
}
|
||||
|
||||
static void api_time_restart(pa_time_event* e, const struct timeval *tv)
|
||||
{
|
||||
pw_log_warn("Not Implemented");
|
||||
struct timespec ts;
|
||||
|
||||
pa_assert(e);
|
||||
|
||||
if (tv == NULL) {
|
||||
ts.tv_sec = 0;
|
||||
ts.tv_nsec = 1;
|
||||
}
|
||||
else {
|
||||
ts.tv_sec = tv->tv_sec;
|
||||
ts.tv_nsec = tv->tv_usec * 1000LL;
|
||||
}
|
||||
pw_loop_update_timer(e->mainloop->loop, e->source, &ts, NULL, true);
|
||||
}
|
||||
|
||||
static void api_time_free(pa_time_event* e)
|
||||
{
|
||||
pw_log_warn("Not Implemented");
|
||||
pa_assert(e);
|
||||
pw_loop_destroy_source(e->mainloop->loop, e->source);
|
||||
if (e->destroy)
|
||||
e->destroy(&e->mainloop->api, e, e->userdata);
|
||||
free(e);
|
||||
}
|
||||
|
||||
static void api_time_set_destroy(pa_time_event *e, pa_time_event_destroy_cb_t cb)
|
||||
{
|
||||
pw_log_warn("Not Implemented");
|
||||
pa_assert(e);
|
||||
e->destroy = cb;
|
||||
}
|
||||
|
||||
static void source_idle_func(void *data)
|
||||
{
|
||||
pa_defer_event *ev = data;
|
||||
if (ev->cb)
|
||||
ev->cb(&ev->mainloop->api, ev, ev->userdata);
|
||||
}
|
||||
|
||||
static pa_defer_event* api_defer_new(pa_mainloop_api*a, pa_defer_event_cb_t cb, void *userdata)
|
||||
{
|
||||
pw_log_warn("Not Implemented");
|
||||
return NULL;
|
||||
pa_mainloop *mainloop = SPA_CONTAINER_OF(a, pa_mainloop, api);
|
||||
pa_defer_event *ev;
|
||||
|
||||
pa_assert(a);
|
||||
pa_assert(cb);
|
||||
|
||||
ev = calloc(1, sizeof(pa_defer_event));
|
||||
ev->source = pw_loop_add_idle(mainloop->loop, true, source_idle_func, ev);
|
||||
ev->mainloop = mainloop;
|
||||
ev->cb = cb;
|
||||
ev->userdata = userdata;
|
||||
|
||||
return ev;
|
||||
}
|
||||
|
||||
static void api_defer_enable(pa_defer_event* e, int b)
|
||||
{
|
||||
pw_log_warn("Not Implemented");
|
||||
pa_assert(e);
|
||||
pw_loop_enable_idle(e->mainloop->loop, e->source, b ? true : false);
|
||||
}
|
||||
|
||||
static void api_defer_free(pa_defer_event* e)
|
||||
{
|
||||
pw_log_warn("Not Implemented");
|
||||
pa_assert(e);
|
||||
pw_loop_destroy_source(e->mainloop->loop, e->source);
|
||||
if (e->destroy)
|
||||
e->destroy(&e->mainloop->api, e, e->userdata);
|
||||
free(e);
|
||||
}
|
||||
|
||||
static void api_defer_set_destroy(pa_defer_event *e, pa_defer_event_destroy_cb_t cb)
|
||||
{
|
||||
pw_log_warn("Not Implemented");
|
||||
pa_assert(e);
|
||||
e->destroy = cb;
|
||||
}
|
||||
|
||||
static void api_quit(pa_mainloop_api*a, int retval)
|
||||
|
|
@ -122,7 +237,6 @@ static const pa_mainloop_api api =
|
|||
.defer_set_destroy = api_defer_set_destroy,
|
||||
|
||||
.quit = api_quit,
|
||||
|
||||
};
|
||||
|
||||
pa_mainloop *pa_mainloop_new(void)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue