home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / unix / volume26 / radio202 / patch03 < prev    next >
Encoding:
Text File  |  1993-05-07  |  35.2 KB  |  1,285 lines

  1. Newsgroups: comp.sources.unix
  2. From: guido.van.rossum@cwi.nl (Guido van Rossum)
  3. Subject: v26i234: radio - UDP broadcast/receive utilities for audio data, V2.0, Patch03
  4. Sender: unix-sources-moderator@efficacy.home.vix.com
  5. Approved: WhoAmI@efficacy.home.vix.com
  6.  
  7. Submitted-By: guido.van.rossum@cwi.nl (Guido van Rossum)
  8. Posting-Number: Volume 26, Issue 234
  9. Archive-Name: radio2.0.2/patch03
  10.  
  11. [ radio2.0.2 was posted at patchlevel 2, so this is the first patch to it.
  12.   --vix ]
  13.  
  14. Archive-name: radio-2.0/patch03
  15. Submitted-by: Guido van Rossum <guido@cwi.nl>
  16.  
  17. This is official patch number 3 for radio version 2.0, bringing it up
  18. to patch level 3, or version 2.0.3.  See the blurb a little further
  19. below if you don't know what radio is.
  20.  
  21. Changes in 2.0 patchlevel 3:
  22.  
  23. - Broadcast no longer uses "-b address" to indicate the IP address to
  24.   send to; address must be passed as arguments, after all options.
  25.   Addresses have an optional :port suffix to override the port specified
  26.   with -p (or the default of 54321).
  27.  
  28. - Radio can now also be used with DEC CRL's AudioFile server or with DEC
  29.   LoFi hardware (these options require additional software available
  30.   elsewhere).  When compiled for AudioFile, broadcast can optionally
  31.   record data directly from the server.
  32.  
  33. - Bugfix when switching stations under tuner control when using
  34.   multicast.
  35.  
  36. - Minor clarifications to man pages, etc.
  37.  
  38. - Copyrights updated.
  39.  
  40. ******************
  41. * What is radio? *
  42. ******************
  43.  
  44. If you have a local area network full of workstations with audio
  45. capabilities and at least one FM/AM radio or other audio source, you
  46. can broadcast the audio over the network, and let other users listen
  47. to it.
  48.  
  49. This software works for Sun Sparcs running SunOS 4.0 or 4.1, for SGI
  50. Indigo or Personal IRIS 4D/30 or 4D/35 workstations running SGI IRIX
  51. 4.0 or 3.3.2, NeXT workstations (running version 2.1), DECstations
  52. equipped with DEC lofi, and machines running the Audio File audio
  53. server from DEC CRL.  At CWI, versions of it have been in continuous
  54. use on a mix of Sun and SGI system types for almost two years; version
  55. 1.0 (patchlevel 4) was last tested on a NeXT.  (I've heard that the
  56. program doesn't work on NeXT 3.1; if you fix it please send me the
  57. changes!)
  58.  
  59. Man pages for "radio" and "broadcast" are provided.
  60.  
  61. The implementation continuously transmits UDP broadcast packets of
  62. 1400 bytes each (i.e. less than six per second), which contain the
  63. data in U-LAW format (8000 samples/second, 1 byte/sample,
  64. logarithmically encoded).  On a typical ethernet, this uses about 1
  65. percent of the net available bandwith.  Some loss of UDP packets is
  66. tolerated by the receiving program (this is heard as short
  67. interruptions of the sound).  Every now and then, a short "station
  68. call" packet is transmitted as well, for the benefit of advanced
  69. listening programs.
  70.  
  71. If you missed a part of the posting of radio, you can ftp the whole
  72. source from ftp.cwi.nl [192.16.184.180], file /pub/radio2.0.*.tar.Z,
  73. or from the comp.sources.unix archives.
  74.  
  75. Enjoy,
  76.  
  77. --Guido van Rossum, CWI, Amsterdam <Guido.van.Rossum@cwi.nl>
  78.  
  79.  
  80. diff -c1 pl2/Makefile pl3/Makefile
  81. *** pl2/Makefile    Sun Feb 21 18:29:23 1993
  82. --- pl3/Makefile    Fri May  7 16:28:59 1993
  83. ***************
  84. *** 1,4 ****
  85.   # /***********************************************************
  86. ! # Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
  87. ! # Netherlands.
  88.   # 
  89. --- 1,4 ----
  90.   # /***********************************************************
  91. ! # Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  92. ! # Amsterdam, The Netherlands.
  93.   # 
  94. ***************
  95. *** 27,29 ****
  96.           @echo 'You must use "make sun4.0", "make sun4.1",'
  97. !         @echo '"make next" or "make sgi"'
  98.           exit 1
  99. --- 27,30 ----
  100.           @echo 'You must use "make sun4.0", "make sun4.1",'
  101. !         @echo '"make next", "make sgi", "make lofi" or'
  102. !         @echo '"make audiofile"'
  103.           exit 1
  104. ***************
  105. *** 46,48 ****
  106.   sgi:        # For SGI IRIX 4.0
  107. !         make all recordulaw recordlinear playulaw LIBS='-lX11 -laudio'
  108.   
  109. --- 47,50 ----
  110.   sgi:        # For SGI IRIX 4.0
  111. !         make all recordulaw recordlinear playulaw \
  112. !         CFLAGS='-O' LIBS='-lX11 -laudio'
  113.   
  114. ***************
  115. *** 50,51 ****
  116. --- 52,72 ----
  117.           make all sndulaw
  118. + # Where are the (mini) LoFi include files and libraries?
  119. + LOFI=        ./LoFiLib
  120. + LOFIINCLUDE=    -I$(LOFI)
  121. + LOFILIBDIRS=    -L$(LOFI)
  122. + lofi:
  123. +         make all CFLAGS="-g -Ddec_lofi $(LOFIINCLUDE)" \
  124. +             LIBS="$(LOFILIBDIRS) -lminilofi -lm"
  125. + # Where are the AF include files and libraries?
  126. + AF=        /ufs/guido/src/af/AF
  127. + AFINCLUDE=    -I$(AF)/include -I$(AF)
  128. + AFLIBDIRS=    -L$(AF)/lib/AF -L$(AF)/lib/AFUtil
  129. + audiofile:        
  130. +         make all CFLAGS="-g -Daudiofile $(AFINCLUDE)" \
  131. +         LIBS="$(AFLIBDIRS) -lAF -lAFUtil -lm"
  132.   
  133. diff -c1 pl2/README pl3/README
  134. *** pl2/README    Sun Feb 21 18:24:21 1993
  135. --- pl3/README    Fri May  7 16:28:59 1993
  136. ***************
  137. *** 3,5 ****
  138.   
  139. ! This is Radio version 2.0, patchlevel 2 (a.k.a. 2.0.2).
  140.   
  141. --- 3,5 ----
  142.   
  143. ! This is Radio version 2.0, patchlevel 3 (a.k.a. 2.0.3).
  144.   
  145. ***************
  146. *** 12,18 ****
  147.   Indigo or Personal IRIS 4D/30 or 4D/35 workstations running SGI IRIX
  148. ! 4.0 or 3.3.2, and for NeXT workstations (running version 2.1).  At
  149. ! CWI, versions of it have been in continuous use on a mix of Sun and
  150. ! SGI system types for almost two years; version 1.0 (patchlevel 4) was
  151. ! last tested on a NeXT.  (I've heard that the program doesn't work on
  152. ! NeXT 3.1; if you fix it please send me the changes!)
  153.   
  154. --- 12,20 ----
  155.   Indigo or Personal IRIS 4D/30 or 4D/35 workstations running SGI IRIX
  156. ! 4.0 or 3.3.2, NeXT workstations (running version 2.1), DECstations
  157. ! equipped with DEC lofi, and machines running the Audio File audio
  158. ! server from DEC CRL.  At CWI, versions of it have been in continuous
  159. ! use on a mix of Sun and SGI system types for almost two years; version
  160. ! 1.0 (patchlevel 4) was last tested on a NeXT.  (I've heard that the
  161. ! program doesn't work on NeXT 3.1; if you fix it please send me the
  162. ! changes!)
  163.   
  164. ***************
  165. *** 37,45 ****
  166.   
  167. ! If you have Motif, you may be interested in the "tuner" program
  168. ! (version 1.3) by Jack Jansen.  This is a window-based interface that
  169. ! shows the different broadcasting stations at your site and lets you
  170. ! tune your radio process to the station of your choice.  It will be
  171. ! posted to comp.sources.x around the same time as radio 2.0; you can
  172.   also ftp it from site ftp.cwi.nl [192.16.184.180], file
  173. ! /pub/tuner1.3.tar.Z.
  174.   
  175. --- 39,47 ----
  176.   
  177. ! If you have Motif, you may be interested in the "tuner" program by
  178. ! Jack Jansen.  This is a window-based interface that shows the
  179. ! different broadcasting stations at your site and lets you tune your
  180. ! radio process to the station of your choice.  It was posted to
  181. ! comp.sources.<something> around the same time as radio 2.0.2; you can
  182.   also ftp it from site ftp.cwi.nl [192.16.184.180], file
  183. ! /pub/tuner1.*.tar.Z, or from the comp.sources.unix archives.
  184.   
  185. ***************
  186. *** 46,48 ****
  187.   If you missed a part of the posting of radio, you can ftp the whole
  188. ! source from ftp.cwi.nl [192.16.184.180], file /pub/radio2.0.tar.Z.
  189.   
  190. --- 48,50 ----
  191.   If you missed a part of the posting of radio, you can ftp the whole
  192. ! source from ftp.cwi.nl [192.16.184.180], file /pub/radio2.0.*.tar.Z.
  193.   
  194. ***************
  195. *** 51,52 ****
  196. --- 53,75 ----
  197.   
  198. + Changes in 2.0 patchlevel 3
  199. + ---------------------------
  200. + Broadcast no longer uses "-b address" to indicate the IP address to
  201. + send to; address must be passed as arguments, after all options.
  202. + Addresses have an optional :port suffix to override the port specified
  203. + with -p (or the default of 54321).
  204. + Radio can now also be used with DEC CRL's AudioFile server or with DEC
  205. + LoFi hardware (these options require additional software available
  206. + elsewhere).  When compiled for AudioFile, broadcast can optionally
  207. + record data directly from the server.
  208. + Bugfix when switching stations under tuner control when using
  209. + multicast.
  210. + Minor clarifications to man pages, etc.
  211. + Copyrights updated.
  212.   Changes in 2.0 patchlevel 2
  213. ***************
  214. *** 197,198 ****
  215. --- 220,240 ----
  216.   
  217. + For a DECStation with LoFi hardware, you need to fetch either the LoFi
  218. + library by <gnn@cs.utwente.nl> or the DEC CRL AudioFile software
  219. + distribution.  LoFiLib is available for ftp from pegasus.cs.utwente.nl
  220. + in /pub/audio/libminilofi.tar.Z.  AudioFile is available for ftp from
  221. + crl.dec.com in /pub/DEC/AF/AF2R2.tar.Z.  Also get the patches from the
  222. + same directory.  AudioFile runs on several different kinds of
  223. + hardware, including almost all DEC hardware.  It is one or more orders
  224. + of magnitude bigger than LoFiLib.
  225. + To build for LoFiLib, build LoFiLib first (there is a README in there
  226. + detailing that process).  Edit the variable LOFI in the Makefile here
  227. + to point to the LoFiLib directory.  Then do "make lofi".
  228. + To build with AudioFile, build the AudioFile client library and server
  229. + first.  Edit the variable AF in the Makefile here to point to the root
  230. + of the AudioFile tree; or edit the variables AFINCLUDES and AFLIBDIRS
  231. + to point to the installed include files and libraries respectively.
  232. + Then do "make audiofile".
  233.   Install the "radio" program on a convenient public place (where
  234. ***************
  235. *** 239,242 ****
  236.   
  237.   By default this broadcasts on the local ethernet.  You can specify one
  238. ! or more -b options to broadcast, passing it explicit IP broadcast
  239.   addresses (last byte 0 or 255, depending on local convention).  You can
  240. --- 281,289 ----
  241.   
  242. + On Audio File you start transmissions as follows:
  243. +     broadcast -s -p port
  244.   By default this broadcasts on the local ethernet.  You can specify one
  245. ! or more arguments to broadcast, passing it explicit IP broadcast
  246.   addresses (last byte 0 or 255, depending on local convention).  You can
  247. ***************
  248. *** 366,369 ****
  249.   
  250. ! Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
  251. ! Netherlands.
  252.   
  253. --- 413,416 ----
  254.   
  255. ! Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  256. ! Amsterdam, The Netherlands.
  257.   
  258. diff -c1 pl2/adpcm.c pl3/adpcm.c
  259. *** pl2/adpcm.c    Sun Feb 21 18:24:24 1993
  260. --- pl3/adpcm.c    Fri May  7 16:29:00 1993
  261. ***************
  262. *** 1,4 ****
  263.   /***********************************************************
  264. ! Copyright 1992 by Stichting Mathematisch Centrum, Amsterdam, The
  265. ! Netherlands.
  266.   
  267. --- 1,4 ----
  268.   /***********************************************************
  269. ! Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  270. ! Amsterdam, The Netherlands.
  271.   
  272. diff -c1 pl2/broadcast.c pl3/broadcast.c
  273. *** pl2/broadcast.c    Sun Feb 21 18:24:26 1993
  274. --- pl3/broadcast.c    Fri May  7 16:29:00 1993
  275. ***************
  276. *** 1,4 ****
  277.   /***********************************************************
  278. ! Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
  279. ! Netherlands.
  280.   
  281. --- 1,4 ----
  282.   /***********************************************************
  283. ! Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  284. ! Amsterdam, The Netherlands.
  285.   
  286. ***************
  287. *** 35,38 ****
  288.      -A        ADPCM encoding without state, even worse sound
  289. -    -b ipaddr    IP address to broadcast to; may be repeated
  290. -         (default broadcast on local net)
  291.      -c port    listen to this control port (default 54319)
  292. --- 35,36 ----
  293. ***************
  294. *** 48,49 ****
  295. --- 46,53 ----
  296.      -P file    program file (default /ufs/<username>/CD)
  297. +    -s           server mode (Audio File Only) 
  298. +    The rest of the arguments are addresses to broadcast to. These can be
  299. +    IP unicast, multicast or broadcast addresses, optionally followed by
  300. +    ':port' to signify that a different port from the default should be
  301. +    used.
  302.   */
  303. ***************
  304. *** 57,58 ****
  305. --- 61,63 ----
  306.   #include <fcntl.h>
  307. + #include <string.h>
  308.   
  309. ***************
  310. *** 87,88 ****
  311. --- 92,109 ----
  312.   
  313. + #ifdef USE_AF
  314. + #include <AF/AFlib.h>
  315. + #define TRUE 1
  316. + #define FALSE 0
  317. + ATime now;
  318. + AFAudioConn *aud;
  319. + AC audio_context;
  320. + AFSetACAttributes attributes;
  321. + int device;
  322. + int server = FALSE;
  323. + #endif /* USE_AF */
  324.   extern int optind;
  325. ***************
  326. *** 101,103 ****
  327.   
  328. ! int port = RCVPORT;
  329.   char *name = 0;
  330. --- 122,124 ----
  331.   
  332. ! int dftport = RCVPORT;
  333.   char *name = 0;
  334. ***************
  335. *** 112,113 ****
  336. --- 133,137 ----
  337.   
  338. + /* Forward functions */
  339. + void open_microphone();
  340.   char *
  341. ***************
  342. *** 133,135 ****
  343.   int
  344. ! makeinfo()
  345.   {
  346. --- 157,160 ----
  347.   int
  348. ! makeinfo(port)
  349. !     short port;
  350.   {
  351. ***************
  352. *** 159,161 ****
  353.   void
  354. ! sendinfo(s, addr, addrsize)
  355.       int s; /* Socket */
  356. --- 184,186 ----
  357.   void
  358. ! sendinfo(s, addr, addrsize, port)
  359.       int s; /* Socket */
  360. ***************
  361. *** 163,166 ****
  362.       int addrsize;
  363.   {
  364. !     int n = makeinfo();
  365.       if (sendto(s, infostring, n, 0, addr, addrsize) < 0)
  366. --- 188,192 ----
  367.       int addrsize;
  368. +     short port;
  369.   {
  370. !     int n = makeinfo(port);
  371.       if (sendto(s, infostring, n, 0, addr, addrsize) < 0)
  372. ***************
  373. *** 203,208 ****
  374.   /* Always change these two macros and the following switch together! */
  375. ! #define OPTIONS "Aab:c:dlm:np:tL:N:P:"
  376.   #define USAGE    \
  377. !     "usage: %s [-A] [-a] [-b broadcastaddr] ... [-c ctlport] [-d] [-l]\n\
  378. ! \t[-m ttl] [-n] [-p port] [-t]\n\t[-N name] [-L logfile] [-P programfile]\n"
  379.   
  380. --- 229,234 ----
  381.   /* Always change these two macros and the following switch together! */
  382. ! #define OPTIONS "Aac:dlm:np:tL:N:P:s"
  383.   #define USAGE    \
  384. !     "usage: %s [-A] [-a] [-c ctlport] [-d] [-l] [-m ttl] [-n] [-p port]\n\
  385. ! \t[-s] [-t] [-N name] [-L logfile] [-P programfile] [address[:port] ...]\n"
  386.   
  387. ***************
  388. *** 220,236 ****
  389.               break;
  390. -         case 'b':
  391. -             if (nbcaddr >= NBCADDR) {
  392. -                 fprintf(stderr,
  393. -                     "%s: too many -b options (max %d)\n",
  394. -                     progname, NBCADDR);
  395. -                 exit(2);
  396. -             }
  397. -             if (setipaddr(optarg, &bcaddr[nbcaddr]) < 0) {
  398. -                 fprintf(stderr,
  399. -                     "%s: bad broadcast address '%s'\n",
  400. -                     progname, broadcastaddr);
  401. -                 exit(2);
  402. -             }
  403. -             nbcaddr++;
  404. -             break;
  405.           case 'c':
  406. --- 246,247 ----
  407. ***************
  408. *** 255,257 ****
  409.           case 'p':
  410. !             port = atoi(optarg);
  411.               break;
  412. --- 266,268 ----
  413.           case 'p':
  414. !             dftport = atoi(optarg);
  415.               break;
  416. ***************
  417. *** 269,270 ****
  418. --- 280,286 ----
  419.               break;
  420. + #ifdef USE_AF
  421. +                 case 's':
  422. +             server = TRUE;
  423. +             break;
  424. + #endif /* USE_AF */
  425.           }
  426. ***************
  427. *** 288,289 ****
  428. --- 304,310 ----
  429.   
  430. + #ifdef USE_AF
  431. +     if(server)
  432. +         open_microphone();
  433. + #endif /* USE_AF */
  434.       s = opensock("data", (char *)NULL, SENDPORT, (char *)NULL, 0, 1);
  435. ***************
  436. *** 290,294 ****
  437.   
  438. !     if (nbcaddr == 0) {
  439.   #if defined(HAVE_MCAST) && defined (DEFMCAST)
  440. !         if (setipaddr(DEFMCAST, &bcaddr[nbcaddr]) < 0) {
  441.               fprintf(stderr,
  442. --- 311,315 ----
  443.   
  444. !     if (optind == argc) {
  445.   #if defined(HAVE_MCAST) && defined (DEFMCAST)
  446. !         if (setfulladdr(s, DEFMCAST, &bcaddr[0]) < 0) {
  447.               fprintf(stderr,
  448. ***************
  449. *** 299,301 ****
  450.   #else
  451. !         configure(s, &bcaddr[0]);
  452.   #endif
  453. --- 320,322 ----
  454.   #else
  455. !         setfulladdr(s, "", &bcaddr[0]);
  456.   #endif
  457. ***************
  458. *** 302,304 ****
  459. --- 323,344 ----
  460.           nbcaddr = 1;
  461. +     } else {
  462. +         while (optind < argc) {
  463. +             if (nbcaddr >= NBCADDR) {
  464. +                 fprintf(stderr,
  465. +                     "%s: too many addresses (max %d)\n",
  466. +                     progname, NBCADDR);
  467. +                 exit(2);
  468. +             }
  469. +             if (setfulladdr(s, argv[optind],
  470. +                     &bcaddr[nbcaddr]) < 0) {
  471. +                 fprintf(stderr,
  472. +                     "%s: bad broadcast address '%s'\n",
  473. +                     progname, broadcastaddr);
  474. +                 exit(2);
  475. +             }
  476. +             nbcaddr++;
  477. +             optind++;
  478. +         }
  479.       }
  480. +         
  481.   
  482. ***************
  483. *** 305,307 ****
  484.       for (i = 0; i < nbcaddr; i++) {
  485. -         bcaddr[i].sin_port = htons(port);
  486.           bcaddr[i].sin_family = AF_INET;
  487. --- 345,346 ----
  488. ***************
  489. *** 349,351 ****
  490.                   buf = tmp_buf;
  491. !             n = fread(buf, 1, BUFFERSIZE, stdin);
  492.           }
  493. --- 388,419 ----
  494.                   buf = tmp_buf;
  495. ! #ifdef USE_AF
  496. !             if(server)
  497. !             {
  498. !                 static ATime next_time;
  499. !                 ATime now;
  500. !                 int dt;
  501. !                 if (next_time == 0)
  502. !                     next_time = AFGetTime(audio_context);
  503. !                 n = BUFFERSIZE;
  504. !                 now = AFRecordSamples(audio_context,
  505. !                               next_time, n,
  506. !                               buf, ABlock);
  507. !                 next_time += n;
  508. !                 dt = now - next_time;
  509. !                 /* If next_time is not within 4000
  510. !                    samples of the current time, adapt it.
  511. !                    The current packet may be lost,
  512. !                    but at least the next one will be
  513. !                    alright, and we have saved a server
  514. !                    round trip. */
  515. !                 if (dt < -4000 || dt > 4000) {
  516. !                     if (pdebug)
  517. !                         fprintf(stderr,
  518. !                             "Adapting (%d)\n", dt);
  519. !                     next_time = now;
  520. !                 }
  521. !             } 
  522. !             else
  523. ! #endif /* USE_AF */
  524. !                 n = fread(buf, 1, BUFFERSIZE, stdin);
  525.           }
  526. ***************
  527. *** 418,423 ****
  528.                   for (i = 0; i < nbcaddr; i++) {
  529.                       sendinfo(s, &infoaddr[i],
  530. !                          sizeof infoaddr[i]);
  531.                       sendinfo(s, &bcaddr[i],
  532. !                          sizeof bcaddr[i]);
  533.                   }
  534. --- 486,492 ----
  535.                   for (i = 0; i < nbcaddr; i++) {
  536. +                     short port = ntohs(bcaddr[i].sin_port);
  537.                       sendinfo(s, &infoaddr[i],
  538. !                          sizeof infoaddr[i], port);
  539.                       sendinfo(s, &bcaddr[i],
  540. !                          sizeof bcaddr[i], port);
  541.                   }
  542. ***************
  543. *** 538,539 ****
  544. --- 607,701 ----
  545.       return (dead > DEADTIME);
  546. + }
  547. + #ifdef USE_AF
  548. + void open_microphone()
  549. + {
  550. +     extern char *progname;
  551. +     extern int device;
  552. +     extern AFAudioConn *aud;
  553. +     extern AC audio_context;
  554. +     extern AFSetACAttributes attributes;
  555. +     if((aud = AFOpenAudioConn("")) == NULL) 
  556. +     {
  557. +     fprintf(stderr, "%s: can't open connection.\n", progname);
  558. +     exit(1);
  559. +     }
  560. +     /* set up audio context, find sample size and sample rate */
  561. +     device = FindDefaultDevice(aud);
  562. +     if(device < 0)
  563. +     {
  564. +     fprintf(stderr, "broadcast: unable find a suitable device.\n");
  565. +     exit(1);
  566. +     }
  567. +     
  568. +     attributes.preempt = Mix;
  569. +     attributes.start_timeout = 0;
  570. +     attributes.end_silence = 0;
  571. +     attributes.play_gain = 0;
  572. +     attributes.rec_gain =  0;
  573. +     audio_context = AFCreateAC(aud, device, ACPlayGain, &attributes);
  574. + }
  575. + /* This routine searches for a suitable device to play 8kHz uLaw 
  576. +    encoded audio on. */
  577. + int FindDefaultDevice(aud)
  578. + AFAudioConn *aud; 
  579. + {
  580. +     AFDeviceDescriptor *aDev;
  581. +     int     i;
  582. +     for(i=0; i<ANumberOfAudioDevices(aud); i++) {
  583. +         aDev = AAudioDeviceDescriptor(aud, i);
  584. +         if(aDev->inputsFromPhone == 0 && 
  585. +            aDev->outputsToPhone == 0 &&
  586. +            aDev->playSampleFreq == 8000 &&
  587. +            aDev->playBufType == MU255)
  588. +             return i;
  589. +     }
  590. +     return -1;
  591. + }
  592. + #endif /* USE_AF */
  593. + /*
  594. +  * setfulladdr - Set address and port.
  595. +  */
  596. + int
  597. + setfulladdr(s, name, addr_ret)
  598. +     int s;
  599. +     char *name;
  600. +     struct sockaddr_in *addr_ret;
  601. + {
  602. +     char *pname;
  603. +     short port;
  604. +     if ((pname=strchr(name, ':')))     /* Find optional port part */
  605. +         *pname++ = '\0';
  606. +     else
  607. +         pname = 0;
  608. +     if (*name == '\0')        /* Use default bcast address */
  609. +         configure(s, addr_ret);
  610. +     else {                /* otherwise use given address */
  611. +         if (setipaddr(name, addr_ret) < 0)
  612. +             return -1;
  613. +     }
  614. +     addr_ret->sin_family = AF_INET;
  615. +     if (pname) {            /* If port present use that */
  616. +         port = atoi(pname);
  617. +         addr_ret->sin_port = htons(port);
  618. +     } else {            /* otherwise use default */
  619. +         addr_ret->sin_port = htons(dftport);
  620. +     }
  621. +     return 0;
  622.   }
  623. diff -c1 pl2/broadcast.man pl3/broadcast.man
  624. *** pl2/broadcast.man    Sun Feb 21 18:24:25 1993
  625. --- pl3/broadcast.man    Fri May  7 16:29:00 1993
  626. ***************
  627. *** 10,13 ****
  628.   ] [
  629. - .BI "\-b " addr
  630. - ] ... [
  631.   .BI "\-c " port
  632. --- 10,11 ----
  633. ***************
  634. *** 31,33 ****
  635. --- 29,37 ----
  636.   .BI "\P " programfile
  637. + ] [
  638. + .BI \-s
  639.   ]
  640. +           [
  641. + .IR addr [ :port ]
  642. + \&... ]
  643.   .SH DESCRIPTION
  644. ***************
  645. *** 68,78 ****
  646.   .TP 10
  647. - .BI "\-b " addr
  648. - IP address to send to.  The default is either the local net broadcast address
  649. - or a multicast address assigned to radio if the host supports IP multicasts.
  650. - The address may be a host name (for unicast), an IP broadcast address,
  651. - or an IP multicast address (addresses beginning with 224).
  652. - More than one
  653. - .B \-b
  654. - option may be given; the data is sent to each address.
  655. - .TP 10
  656.   .BI "\-c " port
  657. --- 72,73 ----
  658. ***************
  659. *** 102,104 ****
  660.   .BI "\-p " port
  661. ! Transmit to this UDP port number (default 54321).
  662.   .TP 10
  663. --- 97,108 ----
  664.   .BI "\-p " port
  665. ! Transmit to this UDP port number (default 54321).  When there is
  666. ! than one transmission station on a single local area network, each
  667. ! should use a different port number, else radio listeners will hear
  668. ! interference (since they choose the station by its port number).  If
  669. ! you choose ascending port numbers starting with the default, radio
  670. ! listeners can use the shorthand
  671. ! .BR "\-p 1" ,
  672. ! .BR "\-p 2" ,
  673. ! .BR "\-p 3"
  674. ! and so on.
  675.   .TP 10
  676. ***************
  677. *** 126,127 ****
  678. --- 130,164 ----
  679.   Default is $HOME/.CD.
  680. + .PP
  681. + The information passed with
  682. + .BR \-L ,
  683. + .BR \-N
  684. + and
  685. + .BR \-P
  686. + options (in the latter case the contents of the file) is regularly
  687. + transmitted in the form of a ``station call packet''.  Station call
  688. + packets are ignored by the receiving radio program, but may be picked
  689. + up by other programs to inform interested listeners, e.g.
  690. + .IR tuner (1)
  691. + and
  692. + .IR ektuner (1).
  693. + .PP
  694. + The remaining arguments are IP addresses to send to.
  695. + The default is either the local net broadcast address
  696. + or a multicast address assigned to radio if the host supports IP multicasts.
  697. + The address may be a host name (for unicast), an IP broadcast address
  698. + (addresses ending in either 0 or 255, depending on local convention)
  699. + or an IP multicast address (addresses beginning with 224). Optionally,
  700. + the address may be followed by a colon and a port number specifying
  701. + that the given port should be used when transmitting to this address.
  702. + Normally data is transmitted to the default port or the port given
  703. + with the
  704. + .B \-p
  705. + option.
  706. + More than one address may be given; the data is sent to each address.
  707. + .TP 10
  708. + .BI \-s
  709. + Start up in Audio File server mode.  If the program is compiled to
  710. + work with the Audio File system from DEC CRL this will tell the
  711. + program to read from the local server directly instead of from the
  712. + stdin.    
  713.   .SH TYPICAL USAGE
  714. ***************
  715. *** 176,178 ****
  716.   .IP
  717. ! broadcast -b A.0 -b B.1
  718.   .PP
  719. --- 213,215 ----
  720.   .IP
  721. ! broadcast A.0 B.1
  722.   .PP
  723. ***************
  724. *** 180,182 ****
  725.   .IP
  726. ! radio -l B.1 -r A.1 -f | broadcast -b B.0
  727.   .PP
  728. --- 217,219 ----
  729.   .IP
  730. ! radio -l B.1 -r A.1 -f | broadcast B.0
  731.   .PP
  732. ***************
  733. *** 186,189 ****
  734.   If the gateway lets UDP broadcast packets through, no forwarding is
  735. ! necessary; running ``broadcast -b A.0 -b B.0'' on host A.1 is
  736.   sufficient.
  737.   .SH AUTHOR
  738. --- 223,238 ----
  739.   If the gateway lets UDP broadcast packets through, no forwarding is
  740. ! necessary; running ``broadcast A.0 B.0'' on host A.1 is
  741.   sufficient.
  742. + .SH NOTE
  743. + On some systems it is not possible to have multiple receivers
  744. + listening to the same port on the same system. If you need this
  745. + functionality, for instance because you want to capture the news with
  746. + a dedicated program while still listening to the radio yourself, you
  747. + can use the folowing setup. Assume A is your local host and B the
  748. + local net:
  749. + .IP
  750. + broadcast B A:12000
  751. + .PP
  752. + This will allow you to listen to the radio on the default port (like
  753. + everyone else on the net) and your capture program to listen to port 12000.
  754.   .SH AUTHOR
  755. ***************
  756. *** 191,198 ****
  757.   .SH VERSION
  758. ! This manual page documents broadcast version 2.0, patchlevel 0.
  759.   .SH SEE ALSO
  760. ! radio(1)
  761.   .SH COPYRIGHT
  762. ! Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
  763. ! Netherlands.
  764.   
  765. --- 240,247 ----
  766.   .SH VERSION
  767. ! This manual page documents broadcast version 2.0, patchlevel 3.
  768.   .SH SEE ALSO
  769. ! radio(1), tuner(1), ektuner(1)
  770.   .SH COPYRIGHT
  771. ! Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  772. ! Amsterdam, The Netherlands.
  773.   
  774. diff -c1 pl2/checkradio.py pl3/checkradio.py
  775. *** pl2/checkradio.py    Sun Feb 21 18:24:25 1993
  776. --- pl3/checkradio.py    Fri May  7 16:29:01 1993
  777. ***************
  778. *** 1,4 ****
  779.   # /***********************************************************
  780. ! # Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
  781. ! # Netherlands.
  782.   # 
  783. --- 1,4 ----
  784.   # /***********************************************************
  785. ! # Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  786. ! # Amsterdam, The Netherlands.
  787.   # 
  788. diff -c1 pl2/nielsen.py pl3/nielsen.py
  789. *** pl2/nielsen.py    Sun Feb 21 18:24:22 1993
  790. --- pl3/nielsen.py    Fri May  7 16:29:01 1993
  791. ***************
  792. *** 3,6 ****
  793.   # /***********************************************************
  794. ! # Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
  795. ! # Netherlands.
  796.   # 
  797. --- 3,6 ----
  798.   # /***********************************************************
  799. ! # Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  800. ! # Amsterdam, The Netherlands.
  801.   # 
  802. diff -c1 pl2/patchlevel.h pl3/patchlevel.h
  803. *** pl2/patchlevel.h    Sun Feb 21 18:24:22 1993
  804. --- pl3/patchlevel.h    Fri May  7 16:29:01 1993
  805. ***************
  806. *** 1 ****
  807. ! #define PATCHLEVEL 2
  808. --- 1 ----
  809. ! #define PATCHLEVEL 3
  810. diff -c1 pl2/playulaw.c pl3/playulaw.c
  811. *** pl2/playulaw.c    Sun Feb 21 18:24:22 1993
  812. --- pl3/playulaw.c    Fri May  7 16:29:01 1993
  813. ***************
  814. *** 1,4 ****
  815.   /***********************************************************
  816. ! Copyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  817. ! Netherlands.
  818.   
  819. --- 1,4 ----
  820.   /***********************************************************
  821. ! Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  822. ! Amsterdam, The Netherlands.
  823.   
  824. diff -c1 pl2/radio.c pl3/radio.c
  825. *** pl2/radio.c    Sun Feb 21 18:24:27 1993
  826. --- pl3/radio.c    Fri May  7 16:29:02 1993
  827. ***************
  828. *** 1,4 ****
  829.   /***********************************************************
  830. ! Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
  831. ! Netherlands.
  832.   
  833. --- 1,4 ----
  834.   /***********************************************************
  835. ! Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  836. ! Amsterdam, The Netherlands.
  837.   
  838. ***************
  839. *** 110,111 ****
  840. --- 110,136 ----
  841.   
  842. + #ifdef USE_LOFI
  843. + #include "lofi.h"
  844. + #include "lofiMap.h"
  845. + #include "codec.h"
  846. + #include "ringbuffers.h"
  847. + #include "libst.h"
  848. + #define DEVLOFI "/dev/lofi"
  849. + #endif /* USE_LOFI */
  850. + #ifdef USE_AF
  851. + #include <AF/AFlib.h>
  852. + #include <math.h>
  853. + int device;
  854. + AFAudioConn *aud;
  855. + AC audio_context;
  856. + AFSetACAttributes attributes;
  857. + #endif /* USE_AF */
  858.   #ifdef CHECK_X_SERVER
  859. ***************
  860. *** 126,127 ****
  861. --- 151,156 ----
  862.   
  863. + #ifdef USE_LOFI
  864. + struct lofiPhysDevice *outdev;
  865. + #endif /* USE_LOFI */
  866.   /* Forward functions */
  867. ***************
  868. *** 164,165 ****
  869. --- 193,206 ----
  870.   #endif
  871. + #ifdef USE_LOFI
  872. +     DSPTime ptime;
  873. +     int first_time = 1, status = FALSE;
  874. +     int i;
  875. +     char *np, *p;
  876. +     short obuf[BUFFERSIZE];
  877. + #endif
  878. + #ifdef USE_AF
  879. +     extern int device;
  880. +     extern AC audio_context;
  881. +     extern AFSetACAttributes attributes;
  882. + #endif /* USE_AF */
  883.   
  884. ***************
  885. *** 358,359 ****
  886. --- 399,401 ----
  887.                                SENDPORT, 0);
  888. + #ifdef HAVE_MCAST
  889.                       if (mcastgrp)
  890. ***************
  891. *** 360,361 ****
  892. --- 402,406 ----
  893.                           setmcast(s, mcastgrp);
  894. +                     else if (defmcast)
  895. +                         setmcast(s, defmcast);
  896. + #endif
  897.                       break;
  898. ***************
  899. *** 501,502 ****
  900. --- 546,578 ----
  901.   #endif /* USE_SUN */
  902. + #ifdef USE_LOFI 
  903. +             if(!filter) 
  904. +                 lofiWriteNow(outdev, buf, n, CODEC_SECONDARY);
  905. + #endif /* USE_LOFI */
  906. + #ifdef USE_AF
  907. +             if(!filter)
  908. +             {
  909. +                 static ATime next_time;
  910. +                 ATime now;
  911. +                 int dt;
  912. +                 if (next_time == 0)
  913. +                     next_time = AFGetTime(audio_context)
  914. +                             + 8000;
  915. +                 now = AFPlaySamples(audio_context,
  916. +                             next_time, n, buf);
  917. +                 next_time += n;
  918. +                 dt = next_time - now;
  919. +                 /* If next_time is not within 4000-12000
  920. +                    samples in the future, adapt it.
  921. +                    The current packet may be lost,
  922. +                    but at least the next one will be
  923. +                    alright, and we have saved a server
  924. +                    round trip. */
  925. +                 if (dt < 4000 || dt > 12000) {
  926. +                     if (pdebug)
  927. +                         fprintf(stderr,
  928. +                             "Adapting (%d)\n", dt);
  929. +                     next_time = now+8000;
  930. +                 }
  931. +             }
  932. + #endif /* USE_AF */
  933.               if (filter || tee) {
  934. ***************
  935. *** 678,680 ****
  936. --- 754,863 ----
  937.   
  938. + #ifdef USE_LOFI
  939. + void open_speaker()
  940. + {
  941. +     int status;
  942. +     extern struct lofiPhysDevice *outdev;
  943. +     
  944. +     /* Open the devlofi device */
  945. +     
  946. +     outdev = lofiOpen(DEVLOFI);
  947. +     if(outdev == NULL)
  948. +     {
  949. +     fprintf(stderr, "Could not open lofi %s\n", DEVLOFI);
  950. +     exit(1);
  951. +     }
  952. +     
  953. +     /* Set up the lofi hardware for playing from the internal
  954. +        speaker. */
  955. +     
  956. +     status = lofiHWInit(outdev, 
  957. +             NULL, /* let it find it's own lod file */
  958. +             0, /* Primary codec output */
  959. +             CODEC_SPEAKER, /* Secondary codec output */
  960. +             0, /* Primary codec input */
  961. +             0, /* Secondary codec input */
  962. +             FALSE);
  963. +     
  964. +     if(volume >0)
  965. +     lofiSetOutputVolume(outdev, CODEC_SPEAKER, volume / 10);
  966.   
  967. +     if(status == FALSE)
  968. +     {
  969. +     fprintf(stderr,"Could not init the hardware,is AUDIO_ROOT set?\n");
  970. +     lofiClose(outdev);
  971. +     exit(1);
  972. +     }
  973. + }    
  974. + void close_speaker()
  975. + {
  976. +     extern struct lofiPhysDevice *outdev;
  977. +     lofiClose(outdev);
  978. +     
  979. + }
  980. + #endif /* USE_LOFI */
  981. + #ifdef USE_AF
  982. + void open_speaker()
  983. + {
  984. +     int outcur, outmin, outmax, steps;
  985. +     extern int device;
  986. +     extern AFAudioConn *aud;
  987. +     extern AC audio_context;
  988. +     extern AFSetACAttributes attributes;
  989. +     if((aud = AFOpenAudioConn("")) == NULL) 
  990. +     {
  991. +     fprintf(stderr, "radio: can't open connection.\n");
  992. +     exit(1);
  993. +     }
  994. +     
  995. +     /* set up audio context, find sample size and sample rate */
  996. +     
  997. +     device = FindDefaultDevice(aud);
  998. +     if(device < 0)
  999. +     {
  1000. +     fprintf(stderr, "radio: unable find a suitable device.\n");
  1001. +     exit(1);
  1002. +     }
  1003. +     
  1004. +     attributes.preempt = Mix;
  1005. +     attributes.start_timeout = 0;
  1006. +     attributes.end_silence = 0;
  1007. +     attributes.rec_gain =  0;
  1008. +     
  1009. +     audio_context = AFCreateAC(aud, device, ACPlayGain, &attributes);
  1010. +     outcur = AFQueryOutputGain(audio_context, &outmin, &outmax);
  1011. +     
  1012. +     if(volume == 0)
  1013. +     AFSetOutputGain(audio_context, outmin);
  1014. +     else
  1015. +     if(volume > 0)
  1016. +     {
  1017. +         steps = outmax - outmin;
  1018. +         AFSetOutputGain(audio_context, outmin + (steps * volume /100));
  1019. +     } 
  1020. +     else
  1021. +         AFSetOutputGain(audio_context, 0);
  1022. + }    
  1023. + void close_speaker()
  1024. + {
  1025. +     extern AFAudioConn *aud;
  1026. +     extern AC audio_context;
  1027. +     AFFreeAC(audio_context);
  1028. +     AFCloseAudioConn(aud);
  1029. + }
  1030. + #endif /* USE_LOFI */
  1031.   void checkalive()
  1032. ***************
  1033. *** 732 ****
  1034. --- 915,938 ----
  1035.   }
  1036. + #ifdef USE_AF
  1037. + /* This routine searches for a suitable device to play 8kHz uLaw 
  1038. +    encoded audio on. */
  1039. + int FindDefaultDevice(aud)             
  1040. + AFAudioConn *aud; 
  1041. + {
  1042. +         AFDeviceDescriptor *aDev;
  1043. +         int     i;
  1044. +         for(i=0; i<ANumberOfAudioDevices(aud); i++) {
  1045. +                 aDev = AAudioDeviceDescriptor(aud, i);
  1046. +                 if(aDev->inputsFromPhone == 0 && 
  1047. +            aDev->outputsToPhone == 0 &&
  1048. +            aDev->playSampleFreq == 8000 &&
  1049. +            aDev->playBufType == MU255)
  1050. +             return i;
  1051. +         }
  1052. +         return -1;
  1053. + }
  1054. + #endif /* USE_AF */
  1055. diff -c1 pl2/radio.h pl3/radio.h
  1056. *** pl2/radio.h    Sun Feb 21 18:24:23 1993
  1057. --- pl3/radio.h    Fri May  7 16:29:02 1993
  1058. ***************
  1059. *** 1,4 ****
  1060.   /***********************************************************
  1061. ! Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
  1062. ! Netherlands.
  1063.   
  1064. --- 1,4 ----
  1065.   /***********************************************************
  1066. ! Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  1067. ! Amsterdam, The Netherlands.
  1068.   
  1069. ***************
  1070. *** 60,61 ****
  1071. --- 60,62 ----
  1072.   #ifdef sgi
  1073. + #ifndef audiofile
  1074.   #define USE_AL
  1075. ***************
  1076. *** 62,63 ****
  1077. --- 63,65 ----
  1078.   #define CHECK_X_SERVER
  1079. + #endif
  1080.   #define HAVE_MCAST
  1081. ***************
  1082. *** 73,74 ****
  1083. --- 75,84 ----
  1084.   #define USE_NX
  1085. + #endif
  1086. + #ifdef dec_lofi
  1087. + #define USE_LOFI
  1088. + #endif
  1089. + #ifdef audiofile
  1090. + #define USE_AF
  1091.   #endif
  1092. diff -c1 pl2/radio.man pl3/radio.man
  1093. *** pl2/radio.man    Sun Feb 21 18:24:25 1993
  1094. --- pl3/radio.man    Fri May  7 16:29:02 1993
  1095. ***************
  1096. *** 41,44 ****
  1097.   Obviously, this requires a workstation with audio hardware; currently
  1098. ! the program works on SGI Indigo and 4D/35 workstations, Sun Sparcs, and
  1099. ! all NeXTs.
  1100.   .PP
  1101. --- 41,45 ----
  1102.   Obviously, this requires a workstation with audio hardware; currently
  1103. ! the program works on SGI Indigo and 4D/35 workstations, Sun Sparcs,
  1104. ! all NeXTs, DECStations equipped with DEC LoFi, and any machine running
  1105. ! the Audio File server from DEC CRL.
  1106.   .PP
  1107. ***************
  1108. *** 132,139 ****
  1109.   .SH VERSION
  1110. ! This manual page documents radio version 2.0, patchlevel 1.
  1111.   .SH SEE ALSO
  1112. ! broadcast(1)
  1113.   .SH COPYRIGHT
  1114. ! Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
  1115. ! Netherlands.
  1116.   
  1117. --- 133,140 ----
  1118.   .SH VERSION
  1119. ! This manual page documents radio version 2.0, patchlevel 3.
  1120.   .SH SEE ALSO
  1121. ! broadcast(1), tuner(1), ektuner(1)
  1122.   .SH COPYRIGHT
  1123. ! Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  1124. ! Amsterdam, The Netherlands.
  1125.   
  1126. diff -c1 pl2/recordlinear.c pl3/recordlinear.c
  1127. *** pl2/recordlinear.c    Sun Feb 21 18:24:23 1993
  1128. --- pl3/recordlinear.c    Fri May  7 16:29:03 1993
  1129. ***************
  1130. *** 1,4 ****
  1131.   /***********************************************************
  1132. ! Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
  1133. ! Netherlands.
  1134.   
  1135. --- 1,4 ----
  1136.   /***********************************************************
  1137. ! Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  1138. ! Amsterdam, The Netherlands.
  1139.   
  1140. diff -c1 pl2/recordulaw.c pl3/recordulaw.c
  1141. *** pl2/recordulaw.c    Sun Feb 21 18:24:25 1993
  1142. --- pl3/recordulaw.c    Fri May  7 16:29:03 1993
  1143. ***************
  1144. *** 1,4 ****
  1145.   /***********************************************************
  1146. ! Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
  1147. ! Netherlands.
  1148.   
  1149. --- 1,4 ----
  1150.   /***********************************************************
  1151. ! Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  1152. ! Amsterdam, The Netherlands.
  1153.   
  1154. diff -c1 pl2/socklib.c pl3/socklib.c
  1155. *** pl2/socklib.c    Sun Feb 21 18:24:23 1993
  1156. --- pl3/socklib.c    Fri May  7 16:29:03 1993
  1157. ***************
  1158. *** 1,4 ****
  1159.   /***********************************************************
  1160. ! Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
  1161. ! Netherlands.
  1162.   
  1163. --- 1,4 ----
  1164.   /***********************************************************
  1165. ! Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  1166. ! Amsterdam, The Netherlands.
  1167.   
  1168. diff -c1 pl2/stations.py pl3/stations.py
  1169. *** pl2/stations.py    Sun Feb 21 18:24:24 1993
  1170. --- pl3/stations.py    Fri May  7 16:29:03 1993
  1171. ***************
  1172. *** 3,6 ****
  1173.   # /***********************************************************
  1174. ! # Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
  1175. ! # Netherlands.
  1176.   # 
  1177. --- 3,6 ----
  1178.   # /***********************************************************
  1179. ! # Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  1180. ! # Amsterdam, The Netherlands.
  1181.   # 
  1182. diff -c1 pl2/ttytuner.py pl3/ttytuner.py
  1183. *** pl2/ttytuner.py    Sun Feb 21 18:24:25 1993
  1184. --- pl3/ttytuner.py    Fri May  7 16:29:04 1993
  1185. ***************
  1186. *** 3,6 ****
  1187.   # /***********************************************************
  1188. ! # Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
  1189. ! # Netherlands.
  1190.   # 
  1191. --- 3,6 ----
  1192.   # /***********************************************************
  1193. ! # Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  1194. ! # Amsterdam, The Netherlands.
  1195.   # 
  1196. diff -c1 pl2/ulawadpcm.c pl3/ulawadpcm.c
  1197. *** pl2/ulawadpcm.c    Sun Feb 21 18:24:26 1993
  1198. --- pl3/ulawadpcm.c    Fri May  7 16:29:04 1993
  1199. ***************
  1200. *** 1,4 ****
  1201.   /***********************************************************
  1202. ! Copyright 1992 by Stichting Mathematisch Centrum, Amsterdam, The
  1203. ! Netherlands.
  1204.   
  1205. --- 1,4 ----
  1206.   /***********************************************************
  1207. ! Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
  1208. ! Amsterdam, The Netherlands.
  1209.   
  1210.