Fix for audio-hal testcase 72/188372/3 accepted/tizen_5.0_unified tizen_5.0 accepted/tizen/5.0/unified/20181102.012622 accepted/tizen/unified/20180906.144217 submit/tizen/20180906.100329 submit/tizen_5.0/20181101.000001
authorSeungbae Shin <seungbae.shin@samsung.com>
Tue, 4 Sep 2018 08:38:47 +0000 (17:38 +0900)
committerSeungbae Shin <seungbae.shin@samsung.com>
Thu, 6 Sep 2018 04:31:58 +0000 (13:31 +0900)
 - Fix condition check macro to support multiple expression.
 - Init/Deinit mutex control properly.
 - Avoid error print out by accessing non-exist volume ini file
 - Add dummy message callback implements
 - Avoid returning error on unhandled route option

[Version] 0.1.9
[Issue Type] Bug

Change-Id: I2fe8944048a94d6355855cda48039a37c398dada

Makefile.am
packaging/audio-hal-wm1831-tw2.spec
tizen-audio-comm.c [new file with mode: 0644]
tizen-audio-ctrl.c [new file with mode: 0644]
tizen-audio-impl-ctrl.c
tizen-audio-impl.h
tizen-audio-internal.h
tizen-audio-routing.c
tizen-audio-volume.c
tizen-audio.c
tizen-audio.h

index a7c112df283ddb74eae37c13d623e47e614ad30d..98494e42969a607ce65c7e32944f589ccbed8c55 100644 (file)
@@ -6,6 +6,8 @@ libtizen_audio_la_SOURCES = tizen-audio.c \
                tizen-audio-stream.c \
                tizen-audio-pcm.c \
                tizen-audio-util.c \
+               tizen-audio-comm.c \
+               tizen-audio-ctrl.c \
                tizen-audio-impl-pcm.c \
                tizen-audio-impl-ucm.c \
                tizen-audio-impl-ctrl.c
index b4db7b8e20464c0c4f6af0b8e2ab453b00bbd947..bcd6465f9393f9249c973e68254ba843d9676a35 100644 (file)
@@ -1,6 +1,6 @@
 Name:       audio-hal-wm1831-tw2
 Summary:    TIZEN Audio HAL for WM1831(TW2)
-Version:    0.1.8
+Version:    0.1.9
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0
diff --git a/tizen-audio-comm.c b/tizen-audio-comm.c
new file mode 100644 (file)
index 0000000..628e8d9
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * audio-hal
+ *
+ * Copyright (c) 2015 - 2016 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.
+ *
+ */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "tizen-audio-internal.h"
+
+static audio_return_t __set_message_callback(audio_hal_t *ah, message_cb callback, void *user_data)
+{
+    audio_return_t audio_ret = AUDIO_RET_OK;
+
+    AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
+    AUDIO_RETURN_VAL_IF_FAIL(callback, AUDIO_ERR_PARAMETER);
+
+    ah->comm.msg_cb = callback;
+    ah->comm.user_data = user_data;
+
+    AUDIO_LOG_DEBUG("message callback is set, callback(%p), user_data(%p)", ah->comm.msg_cb, ah->comm.user_data);
+
+    return audio_ret;
+}
+
+static audio_return_t __unset_message_callback(audio_hal_t *ah)
+{
+    audio_return_t audio_ret = AUDIO_RET_OK;
+
+    AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
+
+    ah->comm.msg_cb = NULL;
+    ah->comm.user_data = NULL;
+
+    AUDIO_LOG_DEBUG("message callback is unset");
+
+    return audio_ret;
+}
+
+audio_return_t _audio_comm_init(audio_hal_t *ah)
+{
+    audio_return_t audio_ret = AUDIO_RET_OK;
+
+    AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
+
+    ah->comm.msg_cb = NULL;
+    ah->comm.user_data = NULL;
+
+    return audio_ret;
+}
+
+audio_return_t _audio_comm_deinit(audio_hal_t *ah)
+{
+    audio_return_t audio_ret = AUDIO_RET_OK;
+
+    AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
+
+    ah->comm.msg_cb = NULL;
+    ah->comm.user_data = NULL;
+
+    return audio_ret;
+}
+
+audio_return_t _audio_comm_send_message(audio_hal_t *ah, const char *name, int value)
+{
+    audio_return_t audio_ret = AUDIO_RET_OK;
+
+    AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
+    AUDIO_RETURN_VAL_IF_FAIL(name, AUDIO_ERR_PARAMETER);
+
+    AUDIO_LOG_DEBUG("send message : name(%s), value(%d)", name, value);
+    if (ah->comm.msg_cb) {
+        ah->comm.msg_cb(name, value, ah->comm.user_data);
+    }
+
+    return audio_ret;
+}
+
+audio_return_t audio_add_message_cb(void *audio_handle, message_cb callback, void *user_data)
+{
+    audio_return_t ret = AUDIO_RET_OK;
+
+    AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
+    AUDIO_RETURN_VAL_IF_FAIL(callback, AUDIO_ERR_PARAMETER);
+
+    /* NOTE: Management of several callbacks could be implemented.
+             But we do not care of it for now.*/
+    ret = __set_message_callback((audio_hal_t *)audio_handle, callback, user_data);
+
+    return ret;
+}
+
+audio_return_t audio_remove_message_cb(void *audio_handle, message_cb callback)
+{
+    audio_return_t ret = AUDIO_RET_OK;
+
+    AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER);
+    AUDIO_RETURN_VAL_IF_FAIL(callback, AUDIO_ERR_PARAMETER);
+
+    ret = __unset_message_callback((audio_hal_t *)audio_handle);
+
+    return ret;
+}
\ No newline at end of file
diff --git a/tizen-audio-ctrl.c b/tizen-audio-ctrl.c
new file mode 100644 (file)
index 0000000..2b9bacd
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * audio-hal
+ *
+ * Copyright (c) 2018 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.
+ *
+ */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "tizen-audio-internal.h"
+#include "tizen-audio-impl.h"
+
+audio_return_t _audio_ctrl_init(audio_hal_t *ah)
+{
+    audio_return_t audio_ret = AUDIO_RET_OK;
+
+    AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
+
+    audio_ret = _mixer_control_init(ah);
+
+    return audio_ret;
+}
+
+audio_return_t _audio_ctrl_deinit(audio_hal_t *ah)
+{
+    audio_return_t audio_ret = AUDIO_RET_OK;
+
+    AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
+
+    audio_ret = _mixer_control_deinit(ah);
+
+    return audio_ret;
+}
index 253eaab0c6776399978c2f578c9c40d185ed3452..1c54bc427cf24105956fd61e4c0e020cbc3eea26 100644 (file)
@@ -47,7 +47,7 @@ static void __dump_mixer_param(char *dump, long *param, int size)
 }
 #endif
 
-audio_return_t _control_init(audio_hal_t *ah)
+audio_return_t _mixer_control_init(audio_hal_t *ah)
 {
     AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
 
@@ -55,7 +55,7 @@ audio_return_t _control_init(audio_hal_t *ah)
     return AUDIO_RET_OK;
 }
 
-audio_return_t _control_deinit(audio_hal_t *ah)
+audio_return_t _mixer_control_deinit(audio_hal_t *ah)
 {
     AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
 
index 99e738c3637d17bd5e8b46e4279ae4633b53f2a6..82180326c3d7b9ca2f35e2baf2f80a2a2e4dbe5b 100644 (file)
@@ -45,8 +45,8 @@ audio_return_t _pcm_set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t avail_min, u
 audio_return_t _pcm_set_hw_params(snd_pcm_t *pcm, audio_pcm_sample_spec_t *sample_spec, uint8_t *use_mmap, snd_pcm_uframes_t *period_size, snd_pcm_uframes_t *buffer_size);
 
 /* Control */
-audio_return_t _control_init(audio_hal_t *ah);
-audio_return_t _control_deinit(audio_hal_t *ah);
+audio_return_t _mixer_control_init(audio_hal_t *ah);
+audio_return_t _mixer_control_deinit(audio_hal_t *ah);
 audio_return_t _mixer_control_set_param(audio_hal_t *ah, const char* ctl_name, snd_ctl_elem_value_t* value, int size);
 audio_return_t _mixer_control_set_value(audio_hal_t *ah, const char *ctl_name, int val);
 audio_return_t _mixer_control_set_value_string(audio_hal_t *ah, const char* ctl_name, const char* value);
index c1e8de03722f5c989e9634bfe4e685cea7fdf440..c1c4ca0c5ff69609ae3696f2648b7f00144f5b71 100644 (file)
 #endif
 
 #define AUDIO_RETURN_IF_FAIL(expr) do { \
-    if (!expr) { \
+    if (!(expr)) { \
         AUDIO_LOG_ERROR("%s failed", #expr); \
         return; \
     } \
 } while (0)
 #define AUDIO_RETURN_VAL_IF_FAIL(expr, val) do { \
-    if (!expr) { \
+    if (!(expr)) { \
         AUDIO_LOG_ERROR("%s failed", #expr); \
         return val; \
     } \
 } while (0)
 #define AUDIO_RETURN_NULL_IF_FAIL(expr) do { \
-    if (!expr) { \
+    if (!(expr)) { \
         AUDIO_LOG_ERROR("%s failed", #expr); \
         return NULL; \
     } \
@@ -282,6 +282,11 @@ typedef enum audio_sample_format {
     AUDIO_SAMPLE_INVALID = -1
 } audio_sample_format_t;
 
+typedef struct audio_hal_comm {
+    message_cb msg_cb;
+    void *user_data;
+} audio_hal_comm_t;
+
 /* Overall */
 #define MAX_DIRECTION 2
 typedef struct audio_hal {
@@ -289,10 +294,13 @@ typedef struct audio_hal {
     audio_hal_volume_t volume;
     audio_hal_ucm_t ucm;
     audio_hal_mixer_t mixer;
+    audio_hal_comm_t comm;
     audio_route_info_t *saved_route_infos[MAX_DIRECTION];
     bool call_wideband;
 } audio_hal_t;
 
+audio_return_t _audio_ctrl_init(audio_hal_t *ah);
+audio_return_t _audio_ctrl_deinit(audio_hal_t *ah);
 audio_return_t _audio_volume_init(audio_hal_t *ah);
 audio_return_t _audio_volume_deinit(audio_hal_t *ah);
 audio_return_t _audio_routing_init(audio_hal_t *ah);
@@ -301,6 +309,9 @@ audio_return_t _audio_stream_init(audio_hal_t *ah);
 audio_return_t _audio_stream_deinit(audio_hal_t *ah);
 audio_return_t _audio_pcm_init(audio_hal_t *ah);
 audio_return_t _audio_pcm_deinit(audio_hal_t *ah);
+audio_return_t _audio_comm_init(audio_hal_t *ah);
+audio_return_t _audio_comm_deinit(audio_hal_t *ah);
+audio_return_t _audio_comm_send_message(audio_hal_t *ah, const char *name, int value);
 
 typedef struct _dump_data {
     char *strbuf;
index 1b43573e581ce3da963d0c246acdb7260cfa1d14..96528f64661c46f793f8d977d6573af6661cfb62 100644 (file)
@@ -587,9 +587,8 @@ audio_return_t audio_update_route_option(void *audio_handle, audio_route_option_
         }
         __reset_saved_route_infos(ah);
     } else {
-        AUDIO_LOG_ERROR("undefined route option");
-        audio_ret = AUDIO_ERR_UNDEFINED;
+        AUDIO_LOG_WARN("undefined route option");
     }
 
     return audio_ret;
-}
\ No newline at end of file
+}
index 227bf228ef4312bd928ddfe4f5537714a53d427d..87c55231d9160276af739512709e5d42b6f31640 100644 (file)
@@ -182,7 +182,8 @@ static audio_return_t __load_volume_value_table_from_ini(audio_hal_t *ah)
     audio_volume_value_table_t *volume_value_table = ah->volume.volume_value_table;
     int size = 0;
 
-    dict = iniparser_load(VOLUME_INI_TEMP_PATH);
+    if (access(VOLUME_INI_TEMP_PATH, F_OK) == 0)
+        dict = iniparser_load(VOLUME_INI_TEMP_PATH);
     if (!dict) {
         AUDIO_LOG_DEBUG("Use default volume&gain ini file");
         dict = iniparser_load(VOLUME_INI_DEFAULT_PATH);
index b83397b03cfecec2c12f8060cded8c3a16d391bf..c587ee01a8f4f4beec460687671aeefe3393a02d 100644 (file)
@@ -34,6 +34,11 @@ audio_return_t audio_init(void **audio_handle)
         AUDIO_LOG_ERROR("failed to malloc()");
         return AUDIO_ERR_RESOURCE;
     }
+
+    if ((ret = _audio_ctrl_init(ah))) {
+        AUDIO_LOG_ERROR("failed to _audio_ctrl_init(), ret(0x%x)", ret);
+        goto error_exit;
+    }
     if ((ret = _audio_volume_init(ah))) {
         AUDIO_LOG_ERROR("failed to _audio_volume_init(), ret(0x%x)", ret);
         goto error_exit;
@@ -50,6 +55,10 @@ audio_return_t audio_init(void **audio_handle)
         AUDIO_LOG_ERROR("failed to _audio_pcm_init(), ret(0x%x)", ret);
         goto error_exit;
     }
+    if ((ret = _audio_comm_init(ah))) {
+        AUDIO_LOG_ERROR("failed to _audio_comm_init(), ret(0x%x)", ret);
+        goto error_exit;
+    }
 
     *audio_handle = (void *)ah;
     return AUDIO_RET_OK;
@@ -71,6 +80,9 @@ audio_return_t audio_deinit(void *audio_handle)
     _audio_routing_deinit(ah);
     _audio_stream_deinit(ah);
     _audio_pcm_deinit(ah);
+    _audio_comm_deinit(ah);
+    _audio_ctrl_deinit(ah);
+
     free(ah);
     ah = NULL;
 
index d752d892558cdaea17155c40e66b3026aea35b6e..94efa03d2b3c8ed8414cd1f18f2c2d807b66fb24 100644 (file)
@@ -107,6 +107,18 @@ typedef struct audio_stream_info {
     uint32_t idx;
 } audio_stream_info_t ;
 
+/**
+ * @brief Called when audio hal implementation needs to send a message.
+ * @since_tizen 3.0
+ * @param[in] name The message name
+ * @param[in] value The message value
+ * @param[in] user_data The user data passed from the callback registration function
+ *
+ * @see audio_add_message_cb()
+ * @see audio_remove_message_cb()
+ */
+typedef void (*message_cb)(const char *name, int value, void *user_data);
+
 /* Overall */
 typedef struct audio_interface {
     /* Initialization & de-initialization */
@@ -136,6 +148,9 @@ typedef struct audio_interface {
     audio_return_t (*pcm_recover)(void *audio_handle, void *pcm_handle, int revents);
     audio_return_t (*pcm_get_params)(void *audio_handle, void *pcm_handle, uint32_t direction, void **sample_spec, uint32_t *period_size, uint32_t *periods);
     audio_return_t (*pcm_set_params)(void *audio_handle, void *pcm_handle, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods);
+    /* Message callback */
+    audio_return_t (*add_message_cb)(void *audio_handle, message_cb callback, void *user_data);
+    audio_return_t (*remove_message_cb)(void *audio_handle, message_cb callback);
 } audio_interface_t;
 
 /**
@@ -474,6 +489,29 @@ audio_return_t audio_pcm_get_params(void *audio_handle, void *pcm_handle, uint32
  */
 audio_return_t audio_pcm_set_params(void *audio_handle, void *pcm_handle, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods);
 
+/**
+ * @brief Adds the message callback function.
+ * @since_tizen 3.0
+ * @param[in] audio_handle The audio hal handle
+ * @param[in] message_cb The message callback function
+ * @param[in] user_data The user data passed to the callback function
+ *
+ * @see message_cb()
+ * @see audio_remove_message_cb()
+ */
+audio_return_t audio_add_message_cb(void *audio_handle, message_cb callback, void *user_data);
+
+/**
+ * @brief Removes the message callback function.
+ * @since_tizen 3.0
+ * @param[in] audio_handle The audio hal handle
+ * @param[in] message_cb The message callback function to be removed
+ *
+ * @see message_cb()
+ * @see audio_add_message_cb()
+ */
+audio_return_t audio_remove_message_cb(void *audio_handle, message_cb callback);
+
 /**
 * @}
 */