# &arts; programmeringsgränssnitt

## Översikt

aRts är inte enbart ett program, den tillhandahåller också ett antal olika programmeringsgränssnitt (API) för olika syften. I det här avsnittet, försöker jag beskriva "helhetsbilden", en snabb överblick av vad de här gränssnitten är tänkta att användas till, och hur de hänger samman.

Det finns en viktig distinktion som måste göras: De flesta gränssnitten är språk- och platsoberoende eftersom de är specificerade som mcopidl. Det här betyder att man egentligen kan använda den service som de tillhandahåller från vilket språk som helst, implementera dem i vilket språk som helst, och man behöver inte bry sig om ifall man pratar med lokala eller fjärrobjekt. Här är först en lista på dem:

core.idl

  Grundläggande definitioner som bildar grunden i MCOP-funktionen, som själva protokollet, definitioner av objekt, handlaren, flödessystemet och så vidare.

artsflow.idl

  De här innehåller flödessystemet som man använder för att ansluta ljudflöden, definitionen av Arts::SynthModule som är grunden för alla gränssnitt som har strömmar, och till slut några användbara ljudobjekt

kmedia2.idl

  Här definieras Arts::PlayObject, ett objekt som kan spela upp en mediatyp. Mediaspelare som KDE:s mediaspelare noatun kommer att kunna spela upp vilka media som helst som har PlayObject. Därför är det vettigt att implementera PlayObject för olika format (som mp3, mpg video, midi, wav, ...) med det här som grund, och det finns redan många.

soundserver.idl

  Här definieras ett gränssnitt för systemets ljudserver artsd. Gränssnittet benämns Arts::SoundServer, och implementerar funktioner som att ta emot strömmar från nätverket, spela samplingar, skapa andra egna aRts-objekt och så vidare. Nätverkstransparens är underförstådd eftersom MCOP används (som för allt övrigt här).

artsbuilder.idl

  Den här modulen definierar grundläggande flödesfunktioner, dvs. kombinera enklare objekt till mer komplexa genom att definiera en graf som binder samman dem. Den definierar det grundläggande gränssnitten Arts::StructureDesc, Arts::ModuleDesc och Arts::PortDesc som innehåller en beskrivning av en struktur, modul och port. Det finns också ett sätt att skapa ett "levande nätverk av objekt" från de här förbindelserna och värdebeskrivningarna med användning av en fabrik.

artsmidi.idl

  Den här modulen definierar grundläggande midi-funktioner, som objekt som skapar midi-händelser, vad en midi-händelse är, och Arts::MidiManager för att förbinda producenter och konsumenter av midi-händelser, och så vidare. Som alltid är nätverkstransparens underförstådd.

artsmodules.idl

  Här finns diverse ytterligare filter, oscillatorer, ljudeffekter, fördröjningar och så vidare, allt som behövs för riktigt användbar signalbehandling, och för att bygga komplexa instrument och effekter från de här grundläggande byggblocken.

artsgui.idl

  Det här tar hand om synliga objekt. Det definierar den grundläggande typen Arts::Widget som alla moduler med ett grafiskt gränssnitt utgår från. Det här åstadkommer oberoende av verktygslåda, och ... visuell redigering av det grafiska gränssnittet, och möjlighet att serialisera grafiska gränssnitt. Dessutom, eftersom de grafiska komponenterna har normala egenskaper, kan deras värden på ett rättframt sätt anslutas till vissa signalbehandlingsmoduler. (dvs. värdet av ett skjutreglage till klippning för ett filter). Som alltid, nätverkstransparent.

Där det är möjligt implementeras aRts själv med IDL. Å andra sidan finns det några språkspecifika programmeringsgränssnitt, som antingen använder enkel C++ eller C. Det är ofta förnuftigt att använda IDL-gränssnitt om möjligt, och de övriga gränssnitten när det är nödvändigt. Här är en lista på språkspecifika programmeringsgränssnitt:

KNotify, KAudioPlayer (ingår i libkdecore)

  De här är KDE:s programmeringsgränssnitt för bekvämlighet med de enkla och väldigt vanliga fall, när man bara vill spela upp en sampling. Gränssnitten är enkel C++, Qt/KDE-optimerade, och så enkla som de kan vara.

libartsc

  Enkelt C-gränssnitt för ljudservern. Mycket användbart för att anpassa gamla program.

libmcop

  Här sker all magi som har med MCOP att göra. Biblioteket innehåller de grundläggande saker som behövs för att skriva ett enkelt MCOP-program, avsändaren, tidtagning, I/O-hantering, men också de interna funktioner som behövs för att själva MCOP-protokollet ska fungera.

libartsflow

  Förutom implementeringen av artsflow.idl, några användbara verktyg för konvertering av samplingsfrekvens.

libqiomanager

  Integration av MCOP i Qt:s händelsesnurra, när man skriver Qt-program som använder MCOP.

## knotify

Ännu inte skrivet.

## kaudioplayer

Ännu inte skrivet.

## libkmid

Ännu inte skrivet.

## kmedia2

Ännu inte skrivet.

## ljudserver

Ännu inte skrivet.

## artsflow

Ännu inte skrivet.

## C API

### Inledning

C-gränssnittet för &arts; skapades för att göra det lätt att skriva och anpassa enkla C-program till &arts; ljudserver. Det tillhandahåller flödesfunktioner (att skicka samplingsströmmar till artsd), antingen med eller utan blockering. För de flesta program tar man helt enkelt bort de få systemanrop som hanterar ljudenheten och byter ut dem mot lämpliga anrop till &arts;.

Jag gjorde två anpassningar för att verifiera idén: mpg123 och quake. Du kan skaffa programfixarna härifrån. Bidra gärna med dina egna programfixar till underhållaren av &arts; eller till programvarupaket för multimedia så att de kan integrera stöd för &arts; i sin kod.

### Snabbtur

Att skicka ljud till ljudservern med gränssnittet är mycket enkelt:

- infoga deklarationsfilen med `#include <artsc.h>`

- initiera gränssnittet med `arts_init()`

- skapa en ström med `arts_play_stream()`

- anpassa särskilda parametrar med `arts_stream_set()`

- skriva samplingsdata till strömmen med `arts_write()`

- stänga strömmen med `arts_close_stream()`

- frigöra gränssnittet med `arts_free()`

Här är ett exempel på ett litet program som visar det här:

    #include <stdio.h>
    #include <artsc.h>
    int main()
    {
        arts_stream_t stream;
        char buffer[8192];
        int bytes;
        int errorcode;

        errorcode = arts_init();
        if (errorcode < 0)
        {
            fprintf(stderr, "arts_init fel: %s\n", arts_error_text(errorcode));
            return 1;
        }

        stream = arts_play_stream(44100, 16, 2, "artsctest");

        while((bytes = fread(buffer, 1, 8192, stdin)) > 0)
        {
            errorcode = arts_write(stream, buffer, bytes);
            if(errorcode < 0)
            {
                fprintf(stderr, "arts_write fel: %s\n", arts_error_text(errorcode));
                return 1;
            }
        }

        arts_close_stream(stream);
        arts_free();

        return 0;
    }

### Att kompilera och länka: artsc-config

För att lätt kunna kompilera och länka program med &arts; C-gränssnitt, finns verktyget artsc-config som känner till vilka bibliotek som man måste länka med och var deklarationsfilerna finns. Det anropas med

    artsc-config --libs

för att ta reda på biblioteken och

    artsc-config --cflags

för att ta reda på ytterligare C-kompilatorväljare. Exemplet ovan skulle ha kunnat kompileras med kommandoraden:

    cc -o artsctest artsctest.c `artsc-config --cflags` `artsc-config --libs`

    cc -o artsctest artsctest.c `artsc-config --cflags` `artsc-config --libs`

### Biblioteksreferens

[ATT GÖRA: skapa dokumentation för artsc.h med kdoc]