#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"
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;
}
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;
}
}
}
+
return TRUE;
}