1 /*
2   [title]
3   \ref page_tutorial3
4   [title]
5  */
6 /* [code] */
7 #include <pipewire/pipewire.h>
8 
9 /* [roundtrip] */
roundtrip(struct pw_core * core,struct pw_main_loop * loop)10 static int roundtrip(struct pw_core *core, struct pw_main_loop *loop)
11 {
12         struct spa_hook core_listener;
13         int pending, done = 0;
14         void core_event_done(void *object, uint32_t id, int seq) {
15                 if (id == PW_ID_CORE && seq == pending) {
16                         done = 1;
17                         pw_main_loop_quit(loop);
18                 }
19         }
20         const struct pw_core_events core_events = {
21                 PW_VERSION_CORE_EVENTS,
22                 .done = core_event_done,
23         };
24 
25         spa_zero(core_listener);
26         pw_core_add_listener(core, &core_listener,
27                                  &core_events, NULL);
28 
29         pending = pw_core_sync(core, PW_ID_CORE, 0);
30 
31         while (!done) {
32                 pw_main_loop_run(loop);
33         }
34         spa_hook_remove(&core_listener);
35         return 0;
36 }
37 /* [roundtrip] */
38 
registry_event_global(void * data,uint32_t id,uint32_t permissions,const char * type,uint32_t version,const struct spa_dict * props)39 static void registry_event_global(void *data, uint32_t id,
40 		uint32_t permissions, const char *type, uint32_t version,
41 		const struct spa_dict *props)
42 {
43 	printf("object: id:%u type:%s/%d\n", id, type, version);
44 }
45 
46 static const struct pw_registry_events registry_events = {
47 	PW_VERSION_REGISTRY_EVENTS,
48 	.global = registry_event_global,
49 };
50 
main(int argc,char * argv[])51 int main(int argc, char *argv[])
52 {
53         struct pw_main_loop *loop;
54         struct pw_context *context;
55         struct pw_core *core;
56         struct pw_registry *registry;
57         struct spa_hook registry_listener;
58 
59         pw_init(&argc, &argv);
60 
61         loop = pw_main_loop_new(NULL /* properties */);
62         context = pw_context_new(pw_main_loop_get_loop(loop),
63                         NULL /* properties */,
64                         0 /* user_data size */);
65 
66         core = pw_context_connect(context,
67                         NULL /* properties */,
68                         0 /* user_data size */);
69 
70         registry = pw_core_get_registry(core, PW_VERSION_REGISTRY,
71                         0 /* user_data size */);
72 
73         spa_zero(registry_listener);
74         pw_registry_add_listener(registry, &registry_listener,
75                                        &registry_events, NULL);
76 
77         roundtrip(core, loop);
78 
79         pw_proxy_destroy((struct pw_proxy*)registry);
80         pw_core_disconnect(core);
81         pw_context_destroy(context);
82         pw_main_loop_destroy(loop);
83 
84         return 0;
85 }
86 /* [code] */
87