Index: a2play.c =================================================================== RCS file: /cvsroot/bluetooth-alsa/btsco/a2play.c,v retrieving revision 1.10 diff -u -r1.10 a2play.c --- a2play.c 19 Nov 2004 08:50:54 -0000 1.10 +++ a2play.c 19 Nov 2004 17:32:36 -0000 @@ -285,7 +285,7 @@ return psm; } -int do_connect(char *svr, int psm, int linger, int reliable) +int do_connect(char *svr, int psm, int linger, int reliable, uint16_t *mtu) { struct sockaddr_l2 rem_addr, loc_addr; struct l2cap_options opts; @@ -359,6 +359,9 @@ fprintf(stderr, "Connected [imtu %d, omtu %d, flush_to %d]\n", opts.imtu, opts.omtu, opts.flush_to); + if (mtu) + *mtu = opts.omtu; + return s; } @@ -482,6 +485,7 @@ bdaddr_t local; bdaddr_t bdaddr; int psm_cmd, psm_stream; + uint16_t mtu, seq_num; char *addrstr; char *filename; @@ -538,7 +542,7 @@ sigaction(SIGCHLD, &sa, NULL); sigaction(SIGPIPE, &sa, NULL); - s = do_connect(addrstr, psm_cmd, 0, 0); + s = do_connect(addrstr, psm_cmd, 0, 0, NULL); if(s < 0) { fprintf(stderr, "cannot open psm_cmd = %d\n", psm_cmd); exit(-1); @@ -572,7 +576,8 @@ // open the stream l2cap - streamfd = do_connect(addrstr, psm_stream, 0, 0); + mtu = 48; + streamfd = do_connect(addrstr, psm_stream, 0, 0, &mtu); if(streamfd < 0) { fprintf(stderr, "cannot open psm_stream = %d\n", psm_stream); exit(-1); @@ -607,16 +612,38 @@ char buf[BUFS]; + if (mtu > BUFS) + mtu = BUFS; + // TODO remove - terminate = 1; + terminate = 0; + + seq_num = 1; + memset(buf, 0, 12); + buf[0] = 0x80; + buf[2] = seq_num >> 8; + buf[3] = seq_num & 0xff; + buf[12] = 0x0ff; + buf[13] = 0x0ff; + memcpy(buf + 14, &sbc_info, sizeof(sbc_info)); + size = read(fd, buf + 14 + sizeof(sbc_info), mtu - sizeof(sbc_info) - 14); + write(streamfd, buf, size + 14 + sizeof(sbc_info)); + seq_num++; while(!terminate) { - size = read(fd, &buf, BUFS); + memset(buf, 0, 12); + buf[0] = 0x80; + buf[2] = seq_num >> 8; + buf[3] = seq_num & 0xff; + buf[12] = 0xff; + buf[13] = 0xff; + size = read(fd, buf + 14, mtu - 14); + seq_num++; if(size <= 0) { terminate = 1; } else { // framing, fragmenting, a2dp headers: avdtp p.45 and a2dp spec p.23 - write(streamfd, buf, size); + write(streamfd, buf, size + 14); } }