diff options
author | Seungbae Shin <seungbae.shin@samsung.com> | 2018-09-04 17:38:47 +0900 |
---|---|---|
committer | Seungbae Shin <seungbae.shin@samsung.com> | 2018-09-06 13:31:58 +0900 |
commit | e1f9d7d7736e6bd703a182d6bd8a3ce3e469bc4e (patch) | |
tree | f9a061c94a34be802facee742f94e22dd5a064ef | |
parent | ee7289bb97278beed335c2bd454f18ba08e96555 (diff) | |
download | audio-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 for audio-hal testcasesubmit/tizen_5.0/20181101.000001submit/tizen/20180906.100329accepted/tizen/unified/20180906.144217accepted/tizen/5.0/unified/20181102.012622tizen_5.0accepted/tizen_5.0_unified
- 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.am | 2 | ||||
-rw-r--r-- | packaging/audio-hal-wm1831-tw2.spec | 2 | ||||
-rw-r--r-- | tizen-audio-comm.c | 117 | ||||
-rw-r--r-- | tizen-audio-ctrl.c | 46 | ||||
-rw-r--r-- | tizen-audio-impl-ctrl.c | 4 | ||||
-rw-r--r-- | tizen-audio-impl.h | 4 | ||||
-rw-r--r-- | tizen-audio-internal.h | 17 | ||||
-rw-r--r-- | tizen-audio-routing.c | 5 | ||||
-rw-r--r-- | tizen-audio-volume.c | 3 | ||||
-rw-r--r-- | tizen-audio.c | 12 | ||||
-rw-r--r-- | tizen-audio.h | 38 |
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); + +/** * @} */ |