-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathm5_main.c
142 lines (116 loc) · 2.69 KB
/
m5_main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
* Copyright (C) 2010 Felipe Contreras
*
* This code is licenced under the LGPLv2.1.
*/
#include <glib.h>
#include <libmafw/mafw.h>
#include <libmafw-shared/mafw-shared.h>
#include <gio/gio.h>
#include <conic.h>
#include <dbus/dbus.h>
#include <dbus/dbus-glib-lowlevel.h>
#include <string.h>
#include <signal.h>
#include <stdbool.h>
#include "scrobble.h"
#include "service.h"
#include "helper.h"
static GMainLoop *main_loop;
static struct sr_service *dbus_service;
static void
metadata_callback(MafwRenderer *self,
const gchar *object_id,
GHashTable *metadata,
void *user_data,
const GError *error)
{
hp_submit();
sr_service_next(dbus_service);
}
static void
metadata_changed_cb(MafwRenderer *renderer,
const gchar *name,
GValueArray *value_array,
void *data)
{
GValue *value = g_value_array_get_nth(value_array, 0);
if (strcmp(name, "artist") == 0)
hp_set_artist(g_value_get_string(value));
else if (strcmp(name, "title") == 0)
hp_set_title(g_value_get_string(value));
else if (strcmp(name, "duration") == 0)
hp_set_length(g_value_get_int64(value));
else if (strcmp(name, "album") == 0)
hp_set_album(g_value_get_string(value));
else if (strcmp(name, "video-codec") == 0)
/* skip */
hp_set_title(NULL);
}
static void
state_changed_cb(MafwRenderer *renderer,
MafwPlayState state,
void *user_data)
{
switch (state) {
case Playing:
hp_set_timestamp();
mafw_renderer_get_current_metadata(renderer,
metadata_callback,
user_data);
break;
case Stopped:
hp_stop();
break;
default:
break;
}
}
static void
renderer_added_cb(MafwRegistry *registry,
GObject *renderer,
void *user_data)
{
const gchar *name;
if (!MAFW_IS_RENDERER(renderer))
return;
name = mafw_extension_get_name(MAFW_EXTENSION(renderer));
if (strcmp(name, "Mafw-Gst-Renderer") != 0)
return;
g_signal_connect(renderer,
"state-changed",
G_CALLBACK(state_changed_cb),
user_data);
g_signal_connect(renderer,
"metadata-changed",
G_CALLBACK(metadata_changed_cb),
user_data);
}
static void
signal_handler(int signal)
{
g_main_loop_quit(main_loop);
}
int main(void)
{
GError *error = NULL;
MafwRegistry *registry;
hp_init();
registry = MAFW_REGISTRY(mafw_registry_get_instance());
if (!registry)
g_error("Failed to get register");
mafw_shared_init(registry, &error);
if (error)
g_error("Failed to initialize the shared library");
g_signal_connect(registry,
"renderer-added",
G_CALLBACK(renderer_added_cb), NULL);
dbus_service = g_object_new(SR_SERVICE_TYPE, NULL);
signal(SIGINT, signal_handler);
main_loop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(main_loop);
g_object_unref(dbus_service);
g_main_loop_unref(main_loop);
hp_deinit();
return 0;
}