Support audio_set_message_cb() and call the callback with variables for loopback 99/56999/3 accepted/tizen/tv/20160115.115007 submit/tizen_common/20160218.142243 submit/tizen_tv/20160115.085401
authorSangchul Lee <sc11.lee@samsung.com>
Thu, 14 Jan 2016 07:46:29 +0000 (16:46 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Fri, 15 Jan 2016 06:34:28 +0000 (15:34 +0900)
[Version] 0.1.9
[Profile] TV
[Issue Type] Feature Enhancement

Change-Id: I48896efe8f784016a09864efb36ea506dbe8b9e3
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
Makefile.am
packaging/audio-hal-hawkp.spec
tizen-audio-comm.c [new file with mode: 0644]
tizen-audio-device.c
tizen-audio-internal.h
tizen-audio.c
tizen-audio.h

index 4fdba48..6c46727 100644 (file)
@@ -3,6 +3,7 @@ lib_LTLIBRARIES = libtizen-audio.la
 libtizen_audio_la_SOURCES = tizen-audio.c \
                tizen-audio-device.c \
                tizen-audio-volume.c \
+               tizen-audio-comm.c \
                tizen-audio-util.c
 libtizen_audio_la_LDFLAGS = $(AM_LDFLAGS) -disable-static -avoid-version
 if USE_TINYALSA
index b756b8b..1ba3354 100644 (file)
@@ -1,6 +1,6 @@
 Name:       audio-hal-hawkp
 Summary:    TIZEN Audio HAL for Hawkp
-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..d94aa22
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * audio-hal
+ *
+ * Copyright (c) 2000 - 2013 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"
+
+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_comm_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;
+}
+
+audio_return_t _audio_comm_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;
+}
index d628ed2..fff017d 100644 (file)
@@ -241,6 +241,8 @@ static audio_return_t _do_route_reset(audio_hal_t *ah, uint32_t direction)
     return audio_ret;
 }
 
+#define LOOPBACK_ARG_LATENCY_MSEC      30
+#define LOOPBACK_ARG_ADJUST_TIME_SEC   3
 audio_return_t audio_do_route(void *audio_handle, audio_route_info_t *info)
 {
     audio_return_t audio_ret = AUDIO_RET_OK;
@@ -265,6 +267,11 @@ audio_return_t audio_do_route(void *audio_handle, audio_route_info_t *info)
             AUDIO_LOG_WARN("set reset return 0x%x", audio_ret);
         }
     } else {
+        /* send latency and adjust time for loopback */
+        if (!strncmp("loopback", info->role, MAX_NAME_LEN)) {
+            _audio_comm_send_message(ah, "loopback::latency", LOOPBACK_ARG_LATENCY_MSEC);
+            _audio_comm_send_message(ah, "loopback::adjust_time", LOOPBACK_ARG_ADJUST_TIME_SEC);
+        }
         /* need to prepare for "alarm","notification","emergency","voice-information","voice-recognition","ringtone" */
         audio_ret = _do_route_ap_playback_capture(ah, info);
         if (AUDIO_IS_ERROR(audio_ret)) {
index c91f0f9..b61b489 100644 (file)
@@ -264,11 +264,17 @@ 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 */
 typedef struct audio_hal {
     audio_hal_device_t device;
     audio_hal_volume_t volume;
     audio_hal_mixer_t mixer;
+    audio_hal_comm_t comm;
 } audio_hal_t;
 
 typedef struct {
@@ -284,12 +290,15 @@ typedef struct samplerate_ctrl {
 
 audio_return_t _audio_volume_init(audio_hal_t *ah);
 audio_return_t _audio_volume_deinit(audio_hal_t *ah);
-
 audio_return_t _audio_device_init(audio_hal_t *ah);
 audio_return_t _audio_device_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_util_init(audio_hal_t *ah);
 audio_return_t _audio_util_deinit(audio_hal_t *ah);
+audio_return_t _audio_comm_send_message(audio_hal_t *ah, const char *name, int value);
+audio_return_t _audio_comm_set_message_callback(audio_hal_t *ah, message_cb callback, void *user_data);
+audio_return_t _audio_comm_unset_message_callback(audio_hal_t *ah);
 audio_return_t _audio_mixer_control_set_param(audio_hal_t *ah, const char* ctl_name, snd_ctl_elem_value_t* value, int size);
 audio_return_t _audio_mixer_control_set_value(audio_hal_t *ah, const char *card, const char *ctl_name, int val);
 audio_return_t _audio_mixer_control_set_value_string(audio_hal_t *ah, const char* ctl_name, const char* value);
index 20f865c..8028020 100644 (file)
@@ -29,7 +29,6 @@ static const char* AUDIO_LATENCY_MID  = "mid";
 static const char* AUDIO_LATENCY_HIGH = "high";
 static const char* AUDIO_LATENCY_VOIP = "voip";
 
-
 static audio_return_t _audio_mixer_init(audio_hal_t *ah)
 {
     AUDIO_RETURN_VAL_IF_FAIL(ah, AUDIO_ERR_PARAMETER);
@@ -48,6 +47,18 @@ static audio_return_t _audio_mixer_init(audio_hal_t *ah)
     return AUDIO_RET_OK;
 }
 
+audio_return_t audio_set_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);
+
+    ret = _audio_comm_set_message_callback((audio_hal_t *)audio_handle, callback, user_data);
+
+    return ret;
+}
+
 audio_return_t audio_init(void **audio_handle)
 {
     audio_hal_t *ah;
@@ -76,6 +87,10 @@ audio_return_t audio_init(void **audio_handle)
         AUDIO_LOG_ERROR("mixer init failed");
         goto error_exit;
     }
+    if (AUDIO_IS_ERROR((ret = _audio_comm_init(ah)))) {
+        AUDIO_LOG_ERROR("comm init failed");
+        goto error_exit;
+    }
 
     *audio_handle = (void *)ah;
     return AUDIO_RET_OK;
@@ -96,6 +111,7 @@ audio_return_t audio_deinit(void *audio_handle)
     _audio_device_deinit(ah);
     _audio_volume_deinit(ah);
     _audio_util_deinit(ah);
+    _audio_comm_deinit(ah);
     free(ah);
     ah = NULL;
 
index dcc95da..794cdd7 100644 (file)
@@ -71,6 +71,8 @@ typedef struct audio_stream_info {
     uint32_t idx;
 } audio_stream_info_t ;
 
+typedef void (*message_cb)(const char *name, int value, void *user_data);
+
 /* Overall */
 typedef struct audio_interface {
     audio_return_t (*init)(void **audio_handle);
@@ -101,6 +103,8 @@ 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 (*set_message_cb)(void *audio_handle, message_cb callback, void *user_data);
 } audio_interface_t;
 
 audio_return_t audio_init(void **audio_handle);
@@ -127,4 +131,5 @@ audio_return_t audio_pcm_get_fd(void *audio_handle, void *pcm_handle, int *fd);
 audio_return_t audio_pcm_recover(void *audio_handle, void *pcm_handle, int revents);
 audio_return_t audio_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 audio_pcm_set_params(void *audio_handle, void *pcm_handle, uint32_t direction, void *sample_spec, uint32_t period_size, uint32_t periods);
+audio_return_t audio_set_message_cb(void *audio_handle, message_cb callback, void *user_data);
 #endif