gpt4 book ai didi

audio - 免提设备无法从 sco 套接字接收任何音频

转载 作者:行者123 更新时间:2023-12-03 01:52:14 24 4
gpt4 key购买 nike

我正在开发一个免提模块,在完成服务级别连接后,我正在与手机的音频网关建立 sco 连接并接收如下音频数据......

void audio_connection_setup(char *bluetooth_addr)
{
struct sockaddr_sco addr;
pthread_t tid;
int scoSock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO);
memset(&addr, 0, sizeof(addr));
addr.sco_family = AF_BLUETOOTH;
addr.sco_bdaddr = *BDADDR_ANY;

if (bind(scoSock, (struct sockaddr *) &addr, sizeof(addr)) < 0)
{
printf( "Can't bind socket: %s (%d)",strerror(errno), errno);
}
hci_read_voice_setting(scoSock, &voice, 5000);

hci_write_voice_setting(scoSock, BT_VOICE_CVSD_16BIT, 5000);

str2ba(bluetooth_addr, &addr.sco_bdaddr);

if (connect(scoSock, (struct sockaddr *) &addr, sizeof(addr)) < 0)
{
printf( "\nCan't connect: %s (%d)", strerror(errno), errno);
}
pthread_create(&tid, NULL, &read_data, &scoSock);
}

这是 read_data 线程
gBuff[16284];
void* read_data(int *scoSock)
{
int fd = *scoSock;
int len = -1;
char buff[48];
int numBytesRead;

while (1)
{
numBytesRead = 0;
while(numBytesRead < 16284)
{
memset(buff, 0x0, 48);
len = recv(fd, buff, 48, MSG_DONTWAIT);
usleep(10);
memcpy(gBuff + numBytesRead, buff + 2, len - 2);
numBytesRead = numBytesRead + len - 2;
}
printf("Number of bytes received = %d errno = %d\n", numBytesRead, errno);
memset(gBuff, 0x0, numBytesRead);
}
}

如果我在 linux PC 上运行此代码,它可以正常工作,但是当我在 arm 板上运行时,recv 系统调用在连续循环中返回 errno EAGAIN 并且永远不会出现。在 PC 上,recv 系统调用正确返回字节数。这个问题的可能原因是什么?

最佳答案

我认为原因应该是当您的代码在 PC 上运行时,您可能会从 HCI 链接获取音频数据,即 HCI 上的 HF sco,然后将其传输到 PC 驱动程序。但是当你切换到板子时,我想知道板子的硬件蓝牙接口(interface)是否可以说是UART,是否有高吞吐量来传输sco数据,最重要的是,你需要检查sco数据是否路由到PCM接口(interface),即不发送到 HCI。

关于audio - 免提设备无法从 sco 套接字接收任何音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38645333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com