Re: [Bluez-devel] AVDTP socket?

Brad Midgley
2004-11-19T21:51:20Z

Marcel,

I added rcplay.c to cvs and made you a developer on bluetooth-alsa so
you can tweak things if you see fit.

The bluetake sometimes works and sometimes doesn't when using a2play.
The same stream will work a couple of times and then it produces loud
white noise. There is probably something still not quite right.

I disabled this section in a2dp.c

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++;

but it didn't help or hurt. I couldn't see why sbc_info was being
written to the stream since I thought it was just a file header. Does
your headset work with a2play as it is in cvs now?

Brad

Marcel Holtmann wrote:
> Hi Brad,
>
>
>>actually like with the attached patch. Most of the example *.sbc files
>>are working. Some of them are not working and this is maybe because the
>>frame header information don't matches the SBC configuration. Or maybe
>>hcidump is decoding this wrong.
>
>
> and I figured out what the extra RFCOMM channel 1 on my Aiptek headphone
> does. You can simply stream the SBC files over it. The attached program
> will do this for you, but actually it only works on streams with two
> channels. I don't know what to change to support all test SBC files.
>
> Regards
>
> Marcel
>
>
>
> ------------------------------------------------------------------------
>
> /*
> *
> * Stream SBC files over RFCOMM
> *
> * Copyright (C) 2004 Marcel Holtmann <marcel@holtmann.org>
> *
> *
> * This program is free software; you can redistribute it and/or modify
> * it under the terms of the GNU General Public License version 2 as
> * published by the Free Software Foundation;
> *
> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
> * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
> * CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
> * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> *
> * ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
> * COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
> * SOFTWARE IS DISCLAIMED.
> *
> */
>
> #include <stdio.h>
> #include <errno.h>
> #include <fcntl.h>
> #include <sys/socket.h>
>
> #include <bluetooth/bluetooth.h>
> #include <bluetooth/rfcomm.h>
>
> static int rfcomm_connect(bdaddr_t *src, bdaddr_t *dst, uint8_t channel)
> {
> struct sockaddr_rc addr;
> int sk;
>
> sk = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
> if (sk < 0)
> return -1;
>
> memset(&addr, 0, sizeof(addr));
> addr.rc_family = AF_BLUETOOTH;
> bacpy(&addr.rc_bdaddr, src);
> if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
> close(sk);
> return -1;
> }
>
> memset(&addr, 0, sizeof(addr));
> addr.rc_family = AF_BLUETOOTH;
> bacpy(&addr.rc_bdaddr, dst);
> addr.rc_channel = channel;
> if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
> close(sk);
> return -1;
> }
>
> return sk;
> }
>
> static int stream_sbc(fd, sk)
> {
> unsigned char buf[330];
> int err, len;
>
> while (1) {
> len = read(fd, buf, sizeof(buf));
> if (len <= 0)
> break;
>
> err = write(sk, buf, len);
> if (err < 0)
> break;
> }
>
> return 0;
> }
>
> int main(int argc, char *argv[])
> {
> bdaddr_t bdaddr;
> int fd, sk;
>
> if (argc < 3) {
> fprintf(stderr, "Usage: rcplay <bdaddr> <filename>\n");
> exit(1);
> }
>
> str2ba(argv[1], &bdaddr);
>
> fd = open(argv[2], O_RDONLY);
> if (fd < 0) {
> perror("Can't open file");
> exit(1);
> }
>
> sk = rfcomm_connect(BDADDR_ANY, &bdaddr, 1);
> if (sk < 0) {
> perror("Can't open connection");
> close(fd);
> exit(1);
> }
>
> stream_sbc(fd, sk);
>
> close(sk);
> close(fd);
>
> return 0;
> }