Re: [Bluez-devel] AVDTP socket?

Marcel Holtmann
2004-11-19T20:45:43Z

[-- Attachment #1: Type: text/plain, Size: 566 bytes --]

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

[-- Attachment #2: rcplay.c --]
[-- Type: text/x-csrc, Size: 2535 bytes --]

/*
*
* 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;
}