summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packaging/libmm-radio.spec2
-rw-r--r--src/include/mm_radio_priv_hal.h3
-rw-r--r--src/include/mm_radio_utils.h3
-rw-r--r--src/mm_radio_priv_emulator.c16
-rw-r--r--src/mm_radio_priv_hal.c55
5 files changed, 26 insertions, 53 deletions
diff --git a/packaging/libmm-radio.spec b/packaging/libmm-radio.spec
index 980b195..90d68b3 100644
--- 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.50
+Version: 0.2.51
Release: 0
Group: System/Libraries
License: Apache-2.0
diff --git a/src/include/mm_radio_priv_hal.h b/src/include/mm_radio_priv_hal.h
index 6221545..b8185c4 100644
--- a/src/include/mm_radio_priv_hal.h
+++ b/src/include/mm_radio_priv_hal.h
@@ -198,9 +198,6 @@ typedef struct {
int freq;
- /* command lock */
- pthread_mutex_t volume_lock;
-
float local_volume;
/* region settings */
diff --git a/src/include/mm_radio_utils.h b/src/include/mm_radio_utils.h
index c72da4a..759ef71 100644
--- a/src/include/mm_radio_utils.h
+++ b/src/include/mm_radio_utils.h
@@ -125,9 +125,6 @@ do { \
#define MMRADIO_CMD_LOCK(x_radio) pthread_mutex_lock(&((mm_radio_t *)x_radio)->cmd_lock)
#define MMRADIO_CMD_UNLOCK(x_radio) pthread_mutex_unlock(&((mm_radio_t *)x_radio)->cmd_lock)
-#define MMRADIO_VOLUME_LOCK(x_radio) pthread_mutex_lock(&((mm_radio_t *)x_radio)->volume_lock)
-#define MMRADIO_VOLUME_UNLOCK(x_radio) pthread_mutex_unlock(&((mm_radio_t *)x_radio)->volume_lock)
-
/* msg/seek/scan thread */
#define MMRADIO_THREAD_LOCK(x_thread_t) pthread_mutex_lock(&x_thread_t->mutex)
#define MMRADIO_THREAD_UNLOCK(x_thread_t) pthread_mutex_unlock(&x_thread_t->mutex)
diff --git a/src/mm_radio_priv_emulator.c b/src/mm_radio_priv_emulator.c
index d7f6cd1..8d899ba 100644
--- a/src/mm_radio_priv_emulator.c
+++ b/src/mm_radio_priv_emulator.c
@@ -1557,14 +1557,10 @@ static void __mmradio_destroy_thread_type(mm_radio_t *radio, MMRadioThreadTypes
switch (type) {
case MM_RADIO_THREAD_MSG:
msg = g_slice_new0(mm_radio_msg_t);
- if (!msg) {
- MMRADIO_LOG_ERROR("failed to get mm_radio_msg_t");
- } else {
- msg->msg_type = MM_RADIO_MSG_DESTROY;
- g_async_queue_push_front(radio->msg_queue, msg);
- pthread_join(p_thread->thread, NULL);
- p_thread->thread = 0;
- }
+ msg->msg_type = MM_RADIO_MSG_DESTROY;
+ g_async_queue_push_front(radio->msg_queue, msg);
+ pthread_join(p_thread->thread, NULL);
+ p_thread->thread = 0;
break;
case MM_RADIO_THREAD_SEEK:
case MM_RADIO_THREAD_SCAN:
@@ -1608,10 +1604,6 @@ static void __mmradio_destroy_threads(mm_radio_t *radio)
void __mmradio_msg_push(mm_radio_t *radio, MMRadioMsgTypes msg_type, int msg_data)
{
mm_radio_msg_t *msg = g_slice_new0(mm_radio_msg_t);
- if (!msg) {
- MMRADIO_LOG_ERROR("NULL msg pointer");
- return;
- }
msg->msg_type = msg_type;
msg->data = msg_data;
diff --git a/src/mm_radio_priv_hal.c b/src/mm_radio_priv_hal.c
index c65f50e..c83627f 100644
--- a/src/mm_radio_priv_hal.c
+++ b/src/mm_radio_priv_hal.c
@@ -719,10 +719,13 @@ int _mmradio_seek(mm_radio_t *radio, MMRadioSeekDirectionType direction)
p_thread = &radio->thread[MM_RADIO_THREAD_SEEK];
MMRADIO_CHECK_ARG(p_thread);
+ MMRADIO_THREAD_LOCK(p_thread);
if (p_thread->is_running) {
MMRADIO_LOG_ERROR("[RADIO_ERROR_INVALID_OPERATION]radio is seeking, can't serve another request try again");
+ MMRADIO_THREAD_UNLOCK(p_thread);
return MM_ERROR_RADIO_INTERNAL;
}
+ MMRADIO_THREAD_UNLOCK(p_thread);
radio->seek_unmute = false;
@@ -776,6 +779,14 @@ int _mmradio_start_scan(mm_radio_t *radio)
p_thread = &radio->thread[MM_RADIO_THREAD_SCAN];
MMRADIO_CHECK_ARG(p_thread);
+ MMRADIO_THREAD_LOCK(p_thread);
+ if (p_thread->is_running) {
+ MMRADIO_LOG_ERROR("[MM_ERROR_RADIO_INVALID_STATE]radio is scanning, can't serve another request try again");
+ MMRADIO_THREAD_UNLOCK(p_thread);
+ return MM_ERROR_RADIO_INVALID_STATE;
+ }
+ MMRADIO_THREAD_UNLOCK(p_thread);
+
p_thread->stop = false;
ret = __mmradio_prepare_radio_device(radio);
@@ -851,14 +862,12 @@ void __mmradio_scan_thread(mm_radio_t *radio)
MMRADIO_CHECK_ARG_RETURN_VOID(p_thread);
MMRADIO_THREAD_LOCK(p_thread);
- MMRADIO_THREAD_SIGNAL(p_thread);
- MMRADIO_THREAD_UNLOCK(p_thread);
-
- MMRADIO_THREAD_LOCK(p_thread);
while (!p_thread->thread_exit) {
- MMRADIO_LOG_DEBUG("scan thread started. waiting for signal.");
- MMRADIO_THREAD_WAIT(p_thread);
+ while (!p_thread->is_running) {
+ MMRADIO_LOG_DEBUG("scan thread started. waiting for signal.");
+ MMRADIO_THREAD_WAIT(p_thread);
+ }
if (p_thread->thread_exit) {
MMRADIO_LOG_DEBUG("exiting scan thread");
@@ -1022,14 +1031,12 @@ void __mmradio_seek_thread(mm_radio_t *radio)
MMRADIO_CHECK_ARG_RETURN_VOID(p_thread);
MMRADIO_THREAD_LOCK(p_thread);
- MMRADIO_THREAD_SIGNAL(p_thread);
- MMRADIO_THREAD_UNLOCK(p_thread);
-
- MMRADIO_THREAD_LOCK(p_thread);
while (!p_thread->thread_exit) {
- MMRADIO_LOG_DEBUG("seek thread started. waiting for signal.");
- MMRADIO_THREAD_WAIT(p_thread);
+ while (!p_thread->is_running) {
+ MMRADIO_LOG_DEBUG("seek thread started. waiting for signal.");
+ MMRADIO_THREAD_WAIT(p_thread);
+ }
if (p_thread->thread_exit) {
MMRADIO_LOG_DEBUG("exiting seek thread");
@@ -1387,15 +1394,12 @@ int _mmradio_set_volume(mm_radio_t *radio, float volume)
MMRADIO_LOG_INFO("Setting %f volume", volume);
- MMRADIO_VOLUME_LOCK(radio);
radio->local_volume = volume;
if (radio->vstream)
sound_manager_set_virtual_stream_volume(radio->vstream,
(double)radio->local_volume);
- MMRADIO_VOLUME_UNLOCK(radio);
-
MMRADIO_LOG_FLEAVE();
return MM_ERROR_NONE;
@@ -1412,9 +1416,7 @@ int _mmradio_get_volume(mm_radio_t *radio, float *pVolume)
MMRADIO_RETURN_VAL_IF_FAIL(pVolume, MM_ERROR_INVALID_ARGUMENT);
- MMRADIO_VOLUME_LOCK(radio);
*pVolume = radio->local_volume;
- MMRADIO_VOLUME_UNLOCK(radio);
MMRADIO_LOG_FLEAVE();
@@ -1464,25 +1466,19 @@ static int __mmradio_create_thread_type(mm_radio_t *radio, MMRadioThreadTypes ty
}
p_thread = &radio->thread[type];
+ p_thread->is_running = false;
MMRADIO_CHECK_ARG(p_thread);
MMRADIO_INIT_MUTEX(p_thread->mutex);
MMRADIO_INIT_COND(p_thread->cond);
- MMRADIO_THREAD_LOCK(p_thread);
p_thread->thread_id = pthread_create(&p_thread->thread, NULL,
(void *)__mmradio_thread_function[type], (void *)radio);
if (p_thread->thread_id) {
MMRADIO_LOG_DEBUG("failed to create thread : [%d]", type);
- MMRADIO_THREAD_UNLOCK(p_thread);
return MM_ERROR_RADIO_INTERNAL;
}
- MMRADIO_LOG_DEBUG("wait for [%d] thread", type);
- MMRADIO_THREAD_WAIT(p_thread);
- MMRADIO_LOG_DEBUG("[%d] thread started", type);
- MMRADIO_THREAD_UNLOCK(p_thread);
-
return MM_ERROR_NONE;
ERROR:
@@ -1502,7 +1498,6 @@ static int __mmradio_create_threads(mm_radio_t *radio)
MMRADIO_CHECK_INSTANCE(radio);
MMRADIO_INIT_MUTEX(radio->cmd_lock);
- MMRADIO_INIT_MUTEX(radio->volume_lock);
MMRADIO_INIT_MUTEX(radio->hal_seek_mutex);
for (type = (int)MM_RADIO_THREAD_MSG; type < (int)MM_RADIO_THREAD_NUM; type++) {
@@ -1520,7 +1515,6 @@ static int __mmradio_create_threads(mm_radio_t *radio)
ERROR:
pthread_mutex_destroy(&radio->cmd_lock);
- pthread_mutex_destroy(&radio->volume_lock);
pthread_mutex_destroy(&radio->hal_seek_mutex);
MMRADIO_LOG_FLEAVE();
@@ -1560,6 +1554,7 @@ static void __mmradio_destroy_thread_type(mm_radio_t *radio, MMRadioThreadTypes
case MM_RADIO_THREAD_SCAN:
MMRADIO_THREAD_LOCK(p_thread);
p_thread->thread_exit = true;
+ p_thread->is_running = true;
MMRADIO_THREAD_SIGNAL(p_thread);
MMRADIO_THREAD_UNLOCK(p_thread);
pthread_join(p_thread->thread, NULL);
@@ -1589,7 +1584,6 @@ static void __mmradio_destroy_threads(mm_radio_t *radio)
__mmradio_destroy_thread_type(radio, (MMRadioThreadTypes)type);
pthread_mutex_destroy(&radio->cmd_lock);
- pthread_mutex_destroy(&radio->volume_lock);
pthread_mutex_destroy(&radio->hal_seek_mutex);
MMRADIO_LOG_FLEAVE();
@@ -1625,11 +1619,6 @@ void __mmradio_msg_thread(mm_radio_t *radio)
p_thread->thread_exit = false;
-
- MMRADIO_THREAD_LOCK(p_thread);
- MMRADIO_THREAD_SIGNAL(p_thread);
- MMRADIO_THREAD_UNLOCK(p_thread);
-
/* we run a while one loop*/
while (!p_thread->thread_exit) {
msg = (mm_radio_msg_t *)g_async_queue_pop(radio->msg_queue);
@@ -1719,8 +1708,6 @@ static int __mmradio_prepare_radio_device(mm_radio_t *radio)
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;
}