From 92976e89f6b84797ea6da0ecfc937f70aeb63551 Mon Sep 17 00:00:00 2001
From: Diane Bruce <db@db.net>
Date: Sat, 15 Apr 2006 05:39:08 +0000
Subject: [PATCH] - Initial changes to add string names of audio devices/PTT
 ports

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/trunk@164 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
---
 audio_init.F90 |  2 +-
 gcom1.f90      |  3 ++-
 gcom2.f90      |  3 ++-
 options.py     | 11 +++++++----
 specjt.py      | 17 +++++++++++++----
 start_oss.c    | 50 +++++++++++++++++++++++++++-----------------------
 wsjt.py        | 40 ++++++++++++++++++++++++++++++----------
 7 files changed, 82 insertions(+), 44 deletions(-)

diff --git a/audio_init.F90 b/audio_init.F90
index ff6cd46b0..92bbb7c1e 100644
--- a/audio_init.F90
+++ b/audio_init.F90
@@ -70,7 +70,7 @@ subroutine audio_init(ndin,ndout)
 !  print*,'Audio INIT called.'
   ierr=start_threads(ndevin,ndevout,y1,y2,nmax,iwrite,iwave,nwave,    &
        11025,NSPB,TRPeriod,TxOK,ndebug,Transmitting,            &
-       Tsec,ngo,nmode,tbuf,ibuf,ndsec)
+       Tsec,ngo,nmode,tbuf,ibuf,ndsec,PttPort,devin_name,devout_name)
 
 #endif
 
diff --git a/gcom1.f90 b/gcom1.f90
index abbb013f4..192e7658c 100644
--- a/gcom1.f90
+++ b/gcom1.f90
@@ -40,12 +40,13 @@ integer nx             !x coordinate for waterfall pixmap       GUI
 integer mfsample       !Measured sample rate, input             SoundIn
 integer mfsample2      !Measured sample rate, output            SoundOut
 integer ns0            !Time at last ALL.TXT date entry         Decoder
+character*12 devin_name,devout_name ! GUI
 
 common/gcom1/Tbuf(1024),ntrbuf(1024),Tsec,rxdelay,txdelay,              &
      samfacin,samfacout,txsnrdb,y1(NRXMAX),y2(NRXMAX),                  &
      nmax,iwrite,iread,iwave(NTXMAX),nwave,TxOK,Receiving,Transmitting, &
      TxFirst,TRPeriod,ibuf,ibuf0,ave,rms,ngo,level,mute,newdat,ndsec,   &
-     ndevin,ndevout,nx,mfsample,mfsample2,ns0
+     ndevin,ndevout,nx,mfsample,mfsample2,ns0,devin_name,devout_name
 
 !### volatile /gcom1/
 
diff --git a/gcom2.f90 b/gcom2.f90
index 109858b64..bb91f4c53 100644
--- a/gcom2.f90
+++ b/gcom2.f90
@@ -79,6 +79,7 @@ character*24 decodedfile
 character*80 AppDir      !WSJT installation directory           GUI
 character*80 filetokilla !Filenames (full path)                 Decoder
 character*80 filetokillb
+character*12 pttport
 
 common/gcom2/ps0(431),psavg(450),s2(64,3100),ccf(-5:540),             &
      green(500),ngreen,dgain,iter,ndecoding,ndecoding0,mousebutton,   &
@@ -90,6 +91,6 @@ common/gcom2/ps0(431),psavg(450),s2(64,3100),ccf(-5:540),             &
      idinterval,msmax,lenappdir,ndiskdat,nlines,nflat,ntxreq,ntxnow,  &
      ndepth,nspecial,ndf,ss1(-224:224),ss2(-224:224),                 &
      mycall,hiscall,hisgrid,txmsg,sending,mode,fname0,fnamea,         &
-     fnameb,decodedfile,AppDir,filetokilla,filetokillb,utcdate
+     fnameb,decodedfile,AppDir,filetokilla,filetokillb,utcdate,pttport
 
 !### volatile /gcom2/
diff --git a/options.py b/options.py
index df7b361d6..b57025ea3 100644
--- a/options.py
+++ b/options.py
@@ -25,8 +25,11 @@ MyGrid=StringVar()
 #TxDelay=StringVar()
 IDinterval=IntVar()
 ComPort=IntVar()
+PttPort=StringVar()
 ndevin=IntVar()
 ndevout=IntVar()
+DevinName=StringVar()
+DevoutName=StringVar()
 samfacin=DoubleVar()
 samfacout=DoubleVar()
 Template1=StringVar()
@@ -106,12 +109,12 @@ mygrid=Pmw.EntryField(g1.interior(),labelpos=W,label_text='Grid Locator:',
 ##        value='0.2',entry_textvariable=TxDelay)
 idinterval=Pmw.EntryField(g1.interior(),labelpos=W,label_text='ID Interval (m):',
         value=10,entry_textvariable=IDinterval,entry_width=12)
-comport=Pmw.EntryField(g1.interior(),labelpos=W,label_text='COM Port:',
-        value=1,entry_textvariable=ComPort,entry_width=12)
+comport=Pmw.EntryField(g1.interior(),labelpos=W,label_text='PTT Port:',
+        value='1',entry_textvariable=PttPort,entry_width=12)
 audioin=Pmw.EntryField(g1.interior(),labelpos=W,label_text='Audio In:',
-        value=0,entry_textvariable=ndevin,entry_width=12)
+        value='0',entry_textvariable=DevinName,entry_width=12)
 audioout=Pmw.EntryField(g1.interior(),labelpos=W,label_text='Audio Out:',
-        value=0,entry_textvariable=ndevout,entry_width=12)
+        value='0',entry_textvariable=DevoutName,entry_width=12)
 ratein=Pmw.EntryField(g1.interior(),labelpos=W,label_text='Rate In:',
         value=1.0000,entry_textvariable=samfacin,entry_width=12)
 rateout=Pmw.EntryField(g1.interior(),labelpos=W,label_text='Rate Out:',
diff --git a/specjt.py b/specjt.py
index 013681974..a204f2084 100644
--- a/specjt.py
+++ b/specjt.py
@@ -489,10 +489,19 @@ if g.cmap == "AFMHot":
 
 #---------------------------------------------- Display GUI and start mainloop
 draw_axis()
-Audio.gcom1.ndevin=g.ndevin.get()
-Audio.gcom1.ndevout=g.ndevout.get()
-ndevin=g.ndevin.get()
-ndevout=g.ndevout.get()
+try:
+    ndevin=g.ndevin.get()
+except:
+    ndevin=0
+Audio.gcom1.ndevin=ndevin
+
+try:
+    ndevout=g.ndevout.get()
+except:
+    ndevout=0
+Audio.gcom1.ndevout=ndevout
+						# Only valid for windows
+                                                # for now
 Audio.audio_init(ndevin,ndevout)                #Start the audio stream
 ltime.after(200,update)
 
diff --git a/start_oss.c b/start_oss.c
index a894070e8..fb224f138 100644
--- a/start_oss.c
+++ b/start_oss.c
@@ -80,7 +80,8 @@ start_threads_(int *ndevin, int *ndevout, short y1[], short y2[],
 	       int *nwave, int *nfsample, int *nsamperbuf,
 	       int *TRPeriod, int *TxOK, int *ndebug,
 	       int *Transmitting, double *Tsec, int *ngo, int *nmode,
-	       double tbuf[], int *ibuf, int *ndsec)
+	       double tbuf[], int *ibuf, int *ndsec,
+	       char *PttPort, char *devin_name, char *devout_name)
 {
   pthread_t thread1,thread2;
   int iret1,iret2;
@@ -90,32 +91,35 @@ start_threads_(int *ndevin, int *ndevout, short y1[], short y2[],
   int format;
   int channels;
   double dnfs;
+  int i;
+  char *p;
+
+  p = strchr(devin_name, ' ');
+  if(p != NULL)
+    *p = '\0';
+
+  p = strchr(devin_name, '/');
+  if(p != NULL)
+    snprintf(dsp_in, MAXDSPNAME, "%s", devin_name);	/* assume /dev/... */
+  else
+    snprintf(dsp_in, MAXDSPNAME, "/dev/%s", devin_name);
 
-  /* XXX OSS device is decoded from ndevin and ndevout
-   * This is not strictly speaking the way to do it and is
-   * probably specific to FreeBSD for now. 
-   * i.e. the .0 addition is a vchan; I'll add configure magic later. --db
-   */
-  snprintf(dsp_in, MAXDSPNAME, 
-	   "/dev/dsp%d.0", *ndevin);
   dsp_in[MAXDSPNAME] = '\0';
 
   data.fd_in = open (dsp_in, O_RDWR, 0);
 
   if (data.fd_in < 0) { 
 	fprintf(stderr, "Cannot open %s for input.\n", dsp_in);
-	exit(-1);
+	return(-1);
   }
 
-  if (*ndevin == *ndevout) {
-    data.fd_out = data.fd_in;
-    strncpy(dsp_out, dsp_in, sizeof(dsp_out));
-    dsp_out[sizeof(dsp_out)] = '\0';
+  data.fd_out = data.fd_in;
+  strncpy(dsp_out, dsp_in, sizeof(dsp_out));
+  dsp_out[sizeof(dsp_out)] = '\0';
 
-    if (ioctl(data.fd_in, SNDCTL_DSP_SETDUPLEX, 0) < 0) {
-	fprintf(stderr, "Cannot use %s for full duplex.\n", dsp_in);
-	exit(-1);
-    }
+  if (ioctl(data.fd_in, SNDCTL_DSP_SETDUPLEX, 0) < 0) {
+    fprintf(stderr, "Cannot use %s for full duplex.\n", dsp_in);
+    return(-1);
   }
 
   data.Tsec = Tsec;
@@ -140,23 +144,23 @@ start_threads_(int *ndevin, int *ndevout, short y1[], short y2[],
   channels = 2;
   if (ioctl (data.fd_in, SNDCTL_DSP_CHANNELS, &channels) == -1) {
 	fprintf (stderr, "Unable to set 2 channels for input.\n");
-	exit (-1);
+	return (-1);
   }
 
   if (channels != 2) {
     fprintf (stderr, "Unable to set 2 channels.\n");
-    exit (-1);
+    return (-1);
   }
 
   format = AFMT_S16_NE;
   if (ioctl (data.fd_in, SNDCTL_DSP_SETFMT, &format) == -1) {
 	fprintf (stderr, "Unable to set format for input.\n");
-	exit (-1);
+	return (-1);
   }
 
   if (ioctl (data.fd_in, SNDCTL_DSP_SPEED, &rate) == -1) {
 	fprintf (stderr, "Unable to set rate for input\n");
-	exit (-1);
+	return (-1);
   }
 
   printf("Audio OSS streams running normally.\n");
@@ -214,7 +218,7 @@ oss_loop(int *iarg)
 	    nread = read (data.fd_in, rcv_buf, AUDIOBUFSIZE);
 	    if (nread <= 0) {
 	      fprintf(stderr, "Read error %d\n", nread);
-	      exit(-1);
+	      return (-1);
 	    }
 	    if (nread == AUDIOBUFSIZE) {
 	      /* Get System time */
@@ -281,7 +285,7 @@ oss_loop(int *iarg)
 
 	if (write(data.fd_out, tx_buf, AUDIOBUFSIZE) < 0) {
 	  fprintf(stderr, "Can't write to soundcard.\n");
-	  exit(-1);
+	  return (-1);
 	}
 	fivehztx_();                             /* Call fortran routine */
       }
diff --git a/wsjt.py b/wsjt.py
index af5d98472..1d495ea5e 100644
--- a/wsjt.py
+++ b/wsjt.py
@@ -98,6 +98,8 @@ g.freeze_decode=0
 g.mode=""
 g.ndevin=IntVar()
 g.ndevout=IntVar()
+g.DevinName=StringVar()
+g.DevoutName=StringVar()
 g.focus=0
 #------------------------------------------------------ showspecjt
 def showspecjt(event=NONE):
@@ -1512,7 +1514,7 @@ def update():
     Audio.gcom2.nslim2=isync-4
     if nosh441.get()==1 and mode.get()=='FSK441': Audio.gcom2.nslim2=99
     try:
-        Audio.gcom2.nport=int(options.ComPort.get())
+        Audio.gcom2.nport=options.ComPort.get()
     except:
         Audio.gcom2.nport=0
     
@@ -2013,17 +2015,35 @@ try:
 #        elif key == 'TxDelay': options.TxDelay.set(value)
         elif key == 'IDinterval': options.IDinterval.set(value)
         elif key == 'ComPort':
-            options.ComPort.set(value)
-            Audio.gcom2.nport=int(options.ComPort.get())
+            try:
+                options.ComPort.set(value)
+                Audio.gcom2.nport=options.ComPort.get()
+            except:
+                options.ComPort.set(0)
+                Audio.gcom2.nport=0
+
+            Audio.gcom2.PttPort=options.ComPort.get()
+             
         elif key == 'Mileskm': options.mileskm.set(value)
         elif key == 'MsgStyle': options.ireport.set(value)
         elif key == 'Region': options.iregion.set(value)
         elif key == 'AudioIn':
-            g.ndevin.set(value)
-            options.ndevin.set(value)
+            try:
+                g.ndevin.set(value)
+            except:
+                g.ndevin.set(0)
+            g.DevinName.set(value)
+            options.DevinName.set(value)
+            Audio.gcom1.devin_name=(options.DevinName.get()+'            ')[:12]
         elif key == 'AudioOut':
-            g.ndevout.set(value)
-            options.ndevout.set(value)
+            try:
+                g.ndevout.set(value)
+                Audio.gcom1.devout_name=(options.DevoutName.get()+'            ')[:12]
+            except:
+                g.ndevout.set(0)
+            g.DevoutName.set(value)
+            options.DevoutName.set(value)
+            Audio.gcom1.devout_name=(options.DevoutName.get()+'            ')[:12]
         elif key == 'SamFacIn': options.samfacin.set(value)
         elif key == 'SamFacOut': options.samfacout.set(value)
         elif key == 'Template1': options.Template1.set(value.replace("_"," "))
@@ -2113,12 +2133,12 @@ f.write("HisGrid " + t + "\n")
 #f.write("RxDelay " + str(options.RxDelay.get()) + "\n")
 #f.write("TxDelay " + str(options.TxDelay.get()) + "\n")
 f.write("IDinterval " + str(options.IDinterval.get()) + "\n")
-f.write("ComPort " + str(options.ComPort.get()) + "\n")
+f.write("ComPort " + options.PttPort.get() + "\n")
 f.write("Mileskm " + str(options.mileskm.get()) + "\n")
 f.write("MsgStyle " + str(options.ireport.get()) + "\n")
 f.write("Region " + str(options.iregion.get()) + "\n")
-f.write("AudioIn " + str(options.ndevin.get()) + "\n")
-f.write("AudioOut " + str(options.ndevout.get()) + "\n")
+f.write("AudioIn " + options.DevinName.get() + "\n")
+f.write("AudioOut " + options.DevoutName.get() + "\n")
 f.write("SamFacIn " + str(options.samfacin.get()) + "\n")
 f.write("SamFacOut " + str(options.samfacout.get()) + "\n")
 if options.Template6.get()=="": options.Template6.set("_")