TABLE OF CONTENTS

maestix.library/AllocMaestro
maestix.library/FlushReceive
maestix.library/FlushTransmit
maestix.library/FreeMaestro
maestix.library/GetStatus
maestix.library/ReadPostLevel
maestix.library/ReceiveData
maestix.library/SetMaestro
maestix.library/StartRealtime
maestix.library/StopRealtime
maestix.library/TransmitData
maestix.library/UpdateRealtime

maestix.library/AllocMaestro                     maestix.library/AllocMaestro

   NAME
        AllocMaestro -- Allokiert die Maestro-Soundkarte (V35)

   SYNOPSIS
        MaestroBase = AllocMaestro(Tags)
            D0.l                   A0.l

        struct MaestroBase *AllocMaestro(struct TagItem *);

        MaestroBase = AllocMaestroTags(Tag1, ...)

        struct MaestroBase *AllocMaestroTags(ULONG, ...);

   FUNCTION
        Diese Funktion belegt die Maestro-Soundkarte und gewährt dem
        Klient den alleinigen Zugriff.

        Die Karte muß als erstes allokiert werden, bevor sie angesprochen
        werden darf.

        Der Grundzustand nach AllocMaestro() ist:

                Input ist INPUT_STD,
                Output ist OUTPUT_BYPASS,
                Studio-Modus ist abgeschaltet,
                Copy-Protection ist aus,
                Emphasis ist aus,
                Quell-Kategorie ist DAT,
                Rate ist 48kHz,
                Validity ist gesetzt,
                die UDBs sind zurückgesetzt.

   INPUTS
        Tags -- Reserviert für zukünftige Optionen.
                Momentan soll immer NULL oder ein Zeiger auf TAG_DONE
                übergeben.

   RESULTS
        MaestroBase -- Zeiger auf die MaestroBase-Struktur (privat)
                oder NULL, wenn die Karte bereits belegt wurde, nicht
                vorhanden ist oder der Speicher nicht ausreichte.

   NOTES
        Diese Funktion darf nur aus einem DOS-Prozeß aufgerufen werden.

   SEE ALSO
        FreeMaestro()

   BUGS
        Leider kann nicht verhindert werden, daß eines der MacroSystem-
        Programme (also MaestroBR und Samplitude) die Karte nach einem
        AllocMaestro() immer noch belegen können.

        Diese Funktion versucht zwar auch herauszubekommen, ob ein solches
        Programm die Karte bereits belegt hat, und verhindert dann
        seinerseits die Belegung. Der Versuch ist allerdings nicht immer
        erfolgreich! Seit V37 wurde dieser Test wieder entfernt, da er
        bei älteren Maestros manchmal ungerechtfertigt fehlschlug. Die
        Programme AllocMstx und FreeMstx lösen das Problem.

        Seit V41 wurde der Test wieder eingebaut, da es sich bei der äl-
        teren MaestroPro tatsächlich um eine falsch bestückte Karte han-
        delte.

maestix.library/FlushReceive                     maestix.library/FlushReceive

   NAME
        FlushReceive -- Stoppt Empfang und gibt Msg zurück (V36)

   SYNOPSIS
        FlushReceive(MaestroBase)
                         A0.l

        VOID FlushReceive(struct MaestroBase *);

   FUNCTION
        Der Empfangsvorgang wird gestoppt.

        Alle durch ReceiveData() an die Maestix gesendeten Nachrichten
        werden zurückgesendet.

   INPUTS
        MaestroBase -- Zeiger auf die MaestroBase-Struktur von
                AllocMaestro().

   RESULTS

   NOTES

   SEE ALSO
        FlushTransmit(), ReceiveData()

   BUGS

maestix.library/FlushTransmit                   maestix.library/FlushTransmit

   NAME
        FlushTransmit -- Stoppt Sendung und gibt Msg zurück (V36)

   SYNOPSIS
        FlushTransmit(MaestroBase)
                          A0.l

        VOID FlushTransmit(struct MaestroBase *);

   FUNCTION
        Der Sendevorgang wird gestoppt.

        Alle durch TransmitData() an die Maestix gesendeten Nachrichten
        werden zurückgesendet.

   INPUTS
        MaestroBase -- Zeiger auf die MaestroBase-Struktur von
                AllocMaestro().

   RESULTS

   NOTES

   SEE ALSO
        FlushReceive(), TransmitData()

   BUGS

maestix.library/FreeMaestro                       maestix.library/FreeMaestro

   NAME
        FreeMaestro -- Gibt die Maestro-Soundkarte frei (V35)

   SYNOPSIS
        FreeMaestro(MaestroBase)
                        A0.l

        VOID FreeMaestro(struct MaestroBase *);

   FUNCTION
        Nach dem Gebrauch muß der Klient die belegte Karte wieder
        freigeben. Das geschieht durch diese Funktion.

        Alle an Maestix gesendete Nachrichten werden zurückgesendet.
        Die FIFOs werden gelöscht, die Karte wird zurückgesetzt und
        geht in den Bypass-Modus über.

   INPUTS
        MaestroBase -- Zeiger auf die MaestroBase-Struktur von
                AllocMaestro().

   RESULTS

   NOTES
        Diese Funktion darf nur aus einem DOS-Prozeß aufgerufen werden.

   SEE ALSO
        AllocMaestro()

   BUGS

maestix.library/GetStatus                           maestix.library/GetStatus

   NAME
        GetStatus -- Gibt den Kartenstatus zurück (V35)

   SYNOPSIS
        Status = GetStatus(MaestroBase,Info-Typ)
         D0.l                  A0.l      D0.l

        ULONG GetStatus(struct MaestroBase *,ULONG);

   FUNCTION
        Der Zustand vom gewünschten Info-Typ wird zurückgegeben.

   INPUTS
        MaestroBase -- Zeiger auf die MaestroBase-Struktur von
                AllocMaestro().
        Info-Typ -- Typ-Code (MSTAT_...), dessen Wert
                zurückgegeben werden soll.

   RESULTS
        Status -- Status des entsprechenden Typs.

   NOTES
        Es existieren folgende Info-Typen:

        MSTAT_TFIFO -- (ULONG) Zustand der Transmitter-FIFO
                         - FIFO_Off     -> Transmitter ist aus
                         - FIFO_Running -> Übertragung läuft
                         - FIFO_Error   -> seit der letzten Abfrage
                                           trat ein Fehler auf

        MSTAT_RFIFO -- (ULONG) Zustand der Receiver-FIFO
                         - FIFO_Off     -> Receiver ist aus
                         - FIFO_Running -> Übertragung läuft
                         - FIFO_Error   -> seit der letzten Abfrage
                                           trat ein Fehler auf

        MSTAT_Signal -- (BOOL) prüft, ob ein Signal am gewünschten INPUT
                        anliegt.

        MSTAT_Emphasis -- (BOOL) gibt an, ob das Eingangssignal mit Emphasis
                        aufgenommen wurde.

        MSTAT_DATsrc -- (BOOL) gibt an, ob die Datenquelle ein DAT- bzw.
                        DCC-Recorder ist.

        MSTAT_CopyProh -- (BOOL) zeigt, ob ein Urheberrechtschutz vom
                        Quellsignal gewünscht wird. Ob es sich aber
                        bereits um eine Kopie handelt, läßt sich nicht
                        feststellen.

        MSTAT_Rate -- (ULONG) gibt die Rate am Eingang an.

        MSTAT_UDB -- (UBYTE) [V37] gibt die aktuellen UDBs zurück.

   SEE ALSO

   BUGS
maestix.library/ReadPostLevel                   maestix.library/ReadPostLevel

   NAME
        ReadPostLevel -- Liest die Aussteuerung hinter dem RealtimeFX (V41)

   SYNOPSIS
        level = ReadPostLevel(MaestroBase, Tags)
        D0.l                     A0.l      A1.l

        ULONG ReadPostLevel(struct MaestroBase *, struct TagItem *);

        level = ReadPostLevelTags(MaestroBase, Tag1, ...)

        ULONG ReadPostLevelTags(struct MaestroBase *, ULONG, ...);

   FUNCTION
        Mit dieser Funktion wird der Betrag der maximalen Amplitude seit
        dem letzten Aufruf zurückgegeben. Der Wert wird hinter dem
        Echtzeit-Effekt abgegriffen.

        Das LevelMeter muß vorher in StartRealtime() mit
        MTAG_PostLevel,TRUE aktiviert werden.

   INPUTS
        MaestroBase -- Zeiger auf die MaestroBase-Struktur von
                        AllocMaestro().
        Tags        -- Tags. Momentan NULL oder ein Zeiger auf TAG_DONE

   RESULTS
        level  -- Das Aussteuerungsniveau beider Kanäle, und zwar nach der
                Formel (rechts<<16)+links . Der Bereich ist jeweils 0..32768.

   NOTES

   SEE ALSO
        StartRealtime()

   BUGS
maestix.library/ReceiveData                       maestix.library/ReceiveData

   NAME
        ReceiveData -- Empfängt Daten in eine Message (V35)

   SYNOPSIS
        ReceiveData(MaestroBase, DataMessage)
                       A0.l         A1.l

        VOID ReceiveData(struct MaestroBase *, struct DataMessage *);

   FUNCTION
        Dies ist die Funktion zur Übertragung von Daten durch die Maestro.

        Der Platz für die eingehenden Daten wird in einer normalen
        System-Message zur Verfügung gestellt. Diese Message muß einen
        Zeiger auf den Reply-Port vom Klienten haben. Außerdem wird in
        der Message ein Zeiger auf den zu füllenden Puffer sowie dessen
        Länge übergeben.

        Diese Message wird nun in die Eingangs-Queue eingehängt. Sollte
        der Empfangsvorgang noch nicht gestartet worden sein, geschieht
        dies danach.

        Wenn der Datenpuffer durch die eingehenden Daten gefüllt wurde,
        wird die Message an den Klienten replyed. Er kann nun die Daten
        bearbeiten und anschließend die Message erneut absenden.

        Sollten die Messages ausbleiben, wird der Einlesevorgang
        abgebrochen, wenn die Receive-FIFO überläuft.

        Über die ExtDataMessage-Struktur können folgende Flags übergeben
        werden:

           EDMNF_MONO   Der Puffer wird mit Mono-Daten gefüllt. Der
                        linke und rechte Kanal werden hierfür zusammen-
                        gemischt.

           EDMNF_DUAL   Der linke und rechte Kanal wird in getrennten
                        Puffern abgelegt. Auf den rechten Kanal zeigt
                        edmn_BufPtrR.

   INPUTS
        MaestroBase -- Zeiger auf die MaestroBase-Struktur von
                        AllocMaestro().
        DataMessage -- Zeiger auf eine DataMessageNode mit einem Zeiger
                        auf den Datenpuffer für die eingehenden Daten.
                        Seit V40 kann auch die ExtDataMessage-Struktur
                        übertragen werden.

   RESULTS

   NOTES
        Das mn_Length-Feld muß unbedingt korrekt initialisiert werden!

        Der Datenpuffer muß Public Memory sein und an einer durch 4
        teilbaren Adresse beginnen. Bis V40.00 (einschließlich) muß
        die Puffergröße durch 1024 teilbar sein. Diese Grenze ist jetzt
        entfernt worden.

        Vorher sollte ein evtl. laufender Realtime-Effekt gestoppt
        werden.

   SEE ALSO
        TransmitData(), FlushReceive(), StopRealtime()

   BUGS
maestix.library/SetMaestro                         maestix.library/SetMaestro

   NAME
        SetMaestro -- Stellt die Maestro-Parameter ein (V35)

   SYNOPSIS
        SetMaestro(MaestroBase, Tags)
                       A0.l     A1.l

        VOID SetMaestro(struct MaestroBase *, struct TagItem *);

        SetMaestroTags(MaestroBase, Tag1, ...)

        VOID SetMaestroTags(struct MaestroBase *, ULONG, ...);

   FUNCTION
        Die Kartenparameter werden verändert. Hierzu werden der
        Funktion Tags übergeben.

   INPUTS
        MaestroBase -- Zeiger auf die MaestroBase-Struktur von
                        AllocMaestro().
        Tags -- Tags, die die Einstellungen angeben.

   RESULTS

   TAGS
        MTAG_Input -- (ULONG) gibt den Eingang an, den die Maestro
                        verwenden soll. Default ist INPUT_STD, was
                        den vom User gewählten Standard-Eingang verwendet.
                        Mit INPUT_OPTICAL und INPUT_COAXIAL kann auch
                        gezielt ein Eingang ausgewählt werden.
                        INPUT_SRC48K wählt eine interne Quelle, welche
                        konstant einen 48kHz-Referenztakt liefert,
                        unabhängig vom Eingangssignal.

        MTAG_Output -- (ULONG) gibt an, welches Signal am Ausgang vorliegt.
                        Default ist OUTPUT_BYPASS, womit das am
                        gewählten Eingang anliegende Signal direkt zum
                        Ausgang weitergeleitet wird. OUTPUT_INPUT gibt
                        das vom Encoder codierte Eingangssignal am
                        Ausgang aus. So können gezielt UDBs und CSBs
                        geändert werden. Mit OUTPUT_FIFO wird das Signal
                        von der Transmit-FIFO an den Ausgang gelegt.

        MTAG_SetCSB -- (ULONG) Die angegebenen 32 Bit werden als
                        Channel Status Bits durch den Encoder ausgegeben.
                        Dieses Tag sollte nur in Ausnahmefällen verwendet
                        werden!

        MTAG_SetUDB -- (ULONG) Die angegebenen 32 Bit werden als
                        User Data Bits durch den Encoder ausgegeben.

        MTAG_Studio -- (BOOL) Ist dieses Tag TRUE, wird in den
                        Studio-Modus geschaltet und die CSBs entsprechend
                        dieser Norm kodiert. Im Heimbereich sollte dieser
                        Modus immer FALSE sein (default).

        MTAG_CopyProh -- (ULONG) gibt an, ob ein Kopieschutz verwendet
                        werden soll. Default ist CPROH_OFF, was einen
                        Kopierschutz abschaltet. CPROH_ON aktiviert
                        den Kopierschutz und erlaubt noch eine digitale
                        Kopie der Ausgangssignals. CPROH_PROHIBIT
                        sperrt eine digitale Aufnahmemöglichkeit.
                        CPROH_INPUT schaltet den Kopierschutz entsprechend
                        dem Eingangssignal aus oder ein.

        MTAG_Emphasis -- (ULONG) gibt die Emphasis des Ausgangssignals
                        an. Default ist EMPH_OFF, was keine Emphasis
                        angibt. Standard ist EMPH_50us ( = EMPH_ON);
                        im Studio-Modus steht außerdem noch EMPH_CCITT
                        und EMPH_MANUAL zur Verfügung. EMPH_INPUT
                        wählt die Emphasis entsprechend dem Eingangssignal.

        MTAG_Source -- (ULONG) gibt den Quellen-Kategoriecode an.
                        Default ist SRC_DAT, außerdem sind SRC_CD,
                        SRC_DSR, SRC_ADCONV und SRC_INSTR angegeben.
                        Mit SRC_INPUT wird gemäß dem Eingangssignal
                        zwischen SRC_DAT und SRC_CD umgeschaltet.

        MTAG_Rate -- (ULONG) gibt die Datenrate an. Default ist
                        RATE_48000, ansonsten existieren RATE_44100,
                        RATE_32000 und RATE_48000MANU. RATE_INPUT
                        wählt die Rate gemäß dem Eingangssignal.

        MTAG_Validity -- (BOOL) gibt die Gültigkeit des ausgehenden
                        Signals an. Ist dieses Tag FALSE, sind die
                        Daten ungültig, was von vielen Endgeräten
                        erkannt wird.

        MTAG_ResetUDB -- Wenn dieses Tag angegeben wird, wird die UDB-
                        Information gelöscht und eine Ausgabe der
                        UDBs unterbunden.

        MTAG_ResetLSA -- [V37] Wenn dieses Tag angegeben wird, wird die
                        Local-Sample-Address gelöscht. Diese findet in
                        der Übertragung im Studio-Format verwendung.

   NOTES
        Beachten Sie, daß MTAG_Rate lediglich in das Ausgabesignal
        verwoben wird, jedoch keine Rate auf der Maestro einstellt.

        Die Maestro ist lediglich in der Lage, eine 48kHz-Rate zu erzeugen
        (INPUT_SRC48K). Davon abweichende Raten müssen am ausgewählten
        Eingang angelegt werden.

        Stimmt die MTAG_Rate nicht mit dem tatsächlichen Takt überein,
        kann das Signal in der Regel vom Empfänger nicht bearbeitet
        werden.

        Ein DAT-Delay wird eingelegt, wenn durch MSTAG_Input und/oder
        MSTAG_Output ein Ein- bzw. Ausgang gewechselt wird. Beachten Sie
        hier, daß die Wartezeit theoretisch bis zu 30 Sekunden dauern kann!

   SEE ALSO

   BUGS

maestix.library/StartRealtime                   maestix.library/StartRealtime

   NAME
        StartRealtime -- Startet einen Realtime-Effekt (V38)

   SYNOPSIS
        StartRealtime(MaestroBase, Tags)
                         A0.l      A1.l

        VOID StartRealtime(struct MaestroBase *, struct TagItem *);

        StartRealtimeTags(MaestroBase, Tag1, ...)

        VOID StartRealtimeTags(struct MaestroBase *, ULONG, ...);

   FUNCTION
        Ein Realtime-Effekt wird gestartet. Vorher sollte durch SetMaestro()
        der entsprechende Eingang ausgewählt und OUTPUT_FIFO eingestellt
        werden.

   INPUTS
        MaestroBase -- Zeiger auf die MaestroBase-Struktur von
                        AllocMaestro().
        Tags -- Tags, die die Effektparameter angeben.

   RESULTS

   TAGS
        MTAG_Effect -- (ULONG) Wählt einen eingebauten Effekt aus (default:
                        RFX_Bypass). Effekte siehe Includedatei.
        MTAG_A0 -- (APTR) Parameter für die Effekte
        MTAG_A1 -- (APTR) Parameter für die Effekte
        MTAG_D2 -- (ULONG) Parameter für die Effekte
        MTAG_D3 -- (ULONG) Parameter für die Effekte
        MTAG_CustomCall -- (APTR) Dieses Tag signalisiert, daß eine eigene
                Effekt-Routine verwendet werden soll. Übergeben wird durch
                dieses Tag ein Zeiger auf diese Routine.
        MTAG_PostLevel -- (BOOL) [V41] Ein TRUE schaltet die Aussteuerungs-
                messung hinter dem Realtime-Effekt ein. Der Rechenaufwand
                erhöht sich dadurch. Default ist FALSE.


   NOTES
        Die eigene Effekt-Routine bekommt folgende Parameter übergeben:

                -> D0 -- (WORD) linkes Datenwort
                -> D1 -- (WORD) rechtes Datenwort
                -> D2 -- (ULONG) siehe MTAG_D2
                -> D3 -- (ULONG) siehe MTAG_D3
                -> D6 -- (ULONG) Scratch-Register
                -> D7 -- (ULONG) Scratch-Register
                -> A0 -- (ULONG) siehe MTAG_A0
                -> A1 -- (ULONG) siehe MTAG_A1
                -> A2 -- (APTR) Rücksprungadresse

        Die Routine liefert:

                <- D0 -- (WORD) neues linkes Datenwort
                <- D1 -- (WORD) neues rechtes Datenwort

        Die Register D2 bis D5 und A0 bis A7 dürfen nicht verändert werden.

        Der Rücksprung aus der Effekt-Routine erfolgt mit "JMP (A2)", und
        nicht etwa mit RTS!

        Die Effekt-Routine muß im MEMF_PUBLIC-Bereich stehen! Zu beachten
        ist hier, daß ein Task nicht unbedingt im MEMF_PUBLIC-Bereich
        gestartet wird! Die Routine sollte außerdem in hochoptimiertem
        Assemblercode geschrieben sein.

        Wenn die Effektroutine zu viel Rechenzeit beansprucht, stoppt die
        Realtime-Funktion automatisch, und MSTAT_TFIFO sowie MSTAT_RFIFO
        melden FIFO_Error.

   SEE ALSO
        StopRealtime(), UpdateRealtime()

   BUGS
maestix.library/StopRealtime                     maestix.library/StopRealtime

   NAME
        StopRealtime -- Stoppt den Realtime-Effekt (V38)

   SYNOPSIS
        StopRealtime (MaestroBase)
                          A0.l

        VOID StopRealtime (struct MaestroBase *);

   FUNCTION
        Ein zuvor gestarteter Realtime-Effekt wird durch diese Funktion
        wieder gestoppt.

   INPUTS
        MaestroBase -- Zeiger auf die MaestroBase-Struktur von
                        AllocMaestro().

   RESULTS

   NOTES
        Vor einem TransmitData() oder ReceiveData() muß ein eventuell
        laufender Realtime-Effekt durch diese Funktion gestoppt werden.

   SEE ALSO
        StartRealtime(), UpdateRealtime()

   BUGS
maestix.library/TransmitData                     maestix.library/TransmitData

   NAME
        TransmitData -- Überträgt Daten in einer Message (V35)

   SYNOPSIS
        TransmitData(MaestroBase, DataMessage)
                        A0.l          A1.l

        VOID TransmitData(struct MaestroBase *, struct DataMessage *)

   FUNCTION
        Dies ist die Funktion zur Übertragung von Daten durch die Maestro.

        Die abgehenden Daten werden durch eine normale System-Message
        zur Verfügung gestellt. Diese Message muß einen Zeiger auf den
        Reply-Port vom Klienten haben. Außerdem wird in der Message ein
        Zeiger auf den auszugebenden Puffer sowie dessen Länge übergeben.

        Diese Message wird nun in die Ausgabe-Queue eingehängt. Sollte
        die Ausgabe noch nicht gestartet worden sein, geschieht dies
        danach.

        Wenn die Daten ausgegeben wurden, wird die Message an den Klienten
        replyed. Er kann den Pufferbereich nun mit neuen Daten füllen und
        erneut absenden.

        Sollten die Messages ausbleiben, wird die Ausgabe abgebrochen,
        sobald die Transmit FIFO vollständig geleert wurde.

        Über die ExtDataMessage-Struktur können folgende Flags übergeben
        werden:

           EDMNF_MONO   Der Puffer enthält Mono-Daten. Dieser Modus benötigt
                        viel Prozessorzeit und sollte daher nach Möglichkeit
                        vermieden werden.

           EDMNF_DUAL   Der linke und rechte Kanal wird in getrennten
                        Puffern abgelegt. Auf den rechten Kanal zeigt
                        edmn_BufPtrR.

   INPUTS
        MaestroBase -- Zeiger auf die MaestroBase-Struktur von
                        AllocMaestro().
        Message -- Zeiger auf eine DataMessageNode mit den auszugebenden
                        Daten. Seit V40 kann auch die ExtDataMessage-
                        Struktur übertragen werden.

   RESULTS

   NOTES
        Das mn_Length-Feld muß unbedingt korrekt initialisiert werden!

        Der Datenpuffer muß Public Memory sein und an einer durch 4
        teilbaren Adresse beginnen. Bis V40.00 (einschließlich) muß
        die Puffergröße durch 1024 teilbar sein. Diese Grenze ist jetzt
        entfernt worden.

        Vorher sollte ein evtl. laufender Realtime-Effekt gestoppt werden.

   SEE ALSO
        ReceiveData(), FlushTransmit(), StopRealtime()

   BUGS
maestix.library/UpdateRealtime                 maestix.library/UpdateRealtime

   NAME
        UpdateRealtime -- Ändert Realtime-Parameter zur Laufzeit [V41]

   SYNOPSIS
        UpdateRealtime (MaestroBase, Tags)
                           A0.l      A1.l

        VOID UpdateRealtime (struct MaestroBase *, struct TagItem *);

        UpdateRealtimeTags (MaestroBase, Tag1, ...)

        VOID UpdateRealtimeTags (struct MaestroBase *, ULONG, ...);

   FUNCTION
        Die Parameter eines laufenden Realtime-Effekts werden verändert.
        Die Werte der nicht übergebenen Tags bleiben unverändert.

   INPUTS
        MaestroBase -- Zeiger auf die MaestroBase-Struktur von
                        AllocMaestro().
        Tags -- Tags, die die Effektparameter angeben.

   RESULTS

   TAGS
        MTAG_A0 -- (APTR) Neue Parameter für die Effekte
        MTAG_A1 -- (APTR) Neue Parameter für die Effekte
        MTAG_D2 -- (ULONG) Neue Parameter für die Effekte
        MTAG_D3 -- (ULONG) Neue Parameter für die Effekte

   NOTES
        Der Effekt selbst kann jedoch nicht gewechselt werden. Vorsicht beim
        Wechseln von Zeigern auf Strukturen: die Änderungen treten sofort in
        Kraft!

   SEE ALSO
        StartRealtime(), StopRealtime()

   BUGS

