The SCO received data is managed as a buffer and transmitted to audio. 95/319995/1 accepted/tizen/7.0/unified/20241107.163905
authorSohyeon Choi <shss.choi@samsung.com>
Wed, 6 Nov 2024 07:03:48 +0000 (16:03 +0900)
committerWootak Jung <wootak.jung@samsung.com>
Wed, 6 Nov 2024 07:26:31 +0000 (16:26 +0900)
Change-Id: Ifadeed719d1f69b424e18d4939a66a8f1f7c0290
Signed-off-by: Wootak Jung <wootak.jung@samsung.com>
hf-agent/bluetooth-hf-agent.c

index c51c4af6b43c5d38fd752b9c320b5a89f15cd805..d4f25af44e4fde4b856fb6b7c4990c091f5ad55e 100644 (file)
@@ -44,8 +44,9 @@
 
 #include <audio_io.h>
 
-#define HFP_SCO_DATA_BUFFER_SIZE       48
-#define HFP_FHUB_SAMPLE_RATE           8000
+#define HFP_SCO_DATA_BUFFER_SIZE 48
+#define HFP_SCO_DATA_RECV_BUFFER_SIZE (HFP_SCO_DATA_BUFFER_SIZE * 84)
+#define HFP_FHUB_SAMPLE_RATE 8000
 
 #define BT_AGENT_SYSPOPUP_MAX_ATTEMPT 3
 #define CALL_ALIAS_APP_ID "org.tizen.call-ui"
@@ -2658,11 +2659,19 @@ static gboolean __bt_hf_agent_sco_event_cb(GIOChannel *chan, GIOCondition cond,
        bt_hf_agent_info_t *bt_hf_info = user_data;
        GDBusConnection *conn;
        int sco_skt = g_io_channel_unix_get_fd(chan);
+       static gchar buf_rx[HFP_SCO_DATA_RECV_BUFFER_SIZE] = { 0, };
+       static int buf_rx_index = 0;
 
-       if (cond & G_IO_NVAL)
+       if (cond & G_IO_NVAL) {
+               memset(buf_rx, 0, HFP_SCO_DATA_RECV_BUFFER_SIZE);
+               buf_rx_index = 0;
                return FALSE;
+       }
 
        if (cond & (G_IO_HUP | G_IO_ERR)) {
+               memset(buf_rx, 0, HFP_SCO_DATA_RECV_BUFFER_SIZE);
+               buf_rx_index = 0;
+
                g_io_channel_shutdown(chan, TRUE, NULL);
                close(bt_hf_info->cli_sco_fd);
                bt_hf_info->cli_sco_fd = -1;
@@ -2691,27 +2700,39 @@ static gboolean __bt_hf_agent_sco_event_cb(GIOChannel *chan, GIOCondition cond,
        }
 
        if (cond & G_IO_IN) {
-               gchar buf_rx[HFP_SCO_DATA_BUFFER_SIZE] = { 0, };
                int read;
+               gboolean full_rx = FALSE;
 
-               read = recv(sco_skt, buf_rx, HFP_SCO_DATA_BUFFER_SIZE, MSG_DONTWAIT);
+               read = recv(sco_skt, buf_rx + buf_rx_index, HFP_SCO_DATA_BUFFER_SIZE, MSG_DONTWAIT);
                if (read > 0) {
-                       if (bt_hf_info->call_state == BT_HF_DA_CALL_STAT_CALL_SETUP_DIALING ||
-                               bt_hf_info->call_state == BT_HF_DA_CALL_STAT_CALL_SETUP_ALERTING ||
-                               bt_hf_info->call_active) {
+                       buf_rx_index += read;
+
+                       if (buf_rx_index >= HFP_SCO_DATA_RECV_BUFFER_SIZE) {
+                               full_rx = TRUE;
+                               buf_rx_index = HFP_SCO_DATA_RECV_BUFFER_SIZE;
+                       }
 
+                       if ((bt_hf_info->call_state == BT_HF_DA_CALL_STAT_CALL_SETUP_DIALING ||
+                                bt_hf_info->call_state == BT_HF_DA_CALL_STAT_CALL_SETUP_ALERTING ||
+                                bt_hf_info->call_active) && full_rx) {
                                if (bt_hf_info->is_first_audio_out) {
                                        __initialize_audio_out(bt_hf_info);
                                        bt_hf_info->is_first_audio_out = FALSE;
                                }
                                if (bt_hf_info->audio_output) {
-                                       audio_out_write(bt_hf_info->audio_output, buf_rx, read);
+                                       audio_out_write(bt_hf_info->audio_output, buf_rx, buf_rx_index);
                                } else {
                                        ERR("can't write audio");
                                }
                        }
+
+                       if (full_rx) {
+                               memset(buf_rx, 0, HFP_SCO_DATA_RECV_BUFFER_SIZE);
+                               buf_rx_index = 0;
+                       }
                }
        }
+
        if (cond & G_IO_OUT) {
                gchar buf_tx[HFP_SCO_DATA_BUFFER_SIZE] = { 0, };
                int size;
@@ -2736,6 +2757,7 @@ static gboolean __bt_hf_agent_sco_event_cb(GIOChannel *chan, GIOCondition cond,
                        }
                }
        }
+
        return TRUE;
 }