diff options
-rwxr-xr-x | configure.ac | 10 | ||||
-rwxr-xr-x | packaging/libmm-radio.spec | 5 | ||||
-rwxr-xr-x | src/Makefile.am | 9 | ||||
-rwxr-xr-x[-rw-r--r--] | src/include/mm_radio_priv.h | 7 | ||||
-rwxr-xr-x[-rw-r--r--] | src/include/mm_radio_priv_hal.h | 6 | ||||
-rw-r--r-- | src/include/mm_radio_resource.h | 82 | ||||
-rwxr-xr-x | src/mm_radio_priv_emulator.c | 93 | ||||
-rwxr-xr-x | src/mm_radio_priv_hal.c | 136 | ||||
-rw-r--r-- | src/mm_radio_resource.c | 544 |
9 files changed, 165 insertions, 727 deletions
diff --git a/configure.ac b/configure.ac index ab1c1e1..5160329 100755 --- a/configure.ac +++ b/configure.ac @@ -38,13 +38,9 @@ PKG_CHECK_MODULES(MMCOMMON, mm-common) AC_SUBST(MMCOMMON_CFLAGS) AC_SUBST(MMCOMMON_LIBS) -PKG_CHECK_MODULES(MURPHY_RESOURCE, murphy-resource) -AC_SUBST(MURPHY_RESOURCE_CFLAGS) -AC_SUBST(MURPHY_RESOURCE_LIBS) - -PKG_CHECK_MODULES(MURPHY_GLIB, murphy-glib) -AC_SUBST(MURPHY_GLIB_CFLAGS) -AC_SUBST(MURPHY_GLIB_LIBS) +PKG_CHECK_MODULES(MM_RESOURCE_MANAGER, mm-resource-manager) +AC_SUBST(MM_RESOURCE_MANAGER_CFLAGS) +AC_SUBST(MM_RESOURCE_MANAGER_LIBS) PKG_CHECK_MODULES(DLOG, dlog) AC_SUBST(DLOG_CFLAGS) diff --git a/packaging/libmm-radio.spec b/packaging/libmm-radio.spec index 6047692..f7e8b46 100755 --- a/packaging/libmm-radio.spec +++ b/packaging/libmm-radio.spec @@ -1,6 +1,6 @@ Name: libmm-radio Summary: Multimedia Framework Radio Library -Version: 0.2.32 +Version: 0.2.33 Release: 0 Group: System/Libraries License: Apache-2.0 @@ -15,8 +15,7 @@ BuildRequires: pkgconfig(capi-media-sound-manager) BuildRequires: pkgconfig(gstreamer-1.0) BuildRequires: pkgconfig(gstreamer-plugins-base-1.0) %endif -BuildRequires: pkgconfig(murphy-resource) -BuildRequires: pkgconfig(murphy-glib) +BuildRequires: pkgconfig(mm-resource-manager) %description Description: Multimedia Framework Radio Library diff --git a/src/Makefile.am b/src/Makefile.am index 8118ed2..a839909 100755 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -3,20 +3,17 @@ lib_LTLIBRARIES = libmmfradio.la includelibmmfradiodir = $(includedir)/mmf includelibmmfradio_HEADERS = include/mm_radio.h -libmmfradio_la_SOURCES = mm_radio.c \ - mm_radio_resource.c +libmmfradio_la_SOURCES = mm_radio.c libmmfradio_la_CFLAGS = -I. -I./include \ $(GTHREAD_CFLAGS) \ $(MMCOMMON_CFLAGS) \ - $(MURPHY_RESOURCE_CFLAGS) \ - $(MURPHY_GLIB_CFLAGS) \ + $(MM_RESOURCE_MANAGER_CFLAGS) \ $(DLOG_CFLAGS) libmmfradio_la_LIBADD = $(GTHREAD_LIBS) \ $(MMCOMMON_LIBS) \ - $(MURPHY_RESOURCE_LIBS) \ - $(MURPHY_GLIB_LIBS) \ + $(MM_RESOURCE_MANAGER_LIBS) \ $(DLOG_LIBS) diff --git a/src/include/mm_radio_priv.h b/src/include/mm_radio_priv.h index f45faac..f6ad141 100644..100755 --- a/src/include/mm_radio_priv.h +++ b/src/include/mm_radio_priv.h @@ -32,6 +32,7 @@ #include <mm_types.h> #include <mm_message.h> +#include <media/mm_resource_manager.h> #ifdef TIZEN_FEATURE_SOUND_FOCUS #include "mm_radio_sound_focus.h" @@ -39,7 +40,6 @@ #include "mm_radio.h" #include "mm_radio_utils.h" -#include "mm_radio_resource.h" #include <linux/videodev2.h> #include <gst/gst.h> @@ -191,7 +191,10 @@ typedef struct { #ifdef USE_GST_PIPELINE mm_radio_gstreamer_s* pGstreamer_s; #endif - mm_radio_resource_manager resource_manager; + mm_resource_manager_h resource_manager; + mm_resource_manager_res_h radio_resource; + int interrupted_by_resource_conflict; + unsigned int subs_id; float local_volume; diff --git a/src/include/mm_radio_priv_hal.h b/src/include/mm_radio_priv_hal.h index 67bcf82..437a40e 100644..100755 --- a/src/include/mm_radio_priv_hal.h +++ b/src/include/mm_radio_priv_hal.h @@ -32,6 +32,7 @@ #include <mm_types.h> #include <mm_message.h> +#include <media/mm_resource_manager.h> #ifdef TIZEN_FEATURE_SOUND_FOCUS #include "mm_radio_sound_focus.h" @@ -42,7 +43,6 @@ #include <media/sound_manager_internal.h> #endif -#include "mm_radio_resource.h" #include "mm_radio.h" #include "mm_radio_utils.h" #include "radio_hal_interface.h" @@ -194,7 +194,9 @@ typedef struct { mm_radio_hal_interface *hal_inf; - mm_radio_resource_manager resource_manager; + mm_resource_manager_h resource_manager; + mm_resource_manager_res_h radio_resource; + int interrupted_by_resource_conflict; } mm_radio_t; diff --git a/src/include/mm_radio_resource.h b/src/include/mm_radio_resource.h deleted file mode 100644 index 534757f..0000000 --- a/src/include/mm_radio_resource.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * mm_radio_resource.h - * - * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Heechul Jeon <heechul.jeon@samsung.com> - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef __MM_RADIO_RESOURCE_H__ -#define __MM_RADIO_RESOURCE_H__ - -#include <murphy/plugins/resource-native/libmurphy-resource/resource-api.h> -#include <glib.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#define __MMRADIO_RESOURCE_WAIT_TIME 3 - -#define MMRADIO_GET_RESOURCE_LOCK(rm) (&((mm_radio_resource_manager *)rm)->lock) -#define MMRADIO_RESOURCE_LOCK(rm) (g_mutex_lock(MMRADIO_GET_RESOURCE_LOCK(rm))) -#define MMRADIO_RESOURCE_UNLOCK(rm) (g_mutex_unlock(MMRADIO_GET_RESOURCE_LOCK(rm))) - -#define MMRADIO_GET_RESOURCE_COND(rm) (&((mm_radio_resource_manager *)rm)->cond) -#define MMRADIO_RESOURCE_WAIT(rm) g_cond_wait(MMRADIO_GET_RESOURCE_COND(rm), MMRADIO_GET_RESOURCE_LOCK(rm) -#define MMRADIO_RESOURCE_WAIT_UNTIL(rm, end_time) \ - g_cond_wait_until(MMRADIO_GET_RESOURCE_COND(rm), MMRADIO_GET_RESOURCE_LOCK(rm), end_time) -#define MMRADIO_RESOURCE_SIGNAL(rm) g_cond_signal(MMRADIO_GET_RESOURCE_COND(rm)); - - -typedef enum { - MM_RADIO_RESOURCE_TYPE_RADIO, - MM_RADIO_RESOURCE_MAX -} mm_radio_resource_type_e; - -typedef enum { - MM_RADIO_RESOURCE_STATE_NONE, - MM_RADIO_RESOURCE_STATE_INITIALIZED, - MM_RADIO_RESOURCE_STATE_PREPARED, - MM_RADIO_RESOURCE_STATE_ACQUIRED, - MM_RADIO_RESOURCE_STATE_MAX, -} mm_radio_resource_state_e; - -typedef struct { - mrp_mainloop_t *mloop; - mrp_res_context_t *context; - mrp_res_resource_set_t *rset; - mm_radio_resource_state_e state; - GCond cond; - GMutex lock; - void *user_data; - bool is_connected; - bool by_rm_cb; -} mm_radio_resource_manager; - -int mmradio_resource_manager_init(mm_radio_resource_manager *resource_manager, void *user_data); -int mmradio_resource_manager_deinit(mm_radio_resource_manager *resource_manager); -int mmradio_resource_manager_prepare(mm_radio_resource_manager *resource_manager, mm_radio_resource_type_e resource_type); -int mmradio_resource_manager_unprepare(mm_radio_resource_manager *resource_manager); -int mmradio_resource_manager_acquire(mm_radio_resource_manager *resource_manager); -int mmradio_resource_manager_release(mm_radio_resource_manager *resource_manager); -int mmradio_resource_manager_get_state(mm_radio_resource_manager *resource_manager, mm_radio_resource_state_e *state); - -#ifdef __cplusplus -} -#endif - -#endif /* __MM_RADIO_RESOURCE_H__ */ diff --git a/src/mm_radio_priv_emulator.c b/src/mm_radio_priv_emulator.c index 1fcd7ae..d79c12c 100755 --- a/src/mm_radio_priv_emulator.c +++ b/src/mm_radio_priv_emulator.c @@ -137,6 +137,8 @@ static bool __is_tunable_frequency(mm_radio_t * radio, int freq); static int __mmradio_set_deemphasis(mm_radio_t * radio); static int __mmradio_set_band_range(mm_radio_t * radio); static int __mmradio_get_wave_num(mm_radio_t * radio); +static int __resource_release_cb(mm_resource_manager_h rm, + mm_resource_manager_res_h res, void *user_data); #ifdef TIZEN_FEATURE_SOUND_FOCUS static void __mmradio_sound_focus_cb(int id, mm_sound_focus_type_e focus_type, mm_sound_focus_state_e focus_state, const char *reason_for_change, int option, @@ -240,9 +242,10 @@ int _mmradio_create_radio(mm_radio_t * radio) MMRADIO_SET_STATE(radio, MM_RADIO_STATE_NULL); /* initialize resource manager */ - ret = mmradio_resource_manager_init(&(radio->resource_manager), radio); + ret = mm_resource_manager_create(MM_RESOURCE_MANAGER_APP_CLASS_MEDIA, + __resource_release_cb, radio, &radio->resource_manager); if (ret) { - MMRADIO_LOG_ERROR("failed to initialize resource manager"); + MMRADIO_LOG_ERROR("failed to create resource manager"); return MM_ERROR_RADIO_INTERNAL; } @@ -357,6 +360,8 @@ int _mmradio_unrealize(mm_radio_t * radio) int _mmradio_destroy(mm_radio_t * radio) { + int ret = MM_ERROR_NONE; + MMRADIO_LOG_FENTER(); MMRADIO_CHECK_INSTANCE(radio); @@ -365,7 +370,6 @@ int _mmradio_destroy(mm_radio_t * radio) _mmradio_unrealize(radio); #ifdef TIZEN_FEATURE_SOUND_FOCUS - int ret = 0; ret = mmradio_sound_focus_deregister(&radio->sound_focus); if (ret) { MMRADIO_LOG_ERROR("failed to deregister sound focus"); @@ -373,9 +377,9 @@ int _mmradio_destroy(mm_radio_t * radio) } #endif - ret = mmradio_resource_manager_deinit(&radio->resource_manager); + ret = mm_resource_manager_destroy(radio->resource_manager); if (ret) { - MMRADIO_LOG_ERROR("failed to deinitialize resource manager"); + MMRADIO_LOG_ERROR("failed to destroy resource manager"); return MM_ERROR_RADIO_INTERNAL; } @@ -590,16 +594,21 @@ int _mmradio_start(mm_radio_t * radio) MMRADIO_SLOG_DEBUG("now tune to frequency : %d", radio->freq); - ret = mmradio_resource_manager_prepare(&radio->resource_manager, MM_RADIO_RESOURCE_TYPE_RADIO); - if (ret != MM_ERROR_NONE) { - MMRADIO_LOG_ERROR("failed to prepare resource manager"); + ret = mm_resource_manager_mark_for_acquire(radio->resource_manager, + MM_RESOURCE_MANAGER_RES_TYPE_RADIO, + MM_RESOURCE_MANAGER_RES_VOLUME_FULL, &radio->radio_resource); + if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) { + MMRADIO_LOG_ERROR("resource manager mark for acquire fail"); return MM_ERROR_RADIO_INTERNAL; } - ret = mmradio_resource_manager_acquire(&radio->resource_manager); - if (ret != MM_ERROR_NONE) { - MMRADIO_LOG_ERROR("failed to acquire resource manager"); - mmradio_resource_manager_unprepare(&radio->resource_manager); + radio->interrupted_by_resource_conflict = FALSE; + ret = mm_resource_manager_commit(radio->resource_manager); + if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) { + MMRADIO_LOG_ERROR("failed to commit resource manager"); + mm_resource_manager_mark_for_release(radio->resource_manager, + radio->radio_resource); + radio->radio_resource = NULL; return ret; } @@ -663,7 +672,6 @@ int _mmradio_start(mm_radio_t * radio) int _mmradio_stop(mm_radio_t * radio) { int ret = MM_ERROR_NONE; - mm_radio_resource_state_e resource_state = MM_RADIO_RESOURCE_STATE_NONE; MMRADIO_LOG_FENTER(); @@ -673,23 +681,19 @@ int _mmradio_stop(mm_radio_t * radio) /* if( _mmradio_mute(radio) != MM_ERROR_NONE) */ /* return MM_ERROR_RADIO_NOT_INITIALIZED; */ - if (!radio->resource_manager.by_rm_cb && /* is being released */ - mmradio_resource_manager_get_state(&radio->resource_manager, &resource_state) == MM_ERROR_NONE) { - if (resource_state == MM_RADIO_RESOURCE_STATE_ACQUIRED) { - ret = mmradio_resource_manager_release(&radio->resource_manager); - if (ret != MM_ERROR_NONE) { - MMRADIO_LOG_ERROR("failed to release resource, ret(0x%x)", ret); - return ret; - } + if (!radio->interrupted_by_resource_conflict && /* is being released */ + radio->radio_resource != NULL) { + ret = mm_resource_manager_mark_for_release(radio->resource_manager, + radio->radio_resource); + radio->radio_resource = NULL; + if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) { + MMRADIO_LOG_ERROR("failed to mark resource for release, ret(0x%x)", ret); + return ret; } - } - if (mmradio_resource_manager_get_state(&radio->resource_manager, &resource_state) == MM_ERROR_NONE) { - if (resource_state == MM_RADIO_RESOURCE_STATE_PREPARED) { - ret = mmradio_resource_manager_unprepare(&radio->resource_manager); - if (ret != MM_ERROR_NONE) - MMRADIO_LOG_ERROR("failed to unprepare resource manager"); - } + ret = mm_resource_manager_commit(radio->resource_manager); + if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) + MMRADIO_LOG_ERROR("resource manager commit fail"); } #ifdef TIZEN_FEATURE_SOUND_FOCUS @@ -1320,7 +1324,7 @@ static bool __mmradio_set_state(mm_radio_t * radio, int new_state) msg.state.code = radio->sound_focus.event_src; MMRADIO_POST_MSG(radio, msg_type, &msg); radio->sound_focus.by_focus_cb = false; - } else if (radio->resource_manager.by_rm_cb) { + } else if (radio->interrupted_by_resource_conflict) { msg_type = MM_MESSAGE_STATE_INTERRUPTED; msg.state.code = MM_MSG_CODE_INTERRUPTED_BY_RESOURCE_CONFLICT; MMRADIO_POST_MSG(radio, msg_type, &msg); @@ -1329,7 +1333,7 @@ static bool __mmradio_set_state(mm_radio_t * radio, int new_state) MMRADIO_POST_MSG(radio, msg_type, &msg); } #else - if (radio->resource_manager.by_rm_cb) { + if (radio->interrupted_by_resource_conflict) { msg_type = MM_MESSAGE_STATE_INTERRUPTED; msg.state.code = MM_MSG_CODE_INTERRUPTED_BY_RESOURCE_CONFLICT; MMRADIO_POST_MSG(radio, msg_type, &msg); @@ -1541,6 +1545,35 @@ static int __mmradio_get_wave_num(mm_radio_t * radio) return val; } +static int __resource_release_cb(mm_resource_manager_h rm, + mm_resource_manager_res_h res, void *user_data) +{ + mm_radio_t *radio = NULL; + + MMRADIO_LOG_FENTER(); + + if (!user_data) { + MMRADIO_LOG_ERROR("user_data is null"); + return FALSE; + } + + radio = (mm_radio_t *)user_data; + radio->radio_resource = NULL; + + MMRADIO_LOG_DEBUG("radio resource conflict so, resource will be freed by _mmradio_stop"); + + radio->interrupted_by_resource_conflict = TRUE; + + MMRADIO_CMD_LOCK(radio); + if (_mmradio_stop(radio) != MM_ERROR_NONE) + MMRADIO_LOG_ERROR("failed to stop radio"); + MMRADIO_CMD_UNLOCK(radio); + + MMRADIO_LOG_FLEAVE(); + + return FALSE; +} + int _mmradio_set_volume(mm_radio_t *radio, float volume) { MMRADIO_LOG_FENTER(); diff --git a/src/mm_radio_priv_hal.c b/src/mm_radio_priv_hal.c index 18493a9..511c74b 100755 --- a/src/mm_radio_priv_hal.c +++ b/src/mm_radio_priv_hal.c @@ -135,6 +135,8 @@ static void __mmradio_sound_focus_watch_cb(int id, mm_sound_focus_type_e focus_t static void __mmradio_volume_changed_cb(volume_type_t type, unsigned int volume, void *user_data); static int __mmradio_set_media_volume(mm_radio_t *radio, unsigned int level); +static int __resource_release_cb(mm_resource_manager_h rm, + mm_resource_manager_res_h res, void *user_data); int _mmradio_apply_region(mm_radio_t *radio, MMRadioRegionType region, bool update) { @@ -210,9 +212,10 @@ int _mmradio_create_radio(mm_radio_t *radio) MMRADIO_SET_STATE(radio, MM_RADIO_STATE_NULL); /* initialize resource manager */ - ret = mmradio_resource_manager_init(&(radio->resource_manager), radio); + ret = mm_resource_manager_create(MM_RESOURCE_MANAGER_APP_CLASS_MEDIA, + __resource_release_cb, radio, &radio->resource_manager); if (ret) { - MMRADIO_LOG_ERROR("failed to initialize resource manager"); + MMRADIO_LOG_ERROR("failed to create resource manager"); return MM_ERROR_RADIO_INTERNAL; } @@ -382,9 +385,9 @@ int _mmradio_destroy(mm_radio_t *radio) } #endif - ret = mmradio_resource_manager_deinit(&radio->resource_manager); + ret = mm_resource_manager_destroy(radio->resource_manager); if (ret) { - MMRADIO_LOG_ERROR("failed to deinitialize resource manager"); + MMRADIO_LOG_ERROR("failed to destroy resource manager"); return MM_ERROR_RADIO_INTERNAL; } @@ -577,17 +580,24 @@ int _mmradio_start(mm_radio_t *radio) #endif if (!radio->is_ready) { - ret = mmradio_resource_manager_prepare(&radio->resource_manager, MM_RADIO_RESOURCE_TYPE_RADIO); - if (ret != MM_ERROR_NONE) { - MMRADIO_LOG_ERROR("failed to prepare resource manager"); + ret = mm_resource_manager_mark_for_acquire(radio->resource_manager, + MM_RESOURCE_MANAGER_RES_TYPE_RADIO, + MM_RESOURCE_MANAGER_RES_VOLUME_FULL, &radio->radio_resource); + if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) { + MMRADIO_LOG_ERROR("resource manager mark for acquire fail"); return MM_ERROR_RADIO_INTERNAL; } - ret = mmradio_resource_manager_acquire(&radio->resource_manager); - if (ret != MM_ERROR_NONE) { - MMRADIO_LOG_ERROR("failed to acquire resource manager"); - mmradio_resource_manager_unprepare(&radio->resource_manager); + + radio->interrupted_by_resource_conflict = FALSE; + ret = mm_resource_manager_commit(radio->resource_manager); + if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) { + MMRADIO_LOG_ERROR("failed to commit resource manager"); + mm_resource_manager_mark_for_release(radio->resource_manager, + radio->radio_resource); + radio->radio_resource = NULL; return ret; } + ret = radio_hal_prepare(radio->hal_inf); if (ret == MM_ERROR_NOT_SUPPORT_API) { MMRADIO_LOG_WARNING("radio_hal_prepare is not supported"); @@ -662,7 +672,6 @@ error2: int _mmradio_stop(mm_radio_t *radio) { int ret = MM_ERROR_NONE; - mm_radio_resource_state_e resource_state = MM_RADIO_RESOURCE_STATE_NONE; MMRADIO_LOG_FENTER(); @@ -707,23 +716,19 @@ int _mmradio_stop(mm_radio_t *radio) radio->is_ready = FALSE; - if (!radio->resource_manager.by_rm_cb && /* is being released */ - mmradio_resource_manager_get_state(&radio->resource_manager, &resource_state) == MM_ERROR_NONE) { - if (resource_state == MM_RADIO_RESOURCE_STATE_ACQUIRED) { - ret = mmradio_resource_manager_release(&radio->resource_manager); - if (ret != MM_ERROR_NONE) { - MMRADIO_LOG_ERROR("failed to release resource, ret(0x%x)", ret); - return ret; - } + if (!radio->interrupted_by_resource_conflict && /* is being released */ + radio->radio_resource != NULL) { + ret = mm_resource_manager_mark_for_release(radio->resource_manager, + radio->radio_resource); + radio->radio_resource = NULL; + if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) { + MMRADIO_LOG_ERROR("failed to mark resource for release, ret(0x%x)", ret); + return ret; } - } - if (mmradio_resource_manager_get_state(&radio->resource_manager, &resource_state) == MM_ERROR_NONE) { - if (resource_state == MM_RADIO_RESOURCE_STATE_PREPARED) { - ret = mmradio_resource_manager_unprepare(&radio->resource_manager); - if (ret != MM_ERROR_NONE) - MMRADIO_LOG_ERROR("failed to unprepare resource manager"); - } + ret = mm_resource_manager_commit(radio->resource_manager); + if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) + MMRADIO_LOG_ERROR("resource manager commit fail"); } #ifdef TIZEN_FEATURE_SOUND_FOCUS @@ -843,15 +848,21 @@ int _mmradio_start_scan(mm_radio_t *radio) radio->stop_scan = false; if (!radio->is_ready) { - ret = mmradio_resource_manager_prepare(&radio->resource_manager, MM_RADIO_RESOURCE_TYPE_RADIO); - if (ret != MM_ERROR_NONE) { - MMRADIO_LOG_ERROR("failed to prepare resource manager"); + ret = mm_resource_manager_mark_for_acquire(radio->resource_manager, + MM_RESOURCE_MANAGER_RES_TYPE_RADIO, + MM_RESOURCE_MANAGER_RES_VOLUME_FULL, &radio->radio_resource); + if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) { + MMRADIO_LOG_ERROR("resource manager mark for acquire fail"); return MM_ERROR_RADIO_INTERNAL; } - ret = mmradio_resource_manager_acquire(&radio->resource_manager); - if (ret != MM_ERROR_NONE) { - MMRADIO_LOG_ERROR("failed to acquire resource manager"); - mmradio_resource_manager_unprepare(&radio->resource_manager); + + radio->interrupted_by_resource_conflict = FALSE; + ret = mm_resource_manager_commit(radio->resource_manager); + if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) { + MMRADIO_LOG_ERROR("failed to commit resource manager"); + mm_resource_manager_mark_for_release(radio->resource_manager, + radio->radio_resource); + radio->radio_resource = NULL; return ret; } @@ -951,7 +962,6 @@ void __mmradio_scan_thread(mm_radio_t *radio) { int ret = MM_ERROR_NONE; int prev_freq = 0; - mm_radio_resource_state_e resource_state = MM_RADIO_RESOURCE_STATE_NONE; MMRADIO_LOG_FENTER(); MMRADIO_CHECK_INSTANCE_RETURN_VOID(radio); @@ -1066,22 +1076,18 @@ FINISHED_ERR: radio->is_ready = FALSE; - if (!radio->resource_manager.by_rm_cb && /* is being released */ - mmradio_resource_manager_get_state(&radio->resource_manager, &resource_state) == MM_ERROR_NONE) { - if (resource_state == MM_RADIO_RESOURCE_STATE_ACQUIRED) { - ret = mmradio_resource_manager_release(&radio->resource_manager); - if (ret != MM_ERROR_NONE) - MMRADIO_LOG_ERROR("failed to release resource, ret(0x%x)", ret); - } + if (!radio->interrupted_by_resource_conflict && /* is being released */ + radio->radio_resource != NULL) { + ret = mm_resource_manager_mark_for_release(radio->resource_manager, + radio->radio_resource); + radio->radio_resource = NULL; + if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) + MMRADIO_LOG_ERROR("failed to mark resource for release, ret(0x%x)", ret); } - if (mmradio_resource_manager_get_state(&radio->resource_manager, &resource_state) == MM_ERROR_NONE) { - if (resource_state == MM_RADIO_RESOURCE_STATE_PREPARED) { - ret = mmradio_resource_manager_unprepare(&radio->resource_manager); - if (ret != MM_ERROR_NONE) - MMRADIO_LOG_ERROR("failed to unprepare resource manager"); - } - } + ret = mm_resource_manager_commit(radio->resource_manager); + if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) + MMRADIO_LOG_ERROR("resource manager commit fail"); MMRADIO_SET_STATE(radio, MM_RADIO_STATE_READY); } @@ -1400,7 +1406,7 @@ static bool __mmradio_set_state(mm_radio_t *radio, int new_state) msg_type = MM_MESSAGE_STATE_INTERRUPTED; msg.state.code = radio->sound_focus.event_src; MMRADIO_POST_MSG(radio, msg_type, &msg); - } else if (radio->resource_manager.by_rm_cb) { + } else if (radio->interrupted_by_resource_conflict) { msg_type = MM_MESSAGE_STATE_INTERRUPTED; msg.state.code = MM_MSG_CODE_INTERRUPTED_BY_RESOURCE_CONFLICT; MMRADIO_POST_MSG(radio, msg_type, &msg); @@ -1409,7 +1415,7 @@ static bool __mmradio_set_state(mm_radio_t *radio, int new_state) MMRADIO_POST_MSG(radio, msg_type, &msg); } #else - if (radio->resource_manager.by_rm_cb) { + if (radio->interrupted_by_resource_conflict) { msg_type = MM_MESSAGE_STATE_INTERRUPTED; msg.state.code = MM_MSG_CODE_INTERRUPTED_BY_RESOURCE_CONFLICT; MMRADIO_POST_MSG(radio, msg_type, &msg); @@ -1680,3 +1686,31 @@ static int __mmradio_set_media_volume(mm_radio_t *radio, unsigned int level) return ret; } +static int __resource_release_cb(mm_resource_manager_h rm, + mm_resource_manager_res_h res, void *user_data) +{ + mm_radio_t *radio = NULL; + + MMRADIO_LOG_FENTER(); + + if (!user_data) { + MMRADIO_LOG_ERROR("user_data is null"); + return FALSE; + } + + radio = (mm_radio_t *)user_data; + radio->radio_resource = NULL; + + MMRADIO_LOG_DEBUG("radio resource conflict so, resource will be freed by _mmradio_stop"); + + radio->interrupted_by_resource_conflict = TRUE; + + MMRADIO_CMD_LOCK(radio); + if (_mmradio_stop(radio) != MM_ERROR_NONE) + MMRADIO_LOG_ERROR("failed to stop radio"); + MMRADIO_CMD_UNLOCK(radio); + + MMRADIO_LOG_FLEAVE(); + + return FALSE; +} diff --git a/src/mm_radio_resource.c b/src/mm_radio_resource.c deleted file mode 100644 index e87f8fa..0000000 --- a/src/mm_radio_resource.c +++ /dev/null @@ -1,544 +0,0 @@ -/* - * mm_radio_resource.c - * - * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include "mm_radio_utils.h" -#ifdef TIZEN_FEATURE_RADIO_HAL -#include "mm_radio_priv_hal.h" -#else -#include "mm_radio_priv.h" -#endif -#include "mm_radio_resource.h" -#include <murphy/common/glib-glue.h> - -#define MMRADIO_RESOURCE_TIMEOUT 5 -#define MRP_APP_CLASS_FOR_RADIO "media" -#define MRP_RESOURCE_TYPE_MANDATORY TRUE -#define MRP_RESOURCE_TYPE_EXCLUSIVE FALSE - -const char* mm_radio_resource_str[MM_RADIO_RESOURCE_MAX] = { - "radio" -}; - -#define MMRADIO_CHECK_RESOURCE_MANAGER_INSTANCE(x_radio_resource_manager) \ -do { \ - if (!x_radio_resource_manager) { \ - MMRADIO_LOG_ERROR("no resource manager instance"); \ - return MM_ERROR_INVALID_ARGUMENT; \ - } \ -} while (0); - -#define MMRADIO_CHECK_CONNECTION_RESOURCE_MANAGER(x_radio_resource_manager) \ -do { \ - if (!x_radio_resource_manager) { \ - MMRADIO_LOG_ERROR("no resource manager instance"); \ - return MM_ERROR_INVALID_ARGUMENT; \ - } else { \ - if (!x_radio_resource_manager->is_connected) { \ - MMRADIO_LOG_ERROR("not connected to resource server yet"); \ - return MM_ERROR_RESOURCE_NOT_INITIALIZED; \ - } \ - } \ -} while (0); - -static char *_mmrdio_resource_state_to_str(mrp_res_resource_state_t st) -{ - char *state = "unknown"; - switch (st) { - case MRP_RES_RESOURCE_ACQUIRED: - state = "acquired"; - break; - case MRP_RES_RESOURCE_LOST: - state = "lost"; - break; - case MRP_RES_RESOURCE_AVAILABLE: - state = "available"; - break; - case MRP_RES_RESOURCE_PENDING: - state = "pending"; - break; - case MRP_RES_RESOURCE_ABOUT_TO_LOOSE: - state = "about to loose"; - break; - } - return state; -} - -static void __mmradio_resource_state_callback(mrp_res_context_t *context, mrp_res_error_t err, void *user_data) -{ - - int i = 0; - const mrp_res_resource_set_t *rset; - mrp_res_resource_t *resource; - mm_radio_t *radio = NULL; - - MMRADIO_LOG_FENTER(); - - if (user_data == NULL) { - MMRADIO_LOG_ERROR(" - user data is null\n"); - return; - } - radio = (mm_radio_t *)user_data; - if (err != MRP_RES_ERROR_NONE) { - MMRADIO_LOG_ERROR(" - error message received from Murphy, for the radio(%p), err(0x%x)", radio, err); - return; - } - - switch (context->state) { - case MRP_RES_CONNECTED: - MMRADIO_LOG_DEBUG(" - connected to Murphy"); - if ((rset = mrp_res_list_resources(context)) != NULL) { - mrp_res_string_array_t *resource_names; - resource_names = mrp_res_list_resource_names(rset); - if (!resource_names) { - MMRADIO_LOG_ERROR(" - no resources available"); - return; - } - for (i = 0; i < resource_names->num_strings; i++) { - resource = mrp_res_get_resource_by_name(rset, resource_names->strings[i]); - if (resource) - MMRADIO_LOG_DEBUG(" - available resource: %s", resource->name); - } - mrp_res_free_string_array(resource_names); - } - radio->resource_manager.is_connected = true; - break; - case MRP_RES_DISCONNECTED: - MMRADIO_LOG_DEBUG(" - disconnected from Murphy"); - if (radio->resource_manager.rset) { - mrp_res_delete_resource_set(radio->resource_manager.rset); - radio->resource_manager.rset = NULL; - } - mrp_res_destroy(radio->resource_manager.context); - radio->resource_manager.context = NULL; - radio->resource_manager.is_connected = false; - break; - } - - MMRADIO_LOG_FLEAVE(); -} - -static void __mmradio_rset_state_callback(mrp_res_context_t *cx, const mrp_res_resource_set_t *rs, void *user_data) -{ - int i = 0; - mm_radio_t *radio = (mm_radio_t *)user_data; - mrp_res_resource_t *res; - - MMRADIO_LOG_FENTER(); - - MMRADIO_RESOURCE_LOCK(&radio->resource_manager); - - if (!mrp_res_equal_resource_set(rs, radio->resource_manager.rset)) { - MMRADIO_LOG_WARNING("- resource set(%p) is not same as this radio handle's(%p)", rs, radio->resource_manager.rset); - MMRADIO_RESOURCE_UNLOCK(&radio->resource_manager); - return; - } - - MMRADIO_LOG_DEBUG(" - resource set state of radio(%p) is changed to [%s]", - radio, _mmrdio_resource_state_to_str(rs->state)); - for (i = 0; i < MM_RADIO_RESOURCE_MAX; i++) { - res = mrp_res_get_resource_by_name(rs, mm_radio_resource_str[i]); - if (res == NULL) - MMRADIO_LOG_WARNING(" -- %s not present in resource set", mm_radio_resource_str[i]); - else - MMRADIO_LOG_DEBUG(" -- resource name [%s] -> [%s]", res->name, - _mmrdio_resource_state_to_str(res->state)); - } - - mrp_res_delete_resource_set(radio->resource_manager.rset); - radio->resource_manager.rset = mrp_res_copy_resource_set(rs); - - if (rs->state == MRP_RES_RESOURCE_ACQUIRED) { - MMRADIO_LOG_DEBUG(" - resource set is acquired"); - radio->resource_manager.state = MM_RADIO_RESOURCE_STATE_ACQUIRED; - MMRADIO_RESOURCE_SIGNAL(&radio->resource_manager); - } else if ((radio->resource_manager.state >= MM_RADIO_RESOURCE_STATE_ACQUIRED) && - (rs->state == MRP_RES_RESOURCE_AVAILABLE)) { - MMRADIO_LOG_DEBUG(" - resource set is released"); - radio->resource_manager.state = MM_RADIO_RESOURCE_STATE_PREPARED; - MMRADIO_RESOURCE_SIGNAL(&radio->resource_manager); - - /* mm radio was unrealized by resource conflict. */ - if (radio->resource_manager.by_rm_cb == true) { - MMRADIO_LOG_DEBUG(" - delete resource set "); - if (radio->resource_manager.rset) { - mrp_res_delete_resource_set(radio->resource_manager.rset); - radio->resource_manager.rset = NULL; - } - radio->resource_manager.state = MM_RADIO_RESOURCE_STATE_INITIALIZED; - radio->resource_manager.by_rm_cb = false; - } - } - - MMRADIO_RESOURCE_UNLOCK(&radio->resource_manager); - - MMRADIO_LOG_FLEAVE(); -} - -static void __mmradio_mrp_resource_release_cb(mrp_res_context_t *cx, const mrp_res_resource_set_t *rs, void *user_data) -{ - int i = 0; - int result = MM_ERROR_NONE; - mm_radio_t *radio = NULL; - mrp_res_resource_t *res; - gboolean resource_released = FALSE; - - MMRADIO_LOG_FENTER(); - - if (user_data == NULL) { - MMRADIO_LOG_ERROR("- user_data is null"); - return; - } - - radio = (mm_radio_t *)user_data; - - if (!mrp_res_equal_resource_set(rs, radio->resource_manager.rset)) { - MMRADIO_LOG_WARNING("- resource set(%p) is not same as this radio handle's(%p)", rs, radio->resource_manager.rset); - return; - } - - MMRADIO_LOG_DEBUG(" - resource set state of radio(%p) is changed to [%s]", radio, - _mmrdio_resource_state_to_str(rs->state)); - for (i = 0; i < MM_RADIO_RESOURCE_MAX; i++) { - res = mrp_res_get_resource_by_name(rs, mm_radio_resource_str[i]); - if (res == NULL) { - MMRADIO_LOG_WARNING(" -- %s not present in resource set", mm_radio_resource_str[i]); - } else { - MMRADIO_LOG_DEBUG(" -- resource name [%s] -> [%s]", res->name, - _mmrdio_resource_state_to_str(res->state)); - if (res->state == MRP_RES_RESOURCE_ABOUT_TO_LOOSE) - resource_released = TRUE; - } - } - - if (resource_released) { - MMRADIO_LOG_DEBUG("radio resource conflict so, resource will be freed by _mmradio_stop"); - - radio->resource_manager.by_rm_cb = true; - - MMRADIO_CMD_LOCK(radio); - result = _mmradio_stop(radio); - if (result != MM_ERROR_NONE) - MMRADIO_LOG_ERROR("failed to stop radio"); - MMRADIO_CMD_UNLOCK(radio); - - } else { - MMRADIO_LOG_WARNING("could not find videobin"); - } - - MMRADIO_LOG_FLEAVE(); - - return; - -} - -static int _mmradio_create_rset(mm_radio_resource_manager *resource_manager) -{ - if (resource_manager->rset) { - MMRADIO_LOG_ERROR(" - resource set was already created"); - return MM_ERROR_RESOURCE_INVALID_STATE; - } - - resource_manager->rset = mrp_res_create_resource_set(resource_manager->context, - MRP_APP_CLASS_FOR_RADIO, __mmradio_rset_state_callback, - (void*)resource_manager->user_data); - if (resource_manager->rset == NULL) { - MMRADIO_LOG_ERROR(" - could not create resource set"); - return MM_ERROR_RESOURCE_INTERNAL; - } - - if (!mrp_res_set_autorelease(TRUE, resource_manager->rset)) - MMRADIO_LOG_WARNING(" - could not set autorelease flag!"); - - return MM_ERROR_NONE; -} - -static int _mmradio_include_resource(mm_radio_resource_manager *resource_manager, const char *resource_name) -{ - mrp_res_resource_t *resource = NULL; - resource = mrp_res_create_resource(resource_manager->rset, - resource_name, - MRP_RESOURCE_TYPE_MANDATORY, - MRP_RESOURCE_TYPE_EXCLUSIVE); - if (resource == NULL) { - MMRADIO_LOG_ERROR(" - could not include resource[%s]", resource_name); - return MM_ERROR_RESOURCE_INTERNAL; - } - - MMRADIO_LOG_DEBUG(" - include resource[%s]", resource_name); - - return MM_ERROR_NONE; -} - -static int _mmradio_set_resource_release_cb(mm_radio_resource_manager *resource_manager) -{ - int ret = MM_ERROR_NONE; - bool mrp_ret = false; - MMRADIO_LOG_FENTER(); - - if (resource_manager->rset) { - mrp_ret = mrp_res_set_release_callback(resource_manager->rset, __mmradio_mrp_resource_release_cb, resource_manager->user_data); - if (!mrp_ret) { - MMRADIO_LOG_ERROR(" - could not set release callback"); - ret = MM_ERROR_RESOURCE_INTERNAL; - } - } else { - MMRADIO_LOG_ERROR(" - resource set is null"); - ret = MM_ERROR_RESOURCE_INVALID_STATE; - } - MMRADIO_LOG_FLEAVE(); - return ret; -} - - -int mmradio_resource_manager_init(mm_radio_resource_manager *resource_manager, void *user_data) -{ - MMRADIO_LOG_FENTER(); - MMRADIO_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - - GMainContext *mrp_ctx = g_main_context_new(); - if (!mrp_ctx) { - MMRADIO_LOG_ERROR("- could not create main context for resource manager"); - return MM_ERROR_RESOURCE_INTERNAL; - } - - GMainLoop *mrp_loop = g_main_loop_new(mrp_ctx, TRUE); - g_main_context_unref(mrp_ctx); - if (!mrp_loop) { - MMRADIO_LOG_ERROR("- could not create glib mainloop for resource manager"); - return MM_ERROR_RESOURCE_INTERNAL; - } - - resource_manager->mloop = mrp_mainloop_glib_get(mrp_loop); - g_main_loop_unref(mrp_loop); - - if (resource_manager->mloop) { - resource_manager->context = mrp_res_create(resource_manager->mloop, __mmradio_resource_state_callback, user_data); - if (resource_manager->context == NULL) { - MMRADIO_LOG_ERROR(" - could not get context for resource manager"); - mrp_mainloop_destroy(resource_manager->mloop); - resource_manager->mloop = NULL; - return MM_ERROR_RESOURCE_INTERNAL; - } - resource_manager->user_data = user_data; - } else { - MMRADIO_LOG_ERROR("- could not get mainloop for resource manager"); - return MM_ERROR_RESOURCE_INTERNAL; - } - - resource_manager->state = MM_RADIO_RESOURCE_STATE_INITIALIZED; - g_mutex_init(&resource_manager->lock); - g_cond_init(&resource_manager->cond); - - MMRADIO_LOG_FLEAVE(); - - return MM_ERROR_NONE; - -} - - -int mmradio_resource_manager_prepare(mm_radio_resource_manager *resource_manager, mm_radio_resource_type_e resource_type) -{ - int ret = MM_ERROR_NONE; - MMRADIO_LOG_FENTER(); - MMRADIO_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - MMRADIO_CHECK_CONNECTION_RESOURCE_MANAGER(resource_manager); - - if (!resource_manager->rset) - ret = _mmradio_create_rset(resource_manager); - - if (ret == MM_ERROR_NONE) { - switch (resource_type) { - case MM_RADIO_RESOURCE_TYPE_RADIO: - ret = _mmradio_include_resource(resource_manager, mm_radio_resource_str[MM_RADIO_RESOURCE_TYPE_RADIO]); - break; - default: - MMRADIO_LOG_WARNING("resource type(%d) is worng", resource_type); - break; - } - } - - resource_manager->state = MM_RADIO_RESOURCE_STATE_PREPARED; - - MMRADIO_LOG_FLEAVE(); - - return ret; - -} - -int mmradio_resource_manager_unprepare(mm_radio_resource_manager *resource_manager) -{ - int ret = MM_ERROR_NONE; - MMRADIO_LOG_FENTER(); - MMRADIO_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - MMRADIO_CHECK_CONNECTION_RESOURCE_MANAGER(resource_manager); - - if (resource_manager->rset == NULL) { - MMRADIO_LOG_ERROR("- could not unprepare for resource_manager, mmradio_resource_manager_prepare() first"); - ret = MM_ERROR_RESOURCE_INVALID_STATE; - } else { - MMRADIO_RESOURCE_LOCK(resource_manager); - mrp_res_delete_resource_set(resource_manager->rset); - resource_manager->rset = NULL; - MMRADIO_RESOURCE_UNLOCK(resource_manager); - } - - resource_manager->state = MM_RADIO_RESOURCE_STATE_INITIALIZED; - - MMRADIO_LOG_FLEAVE(); - - return ret; - -} - -int mmradio_resource_manager_acquire(mm_radio_resource_manager *resource_manager) -{ - int ret = MM_ERROR_NONE; - MMRADIO_LOG_FENTER(); - MMRADIO_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - MMRADIO_CHECK_CONNECTION_RESOURCE_MANAGER(resource_manager); - - if (resource_manager->rset == NULL) { - MMRADIO_LOG_ERROR("- could not acquire resource, resource set is null\n"); - ret = MM_ERROR_RESOURCE_INVALID_STATE; - } else { - ret = _mmradio_set_resource_release_cb(resource_manager); - if (ret) { - MMRADIO_LOG_ERROR("- could not set resource release cb, ret(0x%x)", ret); - ret = MM_ERROR_RESOURCE_INTERNAL; - } else { - MMRADIO_RESOURCE_LOCK(resource_manager); - - ret = mrp_res_acquire_resource_set(resource_manager->rset); - if (ret) { - MMRADIO_LOG_ERROR("- could not acquire resource, ret(%d)", ret); - ret = MM_ERROR_RESOURCE_INTERNAL; - } else { - gint64 end_time = g_get_monotonic_time() + MMRADIO_RESOURCE_TIMEOUT * G_TIME_SPAN_SECOND; - - MMRADIO_LOG_DEBUG("- acquire resource waiting..%p till %lld", resource_manager, end_time); - - if (!MMRADIO_RESOURCE_WAIT_UNTIL(resource_manager, end_time)) { - MMRADIO_LOG_ERROR("- could not acquire resource"); - ret = MM_ERROR_RESOURCE_INTERNAL; - } else { - MMRADIO_LOG_DEBUG("- resources are acquired"); - } - - } - MMRADIO_RESOURCE_UNLOCK(resource_manager); - } - } - - MMRADIO_LOG_FLEAVE(); - - return ret; - -} - -int mmradio_resource_manager_release(mm_radio_resource_manager *resource_manager) -{ - int ret = MM_ERROR_NONE; - MMRADIO_LOG_FENTER(); - MMRADIO_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - MMRADIO_CHECK_CONNECTION_RESOURCE_MANAGER(resource_manager); - - if (resource_manager->rset == NULL) { - MMRADIO_LOG_ERROR("- could not release resource, resource set is null"); - ret = MM_ERROR_RESOURCE_INVALID_STATE; - } else { - if (resource_manager->rset->state != MRP_RES_RESOURCE_ACQUIRED) { - MMRADIO_LOG_ERROR("- could not release resource, resource set state is [%s]", - _mmrdio_resource_state_to_str(resource_manager->rset->state)); - ret = MM_ERROR_RESOURCE_INVALID_STATE; - } else { - MMRADIO_RESOURCE_LOCK(resource_manager); - ret = mrp_res_release_resource_set(resource_manager->rset); - if (ret) { - MMRADIO_LOG_ERROR("- could not release resource, ret(%d)", ret); - ret = MM_ERROR_RESOURCE_INTERNAL; - } else { - gint64 end_time = g_get_monotonic_time() + MMRADIO_RESOURCE_TIMEOUT * G_TIME_SPAN_SECOND; - - MMRADIO_LOG_DEBUG("- release resource waiting..%p till %lld", resource_manager, end_time); - - if (!MMRADIO_RESOURCE_WAIT_UNTIL(resource_manager, end_time)) - MMRADIO_LOG_WARNING("- could not release resource in time"); - else - MMRADIO_LOG_DEBUG("- resources are released\n"); - } - MMRADIO_RESOURCE_UNLOCK(resource_manager); - } - } - - MMRADIO_LOG_FLEAVE(); - - return ret; -} - -int mmradio_resource_manager_deinit(mm_radio_resource_manager *resource_manager) -{ - MMRADIO_LOG_FENTER(); - MMRADIO_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - MMRADIO_CHECK_CONNECTION_RESOURCE_MANAGER(resource_manager); - - if (resource_manager->rset) { - if (resource_manager->rset->state == MRP_RES_RESOURCE_ACQUIRED) { - if (mrp_res_release_resource_set(resource_manager->rset)) - MMRADIO_LOG_ERROR("- could not release resource"); - } - mrp_res_delete_resource_set(resource_manager->rset); - resource_manager->rset = NULL; - } - - if (resource_manager->context) { - mrp_res_destroy(resource_manager->context); - resource_manager->context = NULL; - } - - if (resource_manager->mloop) { - mrp_mainloop_quit(resource_manager->mloop, 0); - mrp_mainloop_destroy(resource_manager->mloop); - resource_manager->mloop = NULL; - } - - resource_manager->state = MM_RADIO_RESOURCE_STATE_NONE; - g_mutex_clear(&resource_manager->lock); - g_cond_clear(&resource_manager->cond); - - MMRADIO_LOG_FLEAVE(); - - return MM_ERROR_NONE; -} - - -int mmradio_resource_manager_get_state(mm_radio_resource_manager *resource_manager, mm_radio_resource_state_e *state) -{ - - MMRADIO_LOG_FENTER(); - MMRADIO_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - MMRADIO_CHECK_ARG(state); - - MMRADIO_LOG_DEBUG("resource_state is %d", resource_manager->state); - - *state = resource_manager->state; - - MMRADIO_LOG_FLEAVE(); - - return MM_ERROR_NONE; -} |