From: Seungbae Shin Date: Wed, 10 Feb 2021 03:21:25 +0000 (+0900) Subject: Add missing implementations X-Git-Tag: submit/tizen/20210218.045157^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b3bdacec94db89e66a984dfdaac672a5b3b4cfa0;p=platform%2Fadaptation%2Fap_broadcom%2Faudio-hal-bcm2837.git Add missing implementations sync code with other audio hal backends [Version] 0.1.12 [Issue Type] Update Change-Id: I386229e4c1d4ed93a7f80664acf1d68be4fe9532 --- diff --git a/Makefile.am b/Makefile.am index ef9d5be..4e477dc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -6,6 +6,7 @@ libhal_backend_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-ctrl.c \ diff --git a/hal-backend-audio.c b/hal-backend-audio.c index 3072075..ef1e50b 100644 --- a/hal-backend-audio.c +++ b/hal-backend-audio.c @@ -34,15 +34,21 @@ static int audio_rpi_init(void **data) funcs->init = audio_init; funcs->deinit = audio_deinit; + funcs->get_volume_level_max = audio_get_volume_level_max; + funcs->get_volume_level = audio_get_volume_level; funcs->set_volume_level = audio_set_volume_level; funcs->get_volume_value = audio_get_volume_value; funcs->get_volume_mute = audio_get_volume_mute; funcs->set_volume_mute = audio_set_volume_mute; funcs->set_volume_ratio = audio_set_volume_ratio; + funcs->notify_ducking_activation_changed = audio_notify_ducking_activation_changed; + funcs->update_route = audio_update_route; funcs->update_route_option = audio_update_route_option; + funcs->notify_stream_connection_changed = audio_notify_stream_connection_changed; + funcs->pcm_open = audio_pcm_open; funcs->pcm_start = audio_pcm_start; funcs->pcm_stop = audio_pcm_stop; @@ -55,6 +61,9 @@ static int audio_rpi_init(void **data) funcs->pcm_get_params = audio_pcm_get_params; funcs->pcm_set_params = audio_pcm_set_params; + funcs->add_message_cb = audio_add_message_cb; + funcs->remove_message_cb = audio_remove_message_cb; + *data = (void *)funcs; return 0; diff --git a/packaging/audio-hal-bcm2837.spec b/packaging/audio-hal-bcm2837.spec index b75b5a5..f0a3fe2 100644 --- a/packaging/audio-hal-bcm2837.spec +++ b/packaging/audio-hal-bcm2837.spec @@ -1,6 +1,6 @@ Name: audio-hal-bcm2837 Summary: TIZEN Audio HAL for BCM2837 -Version: 0.1.11 +Version: 0.1.12 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..aa3d6bc --- /dev/null +++ b/tizen-audio-comm.c @@ -0,0 +1,116 @@ +/* + * 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 +#endif + +#include "tizen-audio-internal.h" + +static audio_return_e __set_message_callback(audio_hal_s *ah, message_cb callback, void *user_data) +{ + audio_return_e 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_e __unset_message_callback(audio_hal_s *ah) +{ + audio_return_e 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_e _audio_comm_init(audio_hal_s *ah) +{ + audio_return_e 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_e _audio_comm_deinit(audio_hal_s *ah) +{ + audio_return_e 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_e _audio_comm_send_message(audio_hal_s *ah, const char *name, int value) +{ + audio_return_e 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_e audio_add_message_cb(void *audio_handle, message_cb callback, void *user_data) +{ + audio_return_e 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_s *)audio_handle, callback, user_data); + + return ret; +} + +audio_return_e audio_remove_message_cb(void *audio_handle, message_cb callback) +{ + audio_return_e 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_s *)audio_handle); + + return ret; +} diff --git a/tizen-audio-impl-ctrl.c b/tizen-audio-impl-ctrl.c index 4458cec..49f6373 100644 --- a/tizen-audio-impl-ctrl.c +++ b/tizen-audio-impl-ctrl.c @@ -37,9 +37,8 @@ static void __dump_mixer_param(char *dump, long *param, int size) len = sprintf(dump, "%ld", *param); if (len > 0) dump += len; - if (i != size -1) { + if (i != size -1) *dump++ = ','; - } param++; } @@ -82,6 +81,8 @@ audio_return_e _mixer_control_get_value(audio_hal_s *ah, const char *ctl_name, i int ret = 0, count = 0, i = 0; AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER); + AUDIO_RETURN_VAL_IF_FAIL(ctl_name, AUDIO_ERR_PARAMETER); + AUDIO_RETURN_VAL_IF_FAIL(val, AUDIO_ERR_PARAMETER); pthread_mutex_lock(&(ah->mixer.mutex)); diff --git a/tizen-audio-impl-pcm.c b/tizen-audio-impl-pcm.c index 131c56f..e0e0e52 100644 --- a/tizen-audio-impl-pcm.c +++ b/tizen-audio-impl-pcm.c @@ -24,7 +24,6 @@ #include #include #include -#include #include "tizen-audio-internal.h" #include "tizen-audio-impl.h" diff --git a/tizen-audio-internal.h b/tizen-audio-internal.h index 48305d6..a69ba84 100644 --- a/tizen-audio-internal.h +++ b/tizen-audio-internal.h @@ -147,10 +147,6 @@ typedef enum audio_route_mode { typedef struct audio_hal_device { uint32_t active_in; uint32_t active_out; - snd_pcm_t *pcm_in; - snd_pcm_t *pcm_out; - pthread_mutex_t pcm_lock; - uint32_t pcm_count; audio_route_mode_e mode; } audio_hal_device_s; @@ -230,11 +226,17 @@ typedef enum audio_sample_format { AUDIO_SAMPLE_INVALID = -1 } audio_sample_format_s; +typedef struct audio_hal_comm { + message_cb msg_cb; + void *user_data; +} audio_hal_comm_s; + /* Overall */ typedef struct audio_hal { audio_hal_device_s device; audio_hal_volume_s volume; audio_hal_mixer_s mixer; + audio_hal_comm_s comm; } audio_hal_s; audio_return_e _audio_ctrl_init(audio_hal_s *ah); @@ -247,6 +249,9 @@ audio_return_e _audio_stream_init(audio_hal_s *ah); audio_return_e _audio_stream_deinit(audio_hal_s *ah); audio_return_e _audio_pcm_init(audio_hal_s *ah); audio_return_e _audio_pcm_deinit(audio_hal_s *ah); +audio_return_e _audio_comm_init(audio_hal_s *ah); +audio_return_e _audio_comm_deinit(audio_hal_s *ah); +audio_return_e _audio_comm_send_message(audio_hal_s *ah, const char *name, int value); typedef struct _dump_data { char *strbuf; diff --git a/tizen-audio-pcm.c b/tizen-audio-pcm.c index a8519fb..c4f2982 100644 --- a/tizen-audio-pcm.c +++ b/tizen-audio-pcm.c @@ -28,10 +28,6 @@ audio_return_e _audio_pcm_init(audio_hal_s *ah) { AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER); - ah->device.pcm_in = NULL; - ah->device.pcm_out = NULL; - pthread_mutex_init(&ah->device.pcm_lock, NULL); - ah->device.pcm_count = 0; return AUDIO_RET_OK; } @@ -40,8 +36,6 @@ audio_return_e _audio_pcm_deinit(audio_hal_s *ah) { AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER); - pthread_mutex_destroy(&ah->device.pcm_lock); - return AUDIO_RET_OK; } @@ -49,7 +43,6 @@ audio_return_e audio_pcm_open(void *audio_handle, const char *card, const char * uint32_t period_size, uint32_t periods, void **pcm_handle) { audio_return_e audio_ret = AUDIO_RET_OK; - audio_hal_s *ah = NULL; AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER); AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER); @@ -60,8 +53,6 @@ audio_return_e audio_pcm_open(void *audio_handle, const char *card, const char * if ((audio_ret = _pcm_open(card, device, direction, sample_spec, period_size, periods, pcm_handle))) return audio_ret; - ah = (audio_hal_s*)audio_handle; - ah->device.pcm_count++; AUDIO_LOG_INFO("Opening PCM handle %p", *pcm_handle); return AUDIO_RET_OK; @@ -94,7 +85,6 @@ audio_return_e audio_pcm_stop(void *audio_handle, void *pcm_handle) audio_return_e audio_pcm_close(void *audio_handle, void *pcm_handle) { audio_return_e audio_ret = AUDIO_RET_OK; - audio_hal_s *ah = NULL; AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER); AUDIO_RETURN_VAL_IF_FAIL(pcm_handle, AUDIO_ERR_PARAMETER); @@ -103,10 +93,8 @@ audio_return_e audio_pcm_close(void *audio_handle, void *pcm_handle) return audio_ret; pcm_handle = NULL; - ah = (audio_hal_s*)audio_handle; - ah->device.pcm_count--; - AUDIO_LOG_INFO("PCM handle close success (count:%d)", ah->device.pcm_count); + AUDIO_LOG_INFO("PCM handle close success"); return audio_ret; } diff --git a/tizen-audio-volume.c b/tizen-audio-volume.c index de20c87..bb26558 100644 --- a/tizen-audio-volume.c +++ b/tizen-audio-volume.c @@ -22,7 +22,6 @@ #include #include -#include #include #include #include @@ -433,5 +432,23 @@ audio_return_e audio_set_volume_ratio(void *audio_handle, audio_stream_info_s *i AUDIO_LOG_INFO("set [%s] volume_ratio: %f, direction(%u), index(%u)", info->role, ratio, info->direction, info->idx); + /* TODO. Not implemented */ + + return audio_ret; +} + +audio_return_e audio_notify_ducking_activation_changed(void *audio_handle, audio_ducking_info_s *info, uint32_t is_activated) +{ + audio_return_e audio_ret = AUDIO_RET_OK; + audio_hal_s *ah = (audio_hal_s *)audio_handle; + + AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER); + AUDIO_RETURN_VAL_IF_FAIL(info, AUDIO_ERR_PARAMETER); + AUDIO_RETURN_VAL_IF_FAIL(info->target_role, AUDIO_ERR_PARAMETER); + + AUDIO_LOG_INFO("role:%s, duration:%u, ratio:%lf, is_activated:%u", info->target_role, info->duration, info->ratio, is_activated); + + /* TODO. Not implemented */ + return audio_ret; } diff --git a/tizen-audio.c b/tizen-audio.c index 39da2e4..dbc437a 100644 --- a/tizen-audio.c +++ b/tizen-audio.c @@ -30,8 +30,8 @@ audio_return_e audio_init(void **audio_handle) AUDIO_RETURN_VAL_IF_FAIL(audio_handle, AUDIO_ERR_PARAMETER); - if (!(ah = malloc(sizeof(audio_hal_s)))) { - AUDIO_LOG_ERROR("failed to malloc()"); + if (!(ah = calloc(1, sizeof(audio_hal_s)))) { + AUDIO_LOG_ERROR("failed to alloc()"); return AUDIO_ERR_RESOURCE; } @@ -55,6 +55,10 @@ audio_return_e 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; @@ -76,6 +80,7 @@ audio_return_e 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); diff --git a/tizen-audio.h b/tizen-audio.h index 1f2289f..52ed4cb 100644 --- a/tizen-audio.h +++ b/tizen-audio.h @@ -163,6 +163,21 @@ audio_return_e audio_set_volume_mute(void *audio_handle, audio_volume_info_s *in */ audio_return_e audio_set_volume_ratio(void *audio_handle, audio_stream_info_s *info, double ratio); +/** + * @brief Gets notified when a ducking is activated and deactivated. + * @since_tizen 5.5 + * @param[in] audio_handle The audio hal handle + * @param[in] info The ducking information including target role, duration and ratio + * @param[in] is_activated The activation state (@c true = activated, @c false = deactivated) + * + * @remarks This information can be used for volume controls. + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #AUDIO_RET_OK Success + */ +audio_return_e audio_notify_ducking_activation_changed(void *audio_handle, audio_ducking_info_s *info, uint32_t is_activated); + /** * @brief Updates the audio routing according to audio route information. * @since_tizen 3.0 @@ -382,6 +397,29 @@ audio_return_e audio_pcm_get_params(void *audio_handle, void *pcm_handle, uint32 */ audio_return_e 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_e 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_e audio_remove_message_cb(void *audio_handle, message_cb callback); + /** * @} */