0
サービスレベル接続を完了した後、電話のオーディオゲートウェイとの接続を設定し、以下のようにオーディオデータを受信しているハンズフリーモジュールを開発中です...ハンズフリーデバイスがスコープソケットからオーディオを受信できません
ここで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);
}
は、私はLinuxのPC上でそれを実行した場合の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);
}
}
このコードは正常に動作しているが、私はアームボード上で実行したときのrecvシステムコールのリターンが連続ループでEAGAINをerrnoをして出てくることはありません。 PCでは、recvシステムコールはバイト数を正しく返します。この問題の原因は何でしょうか?
こんにちは郭明、返信いただきありがとうございます。あなたの提案によると、私はオーディオ用のPCMインターフェイスをチェックしましたが、オーディオデータを取得できませんでした。問題はBluetoothアダプタで発生していました。私はブロードコムのBluetoothアダプタを使用していました。今私はCSRのBluetoothアダプタを使用して、オーディオデータを正しく取得しています。 –
大丈夫、幸運。 CSRがBCMより優れていると思われます。そうではありません。 :-) –