Module Name:    src
Committed By:   nat
Date:           Sun Mar  7 13:09:43 UTC 2021

Modified Files:
        src/usr.sbin/bta2dpd/bta2dpd: bta2dpd.8 bta2dpd.c

Log Message:
Intoduce "-n" switch.

Running btat2dpd with "-n" especially for use with pad(4) will stop bta2dpd
from exiting upon a read error from pad(4) devices.

This is to compenstate for the behaviour in NetBSD current that pad(4) will
no longer output 0's when its corresponding audio(4) device is not active.

I believe that this new pad(4) behaviour is not present in -9 and -8.

While here I've improved its function as a daemon and it should reconnect to
bluetooth speakers when they are disconnected/reconnected.

Reported and tested by reinoud@ and maya@


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/usr.sbin/bta2dpd/bta2dpd/bta2dpd.8
cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/bta2dpd/bta2dpd/bta2dpd.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/bta2dpd/bta2dpd/bta2dpd.8
diff -u src/usr.sbin/bta2dpd/bta2dpd/bta2dpd.8:1.4 src/usr.sbin/bta2dpd/bta2dpd/bta2dpd.8:1.5
--- src/usr.sbin/bta2dpd/bta2dpd/bta2dpd.8:1.4	Sat Jul 27 20:10:29 2019
+++ src/usr.sbin/bta2dpd/bta2dpd/bta2dpd.8	Sun Mar  7 13:09:43 2021
@@ -1,4 +1,4 @@
-.\"	$NetBSD: bta2dpd.8,v 1.4 2019/07/27 20:10:29 nakayama Exp $
+.\"	$NetBSD: bta2dpd.8,v 1.5 2021/03/07 13:09:43 nat Exp $
 .\"
 .\" Copyright (c) 2015 - 2016  Nathanial Sloss <nathanialsl...@yahoo.com.au>
 .\" All rights reserved.
@@ -37,7 +37,7 @@
 .Nd Bluetooth Advanced Audio Distribution Profile daemon
 .Sh SYNOPSIS
 .Nm
-.Op Fl \&Dv
+.Op Fl \&Dnv
 .Op Fl A Ar bitpool_allocation
 .Op Fl B Ar bitpool
 .Op Fl b Ar blocks
@@ -107,6 +107,10 @@ with only the
 option and the maximum bitpool for your device will be printed to stdout.
 .It Fl D
 Run in the background.
+.It Fl n
+Do not close conection on end of file (EOF).
+Useful for
+.Xr pad 4 .
 .It Fl d Ar device
 Local device address.
 May be given as BDADDR or device name.

Index: src/usr.sbin/bta2dpd/bta2dpd/bta2dpd.c
diff -u src/usr.sbin/bta2dpd/bta2dpd/bta2dpd.c:1.7 src/usr.sbin/bta2dpd/bta2dpd/bta2dpd.c:1.8
--- src/usr.sbin/bta2dpd/bta2dpd/bta2dpd.c:1.7	Sun May 31 06:17:23 2020
+++ src/usr.sbin/bta2dpd/bta2dpd/bta2dpd.c	Sun Mar  7 13:09:43 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: bta2dpd.c,v 1.7 2020/05/31 06:17:23 nat Exp $ */
+/* $NetBSD: bta2dpd.c,v 1.8 2021/03/07 13:09:43 nat Exp $ */
 
 /*-
  * Copyright (c) 2015 - 2016 Nathanial Sloss <nathanialsl...@yahoo.com.au>
@@ -220,12 +220,14 @@ static struct event ctl_ev;			/* avdtp c
 struct l2cap_info	info;
 static bool		runasDaemon;
 static bool		asSpeaker;
+static bool		dontStop;
 static bool		initDiscover;	/* initiate avdtp discover */
 static bool 		verbose;	/* copy to stdout */
 static bool 		test_mode;	/* copy to stdout */
 static uint8_t		channel_mode = MODE_STEREO;
 static uint8_t		alloc_method = ALLOC_LOUDNESS;
 static uint8_t		frequency = FREQ_44_1K;
+static int		freqnum = 44100;
 static uint8_t		freqs[4];
 static uint8_t		blocks_config[4];
 static uint8_t		channel_config[4];
@@ -252,6 +254,7 @@ int audfile;
 static void do_interrupt(int, short, void *);
 static void do_recv(int, short, void *);
 static void do_ctlreq(int, short, void *);
+static void bt_exit(int fd);
 
 #define log_err(st, fmt, args...)	\
 	do { syslog(LOG_ERR, fmt, ##args); exit(st); } while (0)
@@ -262,12 +265,13 @@ static void do_ctlreq(int, short, void *
 int
 main(int ac, char *av[])
 {
-	int enc, i, n, m, l, j, k, o, ch, freqnum, blocksnum;
+	int enc, i, n, m, l, j, k, o, ch, blocksnum;
 	u_int tmpbitpool;
 	bdaddr_copy(&info.laddr, BDADDR_ANY);
 
 	sc = hc = -1;
 	verbose = asSpeaker = test_mode = initDiscover = runasDaemon = false;
+	dontStop = false;
 	n = m = l = i = j = o = 0;
 	freqs[0] = frequency;
 	channel_config[0] = channel_mode;
@@ -276,7 +280,8 @@ main(int ac, char *av[])
 	alloc_config[0] = alloc_method;
 	channel_config[0] = channel_mode;
 
-	while ((ch = getopt(ac, av, "A:a:B:b:Dd:e:f:IKM:m:p:r:tV:v")) != EOF) {
+	while ((ch = getopt(ac, av, "A:a:B:b:Dd:e:f:IKnM:m:p:r:tV:v")) !=
+	    EOF) {
 		switch (ch) {
 		case 'A':
 			for (k = 0; k < (int)strlen(optarg); k++) {
@@ -405,6 +410,9 @@ main(int ac, char *av[])
 				errx(EXIT_FAILURE, "%s: unknown mode", optarg);
 
 			break;
+		case 'n':
+			dontStop = true;
+			break;
 		case 'p':
 			l2cap_psm = (uint16_t)atoi(optarg);
 			break;
@@ -556,7 +564,7 @@ again:
 		audfile = -1;
 	}
 
-	if (asSpeaker)
+	if (runasDaemon)
 		goto again;
 
 	return EXIT_SUCCESS;
@@ -566,9 +574,9 @@ static void
 usage(void)
 {
 	fprintf(stderr,
-	    "usage:\t%s [-v] [-D] [-d device] [-m mode] [-r rate] [-M mtu]\n"
-	    "\t\t[-V volume] [-f mode] [-b blocks] [-e bands] [-A alloc]\n"
-	    "\t\t[-B bitpool] -a address files...\n"
+	    "usage:\t%s [-v] [-D] [-n] [-d device] [-m mode] [-r rate]\n"
+	    "\t\t[-M mtu] [-V volume] [-f mode] [-b blocks] [-e bands]\n"
+	    "\t\t[-A alloc] [-B bitpool] -a address files...\n"
 	    "\t%s [-v] [-D] [-d device] [-m mode] [-p psm] [-B bitpool]\n"
 	    "\t\t[-a address] [-M mtu] [-r rate] [-I] -K file\n"
 	    "\t%s -t [-v] [-K] [-r rate] [-M mtu] [-V volume] [-f mode]\n"
@@ -626,6 +634,17 @@ usage(void)
 }
 
 static void
+bt_exit(int fd)
+{
+	if (!runasDaemon) {
+			close(fd);
+			fd = -1;
+			exit(1);
+	}
+	/* Not reached */
+}
+
+static void
 do_ctlreq(int fd, short ev, void *arg)
 {
 	bool isCommand;
@@ -825,9 +844,7 @@ do_recv(int fd, short ev, void *arg)
 
 	if (len < 0) {
 		event_del(&recv_ev);
-		close(fd);
-		fd = -1;
-		exit(1);
+		bt_exit(fd);
 	}
 }
 
@@ -844,12 +861,13 @@ do_interrupt(int fd, short ev, void *arg
 	len = stream(fd, sc, channel_mode, frequency, bands, blocks,
 	    alloc_method, bitpool, mtu, volume);
 
+
 next_file:
-	if (len == -1 && currentFileInd >= numfiles -1) {
+	if (dontStop && len == -1)
+		usleep(1);
+	else if (len == -1 && currentFileInd >= numfiles -1) {
 		event_del(&interrupt_ev);
-		close(fd);
-		fd = -1;
-		exit(1);
+		bt_exit(fd);
 	} else if (len == -1) {
 		close(fd);
 		currentFileInd++;

Reply via email to