public inbox for linux-bluetooth@vger.kernel.org
 help / color / mirror / Atom feed
* [Bluez-devel] Small patch to a2dpd
@ 2006-08-23 16:55 Frédéric DALLEAU
  2006-08-23 17:53 ` Brad Midgley
  2006-08-30 14:45 ` Brad Midgley
  0 siblings, 2 replies; 27+ messages in thread
From: Frédéric DALLEAU @ 2006-08-23 16:55 UTC (permalink / raw)
  To: BlueZ development

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

Hi Brad,

Latest patch : Default daemon logfile is /dev/null. Try to open an l2cap 
socket with short timeout before doing  sdp_connect that can last very 
long. Also a script called a2dpair that wrap hcitool and passkey-agent 
as an effort to simplify pairing and a2dpd setup :D
What about Matthew's patches? I plan to move to getopt and cleanup 
indent and traces so having them integrated first would be better as 
there are new options.

Frédéric


[-- Attachment #2: a2dpd.patch --]
[-- Type: text/x-patch, Size: 20722 bytes --]

? .deps
? .libs
? Makefile
? Makefile.in
? a2play
? a2recv
? aclocal.m4
? autom4te.cache
? avrecv
? avsnd
? btsco
? btsco2
? config.guess
? config.h
? config.h.in
? config.log
? config.status
? config.sub
? configure
? depcomp
? install-sh
? libtool
? missing
? stamp-h1
? alsa-plugins/.deps
? alsa-plugins/.libs
? alsa-plugins/Makefile
? alsa-plugins/Makefile.in
? alsa-plugins/a2dp_ipc.lo
? alsa-plugins/a2dp_timer.lo
? alsa-plugins/a2dpd
? alsa-plugins/ctl_a2dpd.lo
? alsa-plugins/ctl_sco.lo
? alsa-plugins/libasound_module_ctl_a2dpd.la
? alsa-plugins/libasound_module_ctl_sco.la
? alsa-plugins/libasound_module_pcm_a2dp.la
? alsa-plugins/libasound_module_pcm_a2dpd.la
? alsa-plugins/libasound_module_pcm_sco.la
? alsa-plugins/pcm_a2dp.lo
? alsa-plugins/pcm_a2dpd.lo
? alsa-plugins/pcm_sco.lo
? avdtp/.deps
? avdtp/.libs
? avdtp/Makefile
? avdtp/Makefile.in
? avdtp/avtest
? sbc/.deps
? sbc/.libs
? sbc/Makefile
? sbc/Makefile.in
? sbc/rcplay
? sbc/sbcdec
? sbc/sbcenc
? sbc/sbcinfo
Index: alsa-plugins/a2dpair
===================================================================
RCS file: alsa-plugins/a2dpair
diff -N alsa-plugins/a2dpair
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ alsa-plugins/a2dpair	23 Aug 2006 16:43:12 -0000
@@ -0,0 +1,129 @@
+#!/bin/sh
+
+#
+# Discovery
+#
+echo "Discovery in progress..."
+I=0
+SCANFILE=/tmp/hci_scan
+declare -a ARRAYADDR
+declare -a ARRAYNAME
+
+# We need this file because else there is a problem with arrays in shell
+# The while loop is run in a subshell
+hcitool scan > $SCANFILE
+
+while read BTADDR BTDESC ; do
+	if expr match "$BTADDR" "..:..:..:..:..:.." > /dev/null ; then
+		# Truc
+		echo "$I) [$BTADDR] $BTDESC" 
+		I=`expr $I + 1`
+		ARRAYADDR[$I]="$BTADDR"
+		ARRAYNAME[$I]="$BTDESC"
+	fi
+done < $SCANFILE
+rm -f $SCANFILE
+
+if [ $I -le 0 ] ; then
+	echo "Found $I devices"
+	exit -1
+fi
+
+#
+# Device selection
+#
+SELECTION=
+I=`expr $I - 1`
+while [ -z $SELECTION ] || [ $SELECTION -gt $I ] ; do
+	echo "Choose device (0-$I)"
+	read SELECTION
+done
+# sh uses 1 based arrays
+SELECTION=`expr $SELECTION + 1`
+ADDRESS=${ARRAYADDR[$SELECTION]}
+NAME=${ARRAYNAME[$SELECTION]}
+#
+# Pairing
+#
+echo "Pair device (y/N)?"
+read CANPAIR
+
+if [ "$CANPAIR" = "y" ] ; then
+	
+	# Device passkey
+	SELECTION=
+	while [ -z $SELECTION ] ; do
+		echo "Enter passkey for $NAME"
+		read SELECTION
+	done
+	PASSKEY=$SELECTION
+	
+	# Prefetch password
+	sudo echo "Pairing in progress..."
+	
+	# passkey agent
+	if sudo passkey-agent --default $PASSKEY & PASSPID=$! ; then
+	
+		#echo "Registered passkey-agent pid=$PASSPID"
+	
+		# pairing
+		ANYTEXTISFAILURE=`sudo hcitool cc $ADDRESS 2>&1`
+	
+		if [ -z "$ANYTEXTISFAILURE" ] ; then
+			echo "Pairing successfull"
+			RESULT=0
+		else
+			echo "$ANYTEXTISFAILURE"
+			echo "Pairing failed"
+		fi
+	
+		#echo "Killing pid=$PASSPID"
+		# Kill bg process
+		sudo kill $PASSPID
+	fi
+fi
+
+#
+# A2DP Setting
+#
+echo "Select device for a2dp (y/N)?"
+read A2PARAM
+
+if [ "$A2PARAM" = "y" ] ; then
+	echo "Writing ~/.a2dprc"
+	if [ -f ~/.a2dprc ] ; then
+		mv -f ~/.a2dprc ~/.a2dprc~
+		cat ~/.a2dprc~ | while read LINE ; do
+			# Address line
+			if expr "$LINE" : "address=.*" > /dev/null; then
+				echo "address=$ADDRESS" >> ~/.a2dprc
+			else
+				echo "$LINE" >> ~/.a2dprc
+			fi
+		done
+	else
+		echo "[A2DPD]" > ~/.a2dprc
+		echo "address=$ADDRESS" >> ~/.a2dprc
+	fi
+fi
+
+
+#
+# A2DP Daemon
+#
+echo "Start a2dp daemon (y/N)?"
+read A2DAEMON
+if [ "$A2DAEMON" = "y" ] ; then
+	while killall a2dpd 2> /dev/null ; do
+		echo -n .
+		sleep 1
+	done
+	a2dpd -d +v
+fi
+
+#
+# Ending
+#
+exit 0
+
+############
Index: alsa-plugins/a2dpd.c
===================================================================
RCS file: /cvsroot/bluetooth-alsa/btsco/alsa-plugins/a2dpd.c,v
retrieving revision 1.4
diff -u -r1.4 a2dpd.c
--- alsa-plugins/a2dpd.c	17 Aug 2006 14:06:27 -0000	1.4
+++ alsa-plugins/a2dpd.c	23 Aug 2006 16:43:13 -0000
@@ -95,10 +95,10 @@
                 chdir("/");
         }
 
-        // Redirect output to file in silent mode, verbose will print output to stdin/out/err
+        // Redirect output to file (default /dev/null) in silent mode, verbose will print output to stdin/out/err
         if(!bVerbose)
         {
-        int fd;
+                int fd;
                 if ((fd = open(output_file_name, O_CREAT|O_APPEND|O_RDWR, 0)) != -1)
                 {
                         fchmod(fd, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
@@ -764,6 +764,7 @@
                                         setup_socket(new_fd);
                                         int iReceived = 0;
                                         int play = 0;
+                                        int count = 0;
                                         do
                                         {
                                                 iReceived = a2dp_handle_avdtp_message(NULL, new_fd, NULL, NULL, 0);
@@ -771,16 +772,18 @@
                                                 {
                                                         printf("avdtp: socket %d: Received frame, start %s\n", new_fd, g_sCmdNew);
                                                         play=1;
+                                                        count=0;
                                                         break;
                                                 }
-                                                else
+                                                else if(iReceived<0)
                                                 {
-                                                        if(iReceived!=EAGAIN)
+                                                        if(errno!=EAGAIN)
                                                                 printf("avdtp: socket %d: Received failed result=%d (errno=%d:%s)\n", new_fd, iReceived, errno, strerror(errno));
                                                 }
+                                                count++;
                                         }
                                         // AVDTP do not need to have a device connected, since it can establish device connection
-                                        while(!bSigINTReceived && (iReceived>=0 || errno==EAGAIN));
+                                        while(!bSigINTReceived && (iReceived>=0 || errno==EAGAIN) && count<10);
                                         printf("avdtp: socket %d: timed out\n", new_fd);
                                         close_socket(new_fd);
 
@@ -852,7 +855,6 @@
                                 }
                                 else
                                 {
-
                                         if(errno!=EAGAIN)
                                         {
                                                 printf("a2dp_wait_connection failed (AVRCP socket) : %d (errno=%d:%s)\n", new_fd, errno, strerror(errno));
@@ -970,7 +972,7 @@
         read_config_string(g_srcfilename, "a2dpd", "cmdprev",  g_sCmdPrev,  sizeof(g_sCmdPrev),  "");
         read_config_string(g_srcfilename, "a2dpd", "cmdnext",  g_sCmdNext,  sizeof(g_sCmdNext),  "");
         read_config_string(g_srcfilename, "a2dpd", "cmdnew",   g_sCmdNew,   sizeof(g_sCmdNew),  "");
-        read_config_string(g_srcfilename, "a2dpd", "logfile",  g_sOutputFilename,  sizeof(g_sOutputFilename),  "/tmp/a2dpd.log");
+        read_config_string(g_srcfilename, "a2dpd", "logfile",  g_sOutputFilename,  sizeof(g_sOutputFilename),  "/dev/null");
 
         // Parse command line parameters
         for(i=1; i<argc && argv[i]!=NULL; i++)
Index: alsa-plugins/a2dplib.c
===================================================================
RCS file: /cvsroot/bluetooth-alsa/btsco/alsa-plugins/a2dplib.c,v
retrieving revision 1.4
diff -u -r1.4 a2dplib.c
--- alsa-plugins/a2dplib.c	17 Aug 2006 14:06:27 -0000	1.4
+++ alsa-plugins/a2dplib.c	23 Aug 2006 16:43:13 -0000
@@ -54,6 +54,7 @@
 #include "sbc.h"
 #include "../a2dp.h"
 
+#define NBSDPRETRIESMAX 0
 #define NONSPECAUDIO 1
 #define BUFS 2048
 // In fact sbc blocks are 76 bytes long, so a group of them is either 608 or 684 bytes
@@ -64,6 +65,7 @@
 #define DBG(fmt, arg...) { if(errno!=0) printf("DEBUG: %s: (errno=%d:%s)" fmt "\n" , __FUNCTION__ , errno, strerror(errno), ## arg);\
         else printf("DEBUG: %s: " fmt "\n" , __FUNCTION__ , ## arg); errno=0;}
 
+
 //#define DBG(fmt, arg...)  printf("DEBUG: %s: " fmt "\n" , __FUNCTION__ , ## arg)
 //#define DBG(D...)
 
@@ -194,7 +196,6 @@
         struct set_config_resp s_resp;
         struct stream_cmd open_stream;
         struct open_stream_rsp open_resp;
-        DBG("Begin SEID = %d", seid);
 
         memset(&put_req, 0, sizeof(put_req));
         init_request(&put_req.header, AVDTP_GET_CAPABILITIES);
@@ -205,10 +206,7 @@
                 DBG("Couldn't request capabilities for SEID = %d", seid);
                 return (-1);
         }
-        else
-        {
-                DBG("Requested Capabilities for SEID = %d",seid);
-        }
+
         if (read(s, &cap_resp, sizeof(cap_resp)) < sizeof(cap_resp) ||
                         cap_resp.header.message_type == MESSAGE_TYPE_REJECT ||
                         cap_resp.media_type != AUDIO_MEDIA_TYPE ||
@@ -316,10 +314,8 @@
                 return (-1);
         }
 
-        DBG("Sent set configurations command");
-        
         size = read(s, &s_resp, sizeof(s_resp));
-        DBG("Got a Set Configurations (%d bytes) Response (msgtype=%d,pkttype=%d,lbl=%d,sig=%d,rfa=%d)", 
+        DBG("Got Set Configurations Response (%d bytes:msgtype=%d,pkttype=%d,lbl=%d,sig=%d,rfa=%d)", 
                 size,
                 s_resp.header.message_type,
                 s_resp.header.packet_type,
@@ -336,20 +332,103 @@
                 return (-1);
         }
 
-        DBG("Sent open stream command");
-
         if (read(s, &open_resp, sizeof(open_resp)) < sizeof(open_resp) - 1 ||
                         open_resp.header.message_type == MESSAGE_TYPE_REJECT) {
                 DBG("Didn't receive open response confirm for SEID = %d", seid);
                 return (-1);
         }
 
-        DBG("Got open stream confirm");
-
         *psm = 25;
         return 0;
 }
 
+int test_sdp(dst)
+{
+	int result = 0;
+	
+	return result;
+}
+
+// Connecting on PSM 25
+int do_connect(bdaddr_t *src, bdaddr_t *dst, unsigned short psm, uint16_t *mtu)
+{
+        struct sockaddr_l2 addr;
+        struct l2cap_options opts;
+        int sk;
+        unsigned int opt;
+        int tries;
+
+        sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
+        if (sk < 0) {
+                DBG( "Can't create socket. %s(%d)",
+                        strerror(errno), errno);
+                return -1;
+        }
+
+        // Set connection timeout
+        struct timeval t = { 3, 0 };
+        setsockopt( sk, SOL_SOCKET, SO_SNDTIMEO, &t, sizeof(t));
+        setsockopt( sk, SOL_SOCKET, SO_RCVTIMEO, &t, sizeof(t));
+
+        memset(&addr, 0, sizeof(addr));
+        addr.l2_family = AF_BLUETOOTH;
+        bacpy(&addr.l2_bdaddr, src);
+        if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+                DBG( "Can't bind socket. %s(%d)",
+                                                strerror(errno), errno);
+                return -1;
+        }
+
+        /* Get default options */
+        opt = sizeof(opts);
+        if (getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, &opt) < 0) {
+                DBG( "Can't get default L2CAP options. %s(%d)",
+                                                strerror(errno), errno);
+                return -1;
+        }
+
+        /* Set new options */
+        if(mtu && *mtu) {
+                opts.omtu = *mtu;
+                //opts.imtu = *mtu;
+        }
+        if (setsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, opt) < 0) {
+                DBG( "Can't set L2CAP options. %s(%d)",
+                                                strerror(errno), errno);
+                return -1;
+        }
+
+        memset(&addr, 0, sizeof(addr));
+        addr.l2_family = AF_BLUETOOTH;
+        bacpy(&addr.l2_bdaddr, dst);
+        addr.l2_psm = htobs(psm);
+
+        tries = 0;
+        while (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+                DBG("Can't connect to %s on psm %d. %s(%d)",
+                                batostr(&addr.l2_bdaddr), psm, strerror(errno), errno);
+                if(++tries > NBSDPRETRIESMAX) {
+                        close(sk);
+                        return -1;
+                }
+                sleep(1);
+        }
+        opt = sizeof(opts);
+        if (getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, &opt) < 0) {
+                DBG( "Can't get L2CAP options. %s(%d)",
+                                                strerror(errno), errno);
+                close(sk);
+                return -1;
+        }
+
+        //DBG( "Connected psm=%d sk=%d [imtu %d, omtu %d, flush_to %d]", psm, sk, opts.imtu, opts.omtu, opts.flush_to);
+
+        if (mtu)
+                *mtu = opts.omtu;
+
+        return sk;
+}
+
 // Detect whether A2DP Sink is present at the destination or not
 int detect_a2dp(bdaddr_t *src, bdaddr_t *dst, unsigned short *psm, unsigned long *flags)
 {
@@ -361,17 +440,28 @@
         int err;
         int tries;
 
-        DBG("Begin");
+	// Try to connect an L2CAP socket to the sdp psm with short timeout for user interaction
+	int tmpsk = do_connect(src, dst, 1, NULL);
+	if(tmpsk>0)
+	{
+		close(tmpsk);
+	}
+	else
+	{
+                DBG( "Warning: failed to connect to SDP server");
+		return -1;
+	}
+
         tries = 0;
         while(!(sess = sdp_connect(src, dst, SDP_RETRY_IF_BUSY))) {
                 DBG("retrying sdp connect: %s", strerror(errno));
-                sleep(1);
-                if(++tries > 2) {
+                if(++tries > NBSDPRETRIESMAX) {
                         break;
-                }
+			}
+                sleep(1);
         }
         if (!sess) {
-                DBG( "Warning: failed to connect to SDP server: %s", strerror(errno));
+                DBG( "Warning: failed to connect to SDP server");
                 if(psm) *psm = 25;
                 if(flags) *flags = 0;
                 return 0;
@@ -448,84 +538,6 @@
         sdp_close(sess);
         return 0;
 }
-// Connecting on PSM 25
-int do_connect(bdaddr_t *src, bdaddr_t *dst, unsigned short psm, uint16_t *mtu)
-{
-        struct sockaddr_l2 addr;
-        struct l2cap_options opts;
-        int sk;
-        unsigned int opt;
-        int tries;
-        
-        DBG("Begin");
-        sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
-        if (sk < 0) {
-                DBG( "Can't create socket. %s(%d)",
-                        strerror(errno), errno);
-                return -1;
-        }
-
-        DBG( "Connecting to bluetooth");
-
-        memset(&addr, 0, sizeof(addr));
-        addr.l2_family = AF_BLUETOOTH;
-        bacpy(&addr.l2_bdaddr, src);
-        if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
-                DBG( "Can't bind socket. %s(%d)",
-                                                strerror(errno), errno);
-                return -1;
-        }
-
-        /* Get default options */
-        opt = sizeof(opts);
-        if (getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, &opt) < 0) {
-                DBG( "Can't get default L2CAP options. %s(%d)",
-                                                strerror(errno), errno);
-                return -1;
-        }
-
-        /* Set new options */
-        if(mtu && *mtu) {
-                opts.omtu = *mtu;
-                //opts.imtu = *mtu;
-        }
-        if (setsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, opt) < 0) {
-                DBG( "Can't set L2CAP options. %s(%d)",
-                                                strerror(errno), errno);
-                return -1;
-        }
-
-        memset(&addr, 0, sizeof(addr));
-        addr.l2_family = AF_BLUETOOTH;
-        bacpy(&addr.l2_bdaddr, dst);
-        addr.l2_psm = htobs(psm);
-
-        tries = 0;
-        while (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
-                DBG("Can't connect to %s on psm %d. %s(%d)",
-                                batostr(&addr.l2_bdaddr), psm, strerror(errno), errno);
-                sleep(1);
-                if(++tries > 2) {
-                        close(sk);
-                        return -1;
-                }
-        }
-        opt = sizeof(opts);
-        if (getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, &opt) < 0) {
-                DBG( "Can't get L2CAP options. %s(%d)",
-                                                strerror(errno), errno);
-                close(sk);
-                return -1;
-        }
-
-        DBG( "Connected psm=%d sk=%d [imtu %d, omtu %d, flush_to %d]", psm, sk,
-                                        opts.imtu, opts.omtu, opts.flush_to);
-
-        if (mtu)
-                *mtu = opts.omtu;
-
-        return sk;
-}
 
 int connect_stream(bdaddr_t *src, bdaddr_t *dst, int *cmdfd_return, sbc_t *sbc, int* seid_return, int* omtu)
 {
@@ -543,9 +555,6 @@
         uint16_t mtu = 0;
         int tries, res;
 
-        DBG("Begin");
-        DBG( "Using address: %s", batostr(dst));
-
         if (detect_a2dp(src, dst, &psm_cmd, &flags) < 0) {
                 DBG( "could not find A2DP services on device %s", batostr(dst));
                 return -1;
@@ -831,7 +840,11 @@
 {
         snd_pcm_a2dp_t* a2dp = (snd_pcm_a2dp_t*)param;
 
-        if(a2dp->control_sk<0) return NULL;
+        if(a2dp->control_sk<0) 
+        {
+        	DBG("Listen thread not started [control_sk=%d]", a2dp->control_sk);
+		return NULL;
+        }
 
         DBG("Listen thread running [control_sk=%d]", a2dp->control_sk);
 
@@ -895,7 +908,6 @@
         int sk = -1;
         int control_sk = -1;
         errno=0;
-        DBG("a2dp %p", a2dp);
         /*
         if(a2dp->use_rfcomm) {
                 sk = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
@@ -943,20 +955,23 @@
         a2dp->pause_writing = 0;
         a2dp->stop_writing = 0;
         
-        // Set pthread stack size to decrease unused memory usage
-        pthread_attr_t tattr;
-        size_t size = PTHREAD_STACK_MIN;
-        int ret = pthread_attr_init(&tattr);
-        ret = pthread_attr_setstacksize(&tattr, size);
-        pthread_create(&a2dp->hListenThread, &tattr, listen_thread, (void*)a2dp);
-        pthread_attr_destroy(&tattr);
-        return 0;
+        if(sk>0)
+        {
+		// Set pthread stack size to decrease unused memory usage
+		pthread_attr_t tattr;
+		size_t size = PTHREAD_STACK_MIN;
+		int ret = pthread_attr_init(&tattr);
+		ret = pthread_attr_setstacksize(&tattr, size);
+		pthread_create(&a2dp->hListenThread, &tattr, listen_thread, (void*)a2dp);
+		pthread_attr_destroy(&tattr);
+	}
+
+        return sk;
 }
 
 snd_pcm_a2dp_t *a2dp_alloc(void)
 {
         snd_pcm_a2dp_t *a2dp;
-        DBG("Begin");
         a2dp = malloc(sizeof(*a2dp));
         if (!a2dp)
                 return NULL;
@@ -976,7 +991,7 @@
 
 void a2dp_free(snd_pcm_a2dp_t *a2dp)
 {
-        DBG("Begin");
+        DBG("");
         if (a2dp->sk > 0)
                 close(a2dp->sk);
         if (a2dp->control_sk > 0)
@@ -1018,12 +1033,12 @@
         bdaddr_t src, dst;
         int err; //, pos = -1, use_rfcomm = 0;
 
-        DBG("Begin");
+        DBG("%s, %d", addr, framerate);
+
         bacpy(&src, BDADDR_ANY);
         bacpy(&dst, BDADDR_ANY);
-        DBG("bdaddr/dest is %s", addr);
         str2ba(addr, &dst);
-        
+
         a2dp = a2dp_alloc();
         if (!a2dp) {
                 DBG("Can't allocate");
@@ -1262,7 +1277,7 @@
         {
                 result=iReceived;
                 if(errno!=EAGAIN)
-                        printf("socket %d: Receive failed %d (error %d:%s)\n", sockfd, iReceived, errno, strerror(errno));
+                        printf("socket %d: Receive failed %d (errno=%d:%s)\n", sockfd, iReceived, errno, strerror(errno));
         }
 
         return result;
Index: alsa-plugins/pcm_a2dp.c
===================================================================
RCS file: /cvsroot/bluetooth-alsa/btsco/alsa-plugins/pcm_a2dp.c,v
retrieving revision 1.15
diff -u -r1.15 pcm_a2dp.c
--- alsa-plugins/pcm_a2dp.c	3 Aug 2006 18:02:37 -0000	1.15
+++ alsa-plugins/pcm_a2dp.c	23 Aug 2006 16:43:13 -0000
@@ -818,7 +818,7 @@
 	struct media_packet_header packet_header;
 	struct media_payload_header payload_header;
 	int codesize,datatoread;
-	unsigned long sleeptime;
+	unsigned long sleeptime=0;
 	int written;
 	struct timeval dt;
 	struct timeval timeofday;

[-- Attachment #3: Type: text/plain, Size: 373 bytes --]

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

[-- Attachment #4: Type: text/plain, Size: 164 bytes --]

_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel

^ permalink raw reply	[flat|nested] 27+ messages in thread
* Re: [Bluez-devel] Big patch to a2dpd
@ 2006-09-02  6:04 Li, Lea
  2006-09-02 13:02 ` Michael Frey
  0 siblings, 1 reply; 27+ messages in thread
From: Li, Lea @ 2006-09-02  6:04 UTC (permalink / raw)
  To: BlueZ development

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

Hi Michael, 

's "Big patch to a2dpd" is just the right thing you are looking for. To switch to default alsa device, one way is to change ".asoundrc", the other way is to enable "audio routing" (see enablerereadconfig & enableredirectalsa) in ".a2dprc" which can do that on the fly. :)


Thanks,
Lea
 

-----Original Message-----
From: bluez-devel-bounces@lists.sourceforge.net [mailto:bluez-devel-bounces@lists.sourceforge.net] On Behalf Of Michael Frey
Sent: 2006年9月2日 2:26
To: BlueZ development
Subject: Re: [Bluez-devel] Big patch to a2dpd

Is there a way to have a2dpd use the alsa dmixer?  And does anyone  
know how to change the default alsa device on the fly.  I know you  
can change .asoundrc but any running applications need to be  
restarted in order to pick up the change.  Is there a better way?

Michael

On Sep 1, 2006, at 8:57 AM, andy@samuri.demon.co.uk wrote:

> Hi Frédéric,
>
> Whoo some patch cant wait to give it a whirl..
>
> On the subject of your DOC nice work very concise
>
> You might like to add
> ------------------
> If you create an ~.asoundrc as follows
>
> pcm.a2dpd {
>        type a2dpd
> }
>
> Then you can directly add the headphone device (pcm.a2dpd) to any  
> app that
> supports alsa plugins correctly, Without affecting the default  
> Gnome/X/KDE
> sounds
>
> Known working Apps
>
> Xmms
> alsaplayer
> VLC (you have to manualy add it to the conf file as the gui wont allow
> adding non visible plugins (bug)).
>
> cheers Andy
> --------------------------------------
>  Hi Brad,
>>>
>>> I looked over Matthew's patches and applied them. I applied your  
>>> "small
>>> patch" which turns out to be bigger than it sounds :)
>>>
>> This one is more than bigger!
>> Reindent,
>> Alsa output redirection,
>> New on-the-fly in-play switch from bt to alsa and reverse
>> Changing bdaddr in play too.
>> More options described in sample.a2dprc
>>
>> I removed the line LIBS= from Makefile.am as suggested. This line was
>> making tons of compilation problems. As a2dpd finally links to  
>> alsa, it
>> is no longer needed.
>> Please give it a try before submitting (Matthew and RUI if you  
>> read that).
>>
>> Wrote a doc : http://fdalleau.free.fr/a2dp_doc.pdf ideas welcome!
>>
>> Frédéric
>>
>>
>
>
>
> ---------------------------------------------------------------------- 
> ---
> Using Tomcat but need to do more? Need to support web services,  
> security?
> Get stuff done quickly with pre-integrated technology to make your  
> job easier
> Download IBM WebSphere Application Server v.1.0.1 based on Apache  
> Geronimo
> http://sel.as-us.falkag.net/sel? 
> cmd=lnk&kid=120709&bid=263057&dat=121642
> _______________________________________________
> Bluez-devel mailing list
> Bluez-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/bluez-devel


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel


[-- Attachment #2: Type: text/plain, Size: 373 bytes --]

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

[-- Attachment #3: Type: text/plain, Size: 164 bytes --]

_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel

^ permalink raw reply	[flat|nested] 27+ messages in thread
* Re: [Bluez-devel] Big patch to a2dpd
@ 2006-09-02  6:21 Li, Lea
  2006-09-06  3:06 ` Brad Midgley
  0 siblings, 1 reply; 27+ messages in thread
From: Li, Lea @ 2006-09-02  6:21 UTC (permalink / raw)
  To: BlueZ development

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

It's really a great patch - which is the right patch I am looking for. :)

I've tried it on my XScale board. It is perfect but only one line to be modified to make default alsa device work smoothly. See below patch: 
The better way is to modify the code in alsa_transfer_raw(), I think, as below: 

	case -EPIPE:
		// To manage underrun, we will try to recover from error state
		if(xrun_recovery(alsa->playback_handle, result) == 0)
			result = 0;
		DBG("EPIPE(%d)", result);
		break;
	case -ESTRPIPE:
		if(xrun_recovery(alsa->playback_handle, result) == 0)
			result=0;
		DBG("ESTRPIPE(%d)", result);
		break;
	}

========patch begin========
--- a2dpd.c.old	2006-09-02 13:53:31.601040096 +0800
+++ a2dpd.c	2006-09-02 13:14:53.065511072 +0800
@@ -716,7 +716,7 @@
 								blockstart += blocksize;
 								ibytespersecond += transfer;
 								a2dp_timer_notifyframe(&TimerInfos);
-							} else {
+							} else if (! (lpDevice->bredirectalsa)){
 								printf("Error in a2dp_transfer_raw\n");
 								bError = 1;
 							}
========patch end========
 
Thanks,
Lea
 

-----Original Message-----
From: bluez-devel-bounces@lists.sourceforge.net [mailto:bluez-devel-bounces@lists.sourceforge.net] On Behalf Of Frédéric DALLEAU
Sent: 2006年9月1日 0:05
To: BlueZ development
Subject: [Bluez-devel] Big patch to a2dpd

Hi Brad,
>
> I looked over Matthew's patches and applied them. I applied your "small
> patch" which turns out to be bigger than it sounds :)
>   
This one is more than bigger!
Reindent,
Alsa output redirection,
New on-the-fly in-play switch from bt to alsa and reverse
Changing bdaddr in play too.
More options described in sample.a2dprc

I removed the line LIBS= from Makefile.am as suggested. This line was 
making tons of compilation problems. As a2dpd finally links to alsa, it 
is no longer needed.
Please give it a try before submitting (Matthew and RUI if you read that).

Wrote a doc : http://fdalleau.free.fr/a2dp_doc.pdf ideas welcome!

Frédéric


[-- Attachment #2: Type: text/plain, Size: 373 bytes --]

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

[-- Attachment #3: Type: text/plain, Size: 164 bytes --]

_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel

^ permalink raw reply	[flat|nested] 27+ messages in thread
* Re: [Bluez-devel] Big patch to a2dpd
@ 2006-09-06  3:12 Li, Lea
  2006-09-06  3:38 ` Brad Midgley
  0 siblings, 1 reply; 27+ messages in thread
From: Li, Lea @ 2006-09-06  3:12 UTC (permalink / raw)
  To: BlueZ development

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

Yes. I prefer modifying alsa_transfer_raw(), which makes the framework logic consistent. How do you think about it? 

 
Thanks,
Lea
 

-----Original Message-----
From: bluez-devel-bounces@lists.sourceforge.net [mailto:bluez-devel-bounces@lists.sourceforge.net] On Behalf Of Brad Midgley
Sent: 2006年9月6日 11:06
To: BlueZ development
Subject: Re: [Bluez-devel] Big patch to a2dpd

Lea

You seem to be proposing two different changes below. Do we need to
discuss which one is best?

thanks
Brad

> I've tried it on my XScale board. It is perfect but only one line to be modified to make default alsa device work smoothly. See below patch: 
> The better way is to modify the code in alsa_transfer_raw(), I think, as below: 
> 
> 	case -EPIPE:
> 		// To manage underrun, we will try to recover from error state
> 		if(xrun_recovery(alsa->playback_handle, result) == 0)
> 			result = 0;
> 		DBG("EPIPE(%d)", result);
> 		break;
> 	case -ESTRPIPE:
> 		if(xrun_recovery(alsa->playback_handle, result) == 0)
> 			result=0;
> 		DBG("ESTRPIPE(%d)", result);
> 		break;
> 	}
> 
> ========patch begin========
> --- a2dpd.c.old	2006-09-02 13:53:31.601040096 +0800
> +++ a2dpd.c	2006-09-02 13:14:53.065511072 +0800
> @@ -716,7 +716,7 @@
>  								blockstart += blocksize;
>  								ibytespersecond += transfer;
>  								a2dp_timer_notifyframe(&TimerInfos);
> -							} else {
> +							} else if (! (lpDevice->bredirectalsa)){
>  								printf("Error in a2dp_transfer_raw\n");
>  								bError = 1;
>  							}
> ========patch end========
>  
> Thanks,
> Lea

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel


[-- Attachment #2: Type: text/plain, Size: 373 bytes --]

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

[-- Attachment #3: Type: text/plain, Size: 164 bytes --]

_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel

^ permalink raw reply	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2006-09-07 23:00 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-23 16:55 [Bluez-devel] Small patch to a2dpd Frédéric DALLEAU
2006-08-23 17:53 ` Brad Midgley
2006-08-24  8:44   ` Frédéric DALLEAU
2006-08-30 14:45 ` Brad Midgley
2006-08-31 16:04   ` [Bluez-devel] Big " Frédéric DALLEAU
2006-09-01 12:57     ` andy
2006-09-01 18:25       ` Michael Frey
2006-09-02 16:05     ` Brad Midgley
2006-09-02 20:06       ` [Bluez-devel] RE : " Frederic Dalleau
2006-09-06  3:58         ` Brad Midgley
2006-09-06  8:52           ` Frédéric DALLEAU
2006-09-07 23:00             ` Brad Midgley
2006-09-02 16:08     ` [Bluez-devel] " Brad Midgley
2006-09-02 17:01       ` Brad Midgley
  -- strict thread matches above, loose matches on Subject: below --
2006-09-02  6:04 Li, Lea
2006-09-02 13:02 ` Michael Frey
2006-09-02  6:21 Li, Lea
2006-09-06  3:06 ` Brad Midgley
2006-09-06  3:12 Li, Lea
2006-09-06  3:38 ` Brad Midgley
2006-09-06  9:33   ` Frédéric DALLEAU
2006-09-07 16:48     ` Andrew Waldram
2006-09-07 19:47       ` Brad Midgley
2006-09-07 20:36         ` Michael Frey
2006-09-07 22:46           ` Brad Midgley
2006-09-07 21:06         ` Andrew Waldram
2006-09-07 22:52           ` Brad Midgley

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox