summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeungbae Shin <seungbae.shin@samsung.com>2018-09-04 17:38:47 +0900
committerSeungbae Shin <seungbae.shin@samsung.com>2018-09-06 13:31:58 +0900
commite1f9d7d7736e6bd703a182d6bd8a3ce3e469bc4e (patch)
treef9a061c94a34be802facee742f94e22dd5a064ef
parentee7289bb97278beed335c2bd454f18ba08e96555 (diff)
downloadaudio-hal-wm1831-tw2-tizen_5.0.tar.gz
audio-hal-wm1831-tw2-tizen_5.0.tar.bz2
audio-hal-wm1831-tw2-tizen_5.0.zip
- 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
-rw-r--r--Makefile.am2
-rw-r--r--packaging/audio-hal-wm1831-tw2.spec2
-rw-r--r--tizen-audio-comm.c117
-rw-r--r--tizen-audio-ctrl.c46
-rw-r--r--tizen-audio-impl-ctrl.c4
-rw-r--r--tizen-audio-impl.h4
-rw-r--r--tizen-audio-internal.h17
-rw-r--r--tizen-audio-routing.c5
-rw-r--r--tizen-audio-volume.c3
-rw-r--r--tizen-audio.c12
-rw-r--r--tizen-audio.h38
11 files changed, 238 insertions, 12 deletions
diff --git a/Makefile.am b/Makefile.am
index a7c112d..98494e4 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -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
diff --git a/packaging/audio-hal-wm1831-tw2.spec b/packaging/audio-hal-wm1831-tw2.spec
index b4db7b8..bcd6465 100644
--- a/packaging/audio-hal-wm1831-tw2.spec
+++ b/packaging/audio-hal-wm1831-tw2.spec
@@ -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
index 0000000..628e8d9
--- /dev/null
+++ b/tizen-audio-comm.c
@@ -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
index 0000000..2b9bacd
--- /dev/null
+++ b/tizen-audio-ctrl.c
@@ -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;
+}
diff --git a/tizen-audio-impl-ctrl.c b/tizen-audio-impl-ctrl.c
index 253eaab..1c54bc4 100644
--- a/tizen-audio-impl-ctrl.c
+++ b/tizen-audio-impl-ctrl.c
@@ -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);
diff --git a/tizen-audio-impl.h b/tizen-audio-impl.h
index 99e738c..8218032 100644
--- a/tizen-audio-impl.h
+++ b/tizen-audio-impl.h
@@ -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);
diff --git a/tizen-audio-internal.h b/tizen-audio-internal.h
index c1e8de0..c1c4ca0 100644
--- a/tizen-audio-internal.h
+++ b/tizen-audio-internal.h
@@ -58,19 +58,19 @@
#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;
diff --git a/tizen-audio-routing.c b/tizen-audio-routing.c
index 1b43573..96528f6 100644
--- a/tizen-audio-routing.c
+++ b/tizen-audio-routing.c
@@ -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
+}
diff --git a/tizen-audio-volume.c b/tizen-audio-volume.c
index 227bf22..87c5523 100644
--- a/tizen-audio-volume.c
+++ b/tizen-audio-volume.c
@@ -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);
diff --git a/tizen-audio.c b/tizen-audio.c
index b83397b..c587ee0 100644
--- a/tizen-audio.c
+++ b/tizen-audio.c
@@ -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;
diff --git a/tizen-audio.h b/tizen-audio.h
index d752d89..94efa03 100644
--- a/tizen-audio.h
+++ b/tizen-audio.h
@@ -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;
/**
@@ -475,6 +490,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);
+
+/**
* @}
*/