2 * Copyright 2017 Konsulko Group
4 * Based on bluetooth-manager.c
5 * Copyright 2016 ALPS ELECTRIC CO., LTD.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
24 #include <sys/types.h>
30 #include <glib-object.h>
33 #include "mediaplayer-manager.h"
35 static Binding_RegisterCallback_t g_RegisterCallback = { 0 };
36 static stMediaPlayerManage MediaPlayerManage = { 0 };
38 /* ------ LOCAL FUNCTIONS --------- */
40 g_mutex_lock(&(MediaPlayerManage.m));
44 g_mutex_unlock(&(MediaPlayerManage.m));
47 void DebugTraceSendMsg(int level, gchar* message)
49 #ifdef LOCAL_PRINT_DEBUG
56 case DT_LEVEL_WARNING:
77 g_print("%s",message);
86 GList* media_local_scan(GList *list)
88 gchar *path = g_strconcat(g_get_home_dir(), "/", "Music", NULL);
92 dir = g_dir_open(path, 0, NULL);
95 LOGE("Cannot open media path %s\n", path);
99 while ((tmp = (gchar *) g_dir_read_name(dir)) != NULL)
101 list = g_list_append(list, g_strdup_printf("file://%s/%s", path, tmp));
110 GList* media_lightmediascanner_scan(void)
116 const gchar *db_path;
119 db_path = scanner1_get_data_base_path(MediaPlayerManage.lms_proxy);
121 ret = sqlite3_open(db_path, &conn);
123 LOGE("Cannot open SQLITE database: '%s'\n", db_path);
127 ret = sqlite3_prepare_v2(conn, SQL_QUERY, strlen(SQL_QUERY) + 1, &res, &tail);
129 LOGE("Cannot execute query '%s'\n", SQL_QUERY);
133 while (sqlite3_step(res) == SQLITE_ROW) {
135 const char *path = (const char *) sqlite3_column_text(res, 0);
137 ret = stat(path, &buf);
141 list = g_list_append(list, g_strdup_printf("file://%s", path));
149 on_interface_proxy_properties_changed (GDBusProxy *proxy,
150 GVariant *changed_properties,
151 const gchar* const *invalidated_properties)
156 const gchar *pInterface;
159 pInterface = g_dbus_proxy_get_interface_name (proxy);
161 if (0 != g_strcmp0(pInterface, LIGHTMEDIASCANNER_INTERFACE))
164 g_variant_iter_init (&iter, changed_properties);
165 while (g_variant_iter_next (&iter, "{&sv}", &key, &subValue))
168 if (0 == g_strcmp0(key,"IsScanning")) {
169 g_variant_get(subValue, "b", &val);
172 } else if (0 == g_strcmp0(key, "WriteLocked")) {
173 g_variant_get(subValue, "b", &val);
181 list = media_lightmediascanner_scan();
183 if (list != NULL && g_RegisterCallback.binding_device_added)
184 g_RegisterCallback.binding_device_added(list);
186 g_list_free_full(list, g_free);
191 static int MediaPlayerDBusInit(void)
193 GError *error = NULL;
195 MediaPlayerManage.lms_proxy = scanner1_proxy_new_for_bus_sync(
196 G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, LIGHTMEDIASCANNER_SERVICE,
197 LIGHTMEDIASCANNER_PATH, NULL, &error);
199 if (MediaPlayerManage.lms_proxy == NULL) {
200 LOGE("Create LightMediaScanner Proxy failed\n");
204 g_signal_connect (MediaPlayerManage.lms_proxy,
205 "g-properties-changed",
206 G_CALLBACK (on_interface_proxy_properties_changed),
212 static void *media_event_loop_thread(void *unused)
214 GMainLoop *loop = g_main_loop_new(NULL, FALSE);
217 ret = MediaPlayerDBusInit();
219 LOGD("g_main_loop_run\n");
220 g_main_loop_run(loop);
223 g_main_loop_unref(loop);
229 unmount_cb (GFileMonitor *mon,
232 GFileMonitorEvent event,
235 gchar *path = g_file_get_path(file);
236 gchar *uri = g_strconcat("file://", path, NULL);
241 if (g_RegisterCallback.binding_device_removed &&
242 event == G_FILE_MONITOR_EVENT_DELETED) {
243 g_RegisterCallback.binding_device_removed(uri);
251 * Create MediaPlayer Manager Thread
252 * Note: mediaplayer-api should do MediaPlayerManagerInit() before any other
254 * Returns: 0 - success or error conditions
256 int MediaPlayerManagerInit() {
261 g_mutex_init(&(MediaPlayerManage.m));
263 file = g_file_new_for_path("/media");
264 g_assert(file != NULL);
266 mon = g_file_monitor (file, G_FILE_MONITOR_NONE, NULL, NULL);
267 g_assert(mon != NULL);
268 g_signal_connect (mon, "changed", G_CALLBACK(unmount_cb), NULL);
270 pthread_create(&thread_id, NULL, media_event_loop_thread, NULL);
276 * Register MediaPlayer Manager Callback functions
278 void BindingAPIRegister(const Binding_RegisterCallback_t* pstRegisterCallback)
280 if (NULL != pstRegisterCallback)
282 if (NULL != pstRegisterCallback->binding_device_added)
284 g_RegisterCallback.binding_device_added =
285 pstRegisterCallback->binding_device_added;
288 if (NULL != pstRegisterCallback->binding_device_removed)
290 g_RegisterCallback.binding_device_removed =
291 pstRegisterCallback->binding_device_removed;