Add missing implementations 41/253641/4 accepted/tizen/unified/20210219.095201 submit/tizen/20210218.045157 submit/tizen/20210219.045921
authorSeungbae Shin <seungbae.shin@samsung.com>
Wed, 10 Feb 2021 03:21:25 +0000 (12:21 +0900)
committerSeungbae Shin <seungbae.shin@samsung.com>
Thu, 18 Feb 2021 02:13:25 +0000 (11:13 +0900)
sync code with other audio hal backends

[Version] 0.1.12
[Issue Type] Update

Change-Id: I386229e4c1d4ed93a7f80664acf1d68be4fe9532

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

index ef9d5be4f4c901e8c98d3c531b9c5f8c89b95fb6..4e477dc2164bcabc5e6390dc19992f831b4b8ef9 100644 (file)
@@ -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 \
index 3072075317f7292ebc1e1131d9acc453b63b6451..ef1e50b917a98ffd71a740712fea9608775006d1 100644 (file)
@@ -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;
index b75b5a52124a6b905663ae5fe424d96f687f3081..f0a3fe203daa7a9e6da607af0f097f0558b6a4e2 100644 (file)
@@ -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 (file)
index 0000000..aa3d6bc
--- /dev/null
@@ -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 <config.h>
+#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;
+}
index 4458cecf1438e2362148c0de979fb5b9ed08e072..49f6373511847d468e95dcd462fb78b8f687fe82 100644 (file)
@@ -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));
 
index 131c56fba61a1b9c460f23b69a61b652505d87cf..e0e0e52aa994e0921f2aa49d959046c5fb71365e 100644 (file)
@@ -24,7 +24,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <stdbool.h>
 
 #include "tizen-audio-internal.h"
 #include "tizen-audio-impl.h"
index 48305d63e5468b5ac14735899790f3583564ee7c..a69ba848c18fd55c37d6a4c4c6cb8b8c72219738 100644 (file)
@@ -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;
index a8519fb81286f3ba5f6a37b267fecf3c61219a66..c4f29825fe5826be921c64d5915a1b9f86a3a47a 100644 (file)
@@ -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;
 }
index de20c871724c8e7f8305284b2e44d8b09a14fc77..bb2655821c4a69d5777b2631afc660a91f8c8cc0 100644 (file)
@@ -22,7 +22,6 @@
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <stdbool.h>
 #include <string.h>
 #include <math.h>
 #include <vconf.h>
@@ -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;
 }
index 39da2e4acbef977488af849f0e7e5a9954c66b51..dbc437abfa429dc67f1dd55a82e3250b45f2ea8d 100644 (file)
@@ -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);
index 1f2289f46f7dd3067a112715690f3b5e337996a8..52ed4cba1ab5b8af35b994bf2b38eb6529b55029 100644 (file)
@@ -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);
+
 /**
 * @}
 */