Kurzanleitung zu den Utilities  "Sound Input"  und  "Sound Output"
==========================================================================

  Datei: soundutl\SoundUtilityInfo_01.txt
  Autor: Wolfgang Buescher (DL4YHF)
  Stand: 2022-10-17 (ISO-8601-Format: YYYY-MM-DD)


Hier zunchst nur die Beschreibung von "SndInput" zum Einlesen von
Audiodaten von der Soundkarte (A/D-Wandler).

Das Programm soll einen kontinuierlichen Datenstrom von der Soundkarte
einlesen, und in mglichst kleinen "Happen" als Datei an ein beliebiges
Programm weitergeben, welches die Daten weiterverarbeitet.

Das "Sound Input Utility" (SndInput.exe) wird im Folgenden "Produzent"
genannt, das weiterverarbeitende Programm "Konsument".

Das "Sound Output Utility" (SndOutpt.exe) funktioniert umgekehrt,
es frisst Audiodateien und gibt die Abtastwerte mit dem D/A-Wandler
der Soundkarte aus. Statt Dezimation erfolgt dann eine Interpolation.

hnliche tools wie z.B. "SerInput" funktionieren genauso, sie
lesen die Audiodaten nur von anderen Quellen ein (z.B. einem
externen A/D-Wandler auf PIC-Basis, der an der seriellen Schnitt-
stelle angeschlossen wird).
Die Firmware fr einen derartigen Wandler (zum Anschluss an die 
serielle Schnittstelle) auf Basis eines PIC-Mikrocontrollers
ist auf der Homepage des Autors erhltlich.

  Die Audio-Utilities wurden ursprnglich in Borland C++Builder V4
  geschrieben, sie knnen allerdings auch mit Dev-C++ bersetzt werden.
  Die Quelltexte sind fr nicht kommerzielle Zwecke vom Autor erhltlich.




Prinzip (SndInput)
--------------------------------------------------------------------------

1.)  Produzent sammelt Audiodaten in einem RAM-Puffer
     [ in einem hochpriorisierten Thread, damit nichts verlorengeht ].

2.)  Wann immer mglich, schreibt der Produzent mglichst viele
     Daten aus dem RAM-Puffer in eine temporre Datei.

3.)  Sobald der Produzent bemerkt, dass die "Audiodaten-bergabedatei"
     nicht existiert (weil der Konsument sie aufgefressen hat),
     benennt er die temporre Datei um,
     z.B. von "audio.tmp" nach "audio.dat".
     [ dies passiert mit einem einzigen Win32-API-Aufruf, um Inkonsistenz
       zu vermeiden. In dem Moment, wo die Datei umbenannt wird, ist sie
       bereits GESCHLOSSEN ! ]

4.)  Sobald der Konsument bemerkt, dass ihm neues Futter vorgeworfen wurde,
     ffnet er die bergabedatei, liest den Inhalt, schliet die Datei.
      (whrenddessen arbeitet der Produzent wieder bei Punkt 1 und 2)
     Nachgetaner Arbeit (Mahlzeit!) lscht der Konsument die bergabedatei
     (z.B. "audio.dat"), wodurch der Produzent frher oder spter zu Punkt 3
     bergeht.


Details:
--------------------------------------------------------------------------
Der Produzent pollt im Idealfall alle 100 Millisekunden, ob er eine neue
Datei produzieren kann.
Wie gro die bergebene Datei werden kann, hngt im Prinzip von der
Geschwindigkeit des Konsumenten ab.

Um Plattenzugriffe zu minimieren, kann fr die bergabedatei eine RAM-Disk
verwendet werden. Dies ist aber oft unntig, weil das Betriebssystem
wohl einen Cache ohne "write-through" verwendet - tnx DF6NM .




Kommandozeilenparameter:
--------------------------------------------------------------------------
 (N = einziffrige ganze Zahl, NNN=mehrziffrige ganze Zahl,
   das Gleichheitszeichen kann [noch?] weggelassen werden)

 /dev=N  Name des zu verwendenden Audio-Gertes (nur bei 'SndInput.exe') 
        Fehlt dieser Parameter, verwendet SndInput.exe das Default-
        Audio-Gert, entsprechend den Einstellungen in der Systemsteuerung.
        Diese Namen knnen unter Windows recht merkwrdig bzw. 
        mehrdeutig sein. Z.B. wurde ein Icom IC-7300 (SDR-Transceiver
        mit der Emulation einer USB-Soundkarte) in der Windows-System-
        Steuerung (in der klassischen Ansicht) als
            "2- USB Audio CODEC" 
        angezeigt (vermutlich, weil ein bereits frher angeschlossener
        IC-7300 ebenfalls als "USB Audio CODEC" erschien).
        Um dieses Gert als Quelle fr das Sound-Input-Utility 
        zu verwenden, wrde man den Kommandozeilenparameter
           /dev="2- USB Audio CODEC"
        verwenden. Wesentlich anwenderfreundlich wre aber das
        Umbenennen des Audiogertes mit der oben gezeigten, 
        nichtssagenden Namen nach z.B. "IC-9700" (bzw. einem
        eindeutigen 'sprechenden' Namen Ihrer Wahl).
        Um zu den "klassische" Audio-Einstellungen unter Windows
        zu gelangen, drcken Sie die Windows-Taste zusammen mit 'R'
        um den 'Run'-Dialog zu ffnen, geben dort mmsys.cpl ein,
        und drcken die ENTER-Taste (bzw. "Ok").
        Es sollte der klassische Dialog mit dem Titel 'Sound'
        erscheinen. Wechseln Sie dort auf die Registerkarte 'Aufnahme'.
        Jedes dort aufgezhlte Gert hat zwei Zeilen mit Namen:
          Der erste oft mit dem nichtssagenden Bezeichnung 'Mikrofon',
          der zweite mit einem ebenfalls nicht eindeutigen Namen
          wie z.B. "Realtek High Definition Audio" oder "USB Audio Codec".
          Nur der erste Name kann unter 'Eigenschaften' gendert werden.
        Nach dem Umbenennen kann das Utility dann z.B. per
          SndInput.exe /dev="IC-9700" /sr=4800 /ch=1
        statt per
          SndInput.exe /dev="2- USB Audio CODEC" /sr=4800 /ch=1
        gestartet werden. Das Utility findet das entsprechende
        Gert auch dann, wenn der komplette von waveInGetDevCaps()
        gelieferte Name nicht "IC-9700" sondern z.B.
          "IC-9700 (2- USB Audio CODEC)"   wre,  aber nur
          /dev="IC-9700" in der Kommandozeile angegeben wird.

 /sr=NNN sample rate
        Abtastrate fr den ADC (d.h. vor der Dezimation).
        bliche Werte sind 5512(5513?), 11025, 22050 oder 44100;
        bei manchen Karten auch 48000 oder gar 96000 samples/Sekunde.
        Defaulteinstellung: /sr=11025

 /dec=NNN Dezimation der Abtastrate (und Bandbreite)
        Optionale Verringerung der Abtastrate in den exportierten Daten.
        Wird im Audio-Bereich auch "Downsampling" genannt,
        beim Tool zur Ansteuerung des DAC's entsprechend "Upsamling".
           Defaulteinstellung:  /dec=1 (d.h. keine Dezimation).
        Programmintern wird dazu eine Kaskaden-Anordnung verwendet,
        bei der jede Stufe aus einem Halbbandfilter oder "Drittel-
        bandfilter" besteht, mit der halben oder drittel Abtast-
        frequenz der vorhergehenden Stufe. Maximal 12 Stufen sind
        mglich, damit kann die Abtastrate des Ausgangs auf 1/(2^12)
        bzw 1/(3^12) der ADC-Abtastrate verringert werden (natrlich
        unter entsprechendem Verlust an Bandbreite).
        Die Flankensteilheit der Halbbandfilter ist etwas besser
        als die der "Drittelbandfilter", darum -wenns geht-
        nur Zweierpotenzen verwenden: NNN=2,4,8,..4096.
        Die theoretische Bandbreite ist sr / (2*dec), praktisch ist
        wegen der begrenzten Flankensteilheit der Anti-Alias-Filter
        aber schon vorher Schlu, darum die Einschrnkung:
        Genaue Amplitudenmessung nur bis f = 0.75 * sr/(2*dec) mglich,
        z.B. /sr=11025 /dec=256 -> Bandbreite ~ 16 Hz .
        Hinweis: Bei schmalbandigen Signalen bietet sich der Export
                 im Fliesskommaformat an, bei Integerzahlen
                 mu -je nach Eingangsspektrum- mit dem Verstrkungs-
                 faktor experimentiert werden um keine Auflsung
                 zu verschenken !
        Defaulteinstellung: /dec=1  (no decimation, input rate = output rate)


 /fc=NN.NNN  center frequency for frequency conversion with COMPLEX output
 /fr=NN.NNN  center frequency for frequency conversion with REAL output
        Optionale Multiplikation des Eingangssignals mit einem
        komplexen Oszillatorsignal ("NCO" mit zwei um 90 phasenver-
        schobenen Ausgngen).
           Defaulteinstellung:  /fc=0
           (d.h. keine Frequenzverschiebung, reell-wertiger Output).
        Nur nutzbar bzw. sinnvoll im Zusammenhang mit der
        Sampleraten-Dezimation ("/dec=NN", NN >= 4 ) .
        Das Ergebnis ist ein komplexes Ausgangssignal (analytisches
        Signal, "I/Q"-Signal).
        Einsatz wenn im EINGANGSSIGNAL nur die Frequenzen in der
        "Nhe" von fc von interessant sind (fc +- bw/2, entsprechend
        der Bandbreite des AUSGANGSSIGNALS).
        Mit der Option "/fc" (komplex), wird ein Mono-Signal am Eingang 
             in ein komplexes Signal mit zwei Komponenten umgewandelt,
             ein "Stereo-Signal" besteht nach der komplexen Multiplikation 
             sogar aus vier Komponenten pro Abtastpunkt:
               I "links",   Q "links",   I "rechts",   Q "rechts".
              (I=in-phase channel, Q=quadrature channel)
          Beispiel fr Frequenzumsetzung mit KOMPLEXEM Ausgangssignal:
          SndInput.exe /sr=11025 /fc=2000 /dec=4
             Audio input = 11025 samples/second, 
             Mittenfrequenz (fc) = 2000 Hz
             Dezimationsverhltnis (dec) = 4
             -> maximale Bandbreite bw = 11025 / 4 = 2756 Hz (COMPLEX!)
             -> Durchlassbereich (Band)= fc +/- bw/2 = 622 Hz .. 3378 Hz
        Die Option "/fr" erzeugt stattdessem REELLE Ausgangswerte,
        bei der gleichen Dezimation entsteht im Vergleich mit der KOMPLEXEN
        Variante nur die halbe Ausgangsbandbreite (aber auch nur das halbe
        Datenvolumen).
          Beispiel fr Frequenzumsetzung mit REELLEM Ausgangssignal:
          SndInput.exe /sr=11025 /fr=2000 /dec=4
             Audio input = 11025 samples/second, 
             Mittenfrequenz (fr) = 2000 Hz
             Dezimationsverhltnis (dec) = 4
             -> maximale Bandbreite bw = 11025 / (4*2) = 1378 Hz
             -> Durchlassbereich (Band)= fr +/- bw/2 = 1310 Hz .. 2689 Hz
        Diese Parameter zeigt auch das Utility an, wenn der "Info"-Button
        angeklickt wird.
        Hinweise:
           -  Die Mittenfrequenz kann whrend der Laufzeit gendert werden,
              durch Eingabe in das Edit-Feld "fc" bzw "fr".
              Die "Betriebsart" kann so allerdings nicht gendert werden ! 
           -  Die Option "/fr" gibt's z.Z. nur fr SoundInput, 
              aber (noch) nicht fr SoundOutput !


 /ch=N  channels
          /ch1 = Ein Kanal,   "mono"
          /ch2 = Zwei Kanle, "stereo".
           Defaulteinstellung:  /dt=1  (d.h. einkanalige Aufnahme)

 /dt=N  data type
        definiert den Grunddatentyp der exportierten Audio-Samples
          1= 8 bit integer  (0..255,  like in 8-bit-WAV-files  )
          2= 16 bit integer (+-32767, like in 16-bit-WAV-files )
          3= 32 bit integer (only rarely supported...)
          4= 64 bit integer (possibly never supported / "reserved for the future")
          5= 32 bit float   ("single precision")
          6= 64 bit float   ("double precision")
        Die 'floating point'-Typen sind erforderlich bei Dezimation,
        denn andernfalls (bei Integer-Typen) wrde der 'decimation gain'
        durch den fehlenden Nachkomma-Anteil z.g.T. verloren gehen.
           Defaulteinstellung:  /dt=2 (d.h. 16-Bit-Integerwerte)


 /gain=NN.NNN  gain (factor!!)
        Alle Samples werden vor dem Abspeichern in einer Datei mit diesem
        optionalen Faktor multipliziert. Nur sinnvoll, wenn z.B. dezimierte
        Samples als Integerwerte abgespeichert werden sollen ohne dass
        zuviel "Auflsung" verloren geht.
           Defaulteinstellung:  /gain=1 (d.h. keine Verstaerkung)
        Achtung: Wenn die exportierten Daten als Integerwerte gespeichert
        werden, kann es bei Faktoren >1 zu einem "Clip-Effekt" kommen,
        d.h. bei 8-Bit-Integer werden Werte <0 und >255 begrenzt.

 /dc_reject=N
        Definiert ob DC-Anteile durch die Software unterdrueckt werden
        sollen (manche Soundkarten liefern einen starken DC-Anteil, z.B.
        Ausgangswert -700 obwohl der Line-In-Eingang nur AC-gekoppelt ist).
           Defaulteinstellung:  /dc_reject=1  (d.h. DC-Unterdrueckung AKTIV)

 /of="<filename>"     output filename   (fuer das Audio-INPUT-Utility)
 /fn="<filename>"     in- or output filename  (fuer ALLE Audio-Utilities)
        z.B. /of="MyAudioStream.dat"
        Der Default-Name fr das Ausgabefile ist "audio.dat" .
        ( Der Name des temporren Files ergibt sich aus dem Ausgabefile,
          mit der Erweiterung ".tmp" ).
        Wenn der Dateiname nicht -wie leider unter Windoze blich-
        durch Leerzeichen zerstckelt ist, knnen die Anfhrungszeichen
        weggelassen werden, z.B. /ofMyAudioStream.dat .
      Position (directory) des Ausgabefiles:
        Wenn ein kompletter Pfad fr das Ausgabefile spezifiziert wird,
        ist eigentlich alles klar, wie in diesem Beispiel:
           C:\CBproj\SoundUtl\SndInput.exe /of=C:\Spectrum\audio.dat /ch=1
        Wird kein Pfad angegeben, wird die Ausgabedatei in das "AKTUELLE"
        Directory geschrieben. Dies ist NICHT NOTWENDIGERWEISE das Ver-
        zeichnis in dem das SoundInput-Tool lokalisiert ist !
        Wenn Sie das Tool wie im folgenden Beispiel aus einem anderen
        "aktuellen" Verzeichnis heraus starten (mit komplettem Pfad zur
        ausfhrbaren Datei)... 
           C:\CBproj\SoundUtl\SndInput.exe /ch=1
         wobei das "aktuelle Verzeichnis" moglicherweise 
           C:\Spectrum\  
         ist, dann wird das von SndInput produzierte File nach
           C:\Spectrum\audio.dat
        geschrieben, denn dies bleibt weiterhin das "aktuelle" Verzeichnis.
        Die Ausgabedatei wird NICHT automatisch in das Verzeichnis von
        SndInput.exe geschrieben ! 


 /chunk=NNNN     audio processing chunk size
        Definiert die "Portionsgre" mit der die Audiodaten vom
        A/D-Wandler abgeholt werden bzw. zum D/A-Wandler gesendet werden.
        Je kleiner dieser Wert, desto geringer ist die Verzgerungszeit
        zwischen Einlesen der Werte und der Ausgabe; damit steigt aller-
        dings auch das Risiko da durch Taskwechsel und andere Unter-
        brechungen mal etwas verloren geht.
           Defaulteinstellung:  /chunk=2048
        Bei schnellen Rechnern funktioniert sogar /chunk=256
        bei 11025 samples/sec, dies macht allerdings wenig Sinn
        weil die Applikation nur alle 100 Millisekunden testet
        ob ein neuer Block aus dem Puffer in eine Datei bertragen
        werden kann (bzw. umgekehrt beim DAC) !


 /minsize=NNNNN  min size of output file
        Definiert die Mindestgre der Ausgabedatei.
        Default:  /minsize=1K
        NNNN ohne Zusatz ist eine Angabe in BYTE,
             mit angehngten "k" oder "K" in KByte (1K = 1024 byte).
        Siehe auch: Hinweise zu "/chunk" !

 /maxsize=NNNNN  max size of output file
        Stellt die maximal zulaessige Groesse der Ausgabedatei
        in BYTE oder KBYTE ein (1 KBYTE = 1024 Byte).
        Default:  /maxsize=64K
        Achtung: Dieser Defaultwert kann bei
                   48000 samples/sec * 2 Kanle * 64-Bit-Floats
                 ETWAS zu niedrig sein, denn dann werden
                 etwa 768 KByte/sec produziert !

 /signed=N
        Definiert ob der externe A/D-Wandler an eine vorzeichen-
        behaftete Quelle angeschlossen ist (mit negativen und
        positiven Spannungen).
        /signed=0 bedeutet "ohne Vorzeichen", Wertebereich  0...32767.
        /signed=1 bedeutet "mit Vorzeichen",  Bereich -32768...+32767.
        (Hinweis: Der A/D-Wandler im PIC12F675 kann nur Spannungen im
               Bereich 0...+5V verarbeiten, "von Natur aus" also nur
               vorzeichenlose Signale. Es knnte allerdings ein OPAMP
               zur Nullpunktverschiebung vorgeschaltet sein. In diesem
               Fall die Option /signed=1 verwenden).
        Defaults: /signed=0 bei SerInput.exe (ADC an COM1, COM2)
                  /signed=1 bei SndInput.exe (Soundcard)

 /show=N  initial window 'show' state
        Definiert wie das Fenster des Utilities beim Programmstart
        dargestellt wird und wer zum "aktuellen" Fenster wird.
          /show=0 :   Minimiertes Fenster, wird nicht aktiviert,
                      d.h. der Aufrufer bleibt aktiv und behaelt
                      den Eingabefokus.
                      Win-API-Funktion ShowWindow(SW_SHOWMINNOACTIVE).
          /show=1 :   Normales Fenster, wird aktiviert.
                      Win-API-Funktion ShowWindow(SW_SHOWNORMAL).
          /show=2 :   Normales Fenster, wird aber nicht aktiviert .
                      Win-API-Funktion ShowWindow(SW_SHOWNA).
         Default: /show=0   (d.h. Fenster wird beim Start minimiert
                                   und *NICHT* aktiviert !)

 /display=N   Definition der im Anzeigefenster des Tools gezeigten Werte
        /display=0    Anzeige der Zeit und Anzahl eingelesener Abtastwerte
        /display=1    Numerische Anzeige der momentanen Abtastwerte
         Default: /display=0

 /testsig=N.NNN  produce test signal
        Erzeugt ein Testsignal (Sinus) mit der angegebenen Frequenz
        in Hertz.
        Dient zum Testen der ununterbrochenen Wiedergabe und zur
        Fehlersuche bei bertragungsproblemen zwischen Einlesen
        und Weiterverarbeitung.
        Beim "Sound Input Tool" wird die Sinusschwingung in die
        produzierte Datei geschrieben, beim "Sound Output Tool"
        direkt in Echtzeit per D/A-Wandler ausgegeben.
        Die Amplitude des Testsignals liegt 6 dB unter der maximalen
        Aussteuerung (+-16384). Das Testsignal wird zu den
        Audiosamples vom A/D-Wandler addiert, darum Vorsicht
        mit bersteuerung !
        Hinweis: Die Frequenz des Testsignals kann whrend der 
              Laufzeit durch Eingabe in ein Editierfeld gendert werden.


 /port=XXXX  define interface port name
        Definiert, ber welchen Port die Daten von einem externen A/D-
        Wandler eingelesen werden sollen.
        Funktioniert nur bei SerInput.exe und hnlichen Tools.
        Beim Einlese-Tool fr die Soundkarte bedeutungslos.
         Default: /port=COM1

 /fs    fool shell
        Sonderoption zum Aufruf des Utilities aus QuickBasic
        (etc) mit dem SHELL-Befehl, der unter Windows XP (etc?)
        wartet, bis das aufgerufene Programm beendet wurde.
        Mit dieser Option kann der SHELL-Befehl ausgetrickst werden.
        Genaue Funktion und Verwendung: Siehe unten, "Programmstart".

 /quit  Dient zum Beenden des Utilities nach Start durch ein anderes
        Programm. Intern sendet die zweite gestartete Instanz eine
        Windows-Message an die erste gestartete Instanz, in der die
        Kommandozeile "durchgereicht" wird. Letztendlich beenden sich
        BEIDE Instanzen dann selbst. 

 Weitere Kommandozeilenparameter sind noch in Vorbereitung,  z.B. :
  - Einsatz des Programms als "normaler Audiorecorder" ohne Zeitlimit



Anzeigefenster
---------------------------------------------------
Dient mehr oder weniger nur zu Testzwecken, denn "eigentlich" soll
das Programm nur still und unauffllig im Hintergrund laufen.
Die im Folgenden aufgefhrten Werte werden daher mglicherweise
in der aktuellen Version nicht mehr angezeigt (sie dienten dann
nur zu Testzwecken fr die Programm-Entwicklung):

"TimerTicks" sollte im 100ms-Takt inkrementiert werden, wenn unkooperative
           Programme dem Utility nicht zuviel Rechenzeit entziehen.
"Samples"  gibt an, wie viele Abtastwerte seit Programmstart vom ADC
           erzeugt wurden, und wie viele davon weiterverarbeitet wurden.
"TempFile" zeigt, wie gro das temporre File (welches irgendwann zum
           Futter fr den Konsumenten wird) schon ist.

Um einige Parameter zu ndern ohne die Echtzeit-Verarbeitung zu stoppen,
dienen die folgenden Editierfelder im Fenster des Utilities:

"fr/Hz" oder "fc/Hz": Editierfeld fr die Mittenfrequenz,
           falls die Frequenzumsetzung aktiv ist.
           Siehe Beschreibung der Kommandos "/fc" bzw "/fr" .
"ft/Hz"    ndert die Frequenz des "Testsignals".
           Siehe Beschreibung des Kommandos "/testsig".


Am rechten Fensterrand werden mehrere Balkendiagramme angezeigt,
darunter ein Puffer-Fllstands-Anzeiger und eine einfache 
Aussteuerungsanzeige.
Der angzeigte Pegel (in PROZENT vom Punkt der bersteuerung) sollte unter
70 % liegen. Andernfalls kann per "Gain"-Button das Programm "sndvol32"
zum Einstellen der Aufnahmepegel gestartet werden.



Info-Fenster
---------------------------------------------------
Zeigt Programmversion, Inhalt der Kommandozeile und ein paar weitere
Parameter an.


Installation
---------------------------------------------------
Sollte nicht ntig sein. Das Programm verwendet nur direkte
WIN-API-Calls und bentigt keine "speziellen" DLLs.


Quelltexte
---------------------------------------------------
Die Quelltexte wurden ursprnglich mit Borland C++Builder V4 compiliert,
sie knnen allerdings -zum grten Teil- auch mit DevCpp V4.9.9.2
compiliert und gelinkt werden (V 4.9.9.2 scheint leider die letzte
Version dieses sehr gut gemachten freien C++-Entwicklungssystems zu sein).
Die Quelltexte der Sound-Utilities sind auf Wunsch beim Autor erhltlich.
Zum Betrieb der Utilities werden sie natrlich nicht bentigt.


Programmstart und Beenden
---------------------------------------------------
Zum Starten entweder aus einem eigenen Programm aufrufen (mit Parametern),
oder eine Verknpfung erstellen in der die Kommandozeile mit enthalten ist.

Es ist auch mglich, das Utility durch einen erneuten Aufruf mit
der Option "/quit" wieder zu beenden.
Fr eine sehr kurze Zeit luft das Programm dann zwar in zwei Instanzen,
die zweite Instanz wird aber sehr schnell die "Anwesenheit" der ersten
Instanz erkennen und reicht dann seine Kommandozeile (mit dem "/quit"-
Befehl) an die erste Instanz weiter, und zwar mit Hilfe einer WM_COPYDATA-
Message.
Letztendlich beenden sich dann beide Instanzen selbsttaetig.



Die "Fool Shell"-Option (/fs)
- - - - - - - - - - - - - - - - - - - - - - - - - -
Beim Aufruf des Programmes aus QuickBasic unter Windoze XP
zeigte sich das Problem, dass das Programm im SHELL-Kommando
"hing", bis das SoundInput-Utility beendet war.
Um dieses Problem zu umgehen, kann
    ALS ERSTER PARAMETER IN DER KOMMANDOZEILE
der Schalter "/fs" stehen (fs wie "fool [the] shell").
Dieser bewirkt, dass das Utility sich selbst nochmal startet, wobei
der Rest der Kommandozeile hinter dem "/fs" an die zweite Instanz
weitergegeben wird. Unmittelbar danach beendet sich die erste
Instanz selbst.
Der SHELL-Befehl kriegt von diesem Betrug nichts mit, und arbeitet
wie gewnscht weiter. Beispiel (Aufruf aus QuickBasic-Programm) :

  SHELL "sndinput.exe /fs /dt=1 /sr=5512 /ch=2 /maxsize=32k"

Das Utility analysiert die Kommandozeile von links nach rechts. Die
"/fs"-Option wird erkannt, und automatisch eine neue Kommandozeile
zusammengesetzt (mit dem kompletten Pfad zum EXE-File und dem Rest der
Kommandozeile):
    c:\QuickBasic\SndInput.exe /dt=1 /sr=5512 /ch=2 /maxsize=32k
Dieses Kommando wird mit Hilfe einer Win32-API-Funktion gestartet,
die -im Gegensatz zum SHELL-Befehl- sofort zurckkehrt.
Die zuerst gestartete Instanz terminiert sich danach sofort selbst,
damit das aufrufende BASIC-Programm (o.ae.) weiterlaeuft.

Mit einer leichten Modifikation konnte die "fool shell"-Option auch
unter Windows 8.1 in der Windows-eigenen Shell ("Konsolenfenster")
wieder 'zum Laufen' gebracht werden, so dass auch der Aufruf aus
'Batch-Dateien' nicht mehr dazu fhrt, dass Windows (8.1 & Co?)
nicht mehr wartet, bis sich das aus dem Batch gestartete Programm
(in diesem Fall SndInout.exe oder SndOutpt.exe) selbst beendet hat.


73 und viel Erfolg bei eigenen Experimenten mit 'DSP per Soundkarte',

 Wolfgang Buescher (DL4YHF@qsl.net) .

