2016-07-28 34 views
0

ich einen Freisprech-Modul entwickle, bei dem nach Service-Level-Verbindung abgeschlossen ich sco Verbindung mit Telefon-Audio-Gateway am Einrichten und wie unten Audiodaten empfangen ...Freisprecheinrichtung Gerät nicht in der Lage Audiodaten von sco-Buchse erhält

Hier
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); 
} 

ist der read_data Faden

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); 
     } 
    } 

Dieser Code funktioniert gut, wenn ich es auf linux-PC laufen, aber wenn ich auf Armbrett laufen die recv Systemaufruf kehrt errno EAGAIN in Endlosschleife und nie herauskommt . Auf dem PC gibt der recv-Systemaufruf die Anzahl der Bytes korrekt zurück. Was kann möglicherweise zu diesem Problem führen?

Antwort

0

Ich denke, der Grund sollte sein, wenn Ihr Code auf dem PC läuft, können Sie die Audiodaten von HCI-Link, d. H. Die HF-SCO über HCI und dann übertragen Sie es auf PC-Treiber. Wenn Sie jedoch zum Board wechseln, frage ich mich, ob die Hardware-Bluetooth-Schnittstelle des Boards UART sagen kann, ob es einen hohen Durchsatz für die Übertragung der SCO-Daten hat und vor allem, ob die SCO-Daten zur PCM-Schnittstelle geroutet wurden, also nicht gesendet werden zu HCI.

+0

Hallo Guo Xingmin, Danke für die Antwort. Laut Ihrem Vorschlag habe ich die PCM-Schnittstelle für Audio überprüft, aber keine Audiodaten. Das Problem war mit dem Bluetooth-Adapter. Ich benutzte einen Broadcom Bluetooth Adapter. Jetzt benutze ich CSR Bluetooth Adapter und bekomme Audiodaten richtig. –

+0

alles klar, viel Glück. scheint CSR wäre besser als BCM, nicht wahr? :-) –