# Framtida arbete

Det här avsnittet beskriver en del av det pågående arbetet med &arts;. Utvecklingen går snabbt framåt, så den här informationen kan vara föråldrad. Du bör kontrollera listfilen TODO och arkiven för e-postlistorna för att ta reda på vilka nya funktioner som planeras. Delta gärna i ny konstruktion och implementering.

Det här är ett utkast som försöker ge dig en översikt av hur nya teknologier kommer att integreras i &arts;. Det täcker följande:

- Hur gränssnitt fungerar.

- Avkodare - avkodning av mp3 eller wav-flöden till en form som gör att de kan användas som data.

- Video.

- Trådning.

- Synkronisering.

- Dynamisk utökning/maskering.

- Dynamisk sammansättning.

- &GUI;

- &MIDI;

Det här är pågående arbete. Det bör dock kunna ge grunden om du vill titta på ny teknologi i &arts;. Det bör ge dig en allmän idé om hur de här problemen kommer att attackeras. Korrigera gärna allt du ser här.

Saker som kommer att använda &arts;-teknologi (så var snäll och koordinera ansträngningarna):

- K-telefon (röst via IP)

- &noatun; (videospelare / ljudspelare)

- &artscontrol; (styrprogram för ljudservern, och för mätare)

- Brahms (musiksequencer)

- Kaiman (&kde;2 mediaspelare - kmedia2-anpassad)

- mpglib/kmpg (mpg ljud- och videouppspelningsteknologi)

- SDL (direktmedialager för spel, som ännu inte påbörjats men som kan vara trevligt)

- Elektriska öron (upphovsmannen kontaktade mig - status okänd)

## Hur gränssnitt fungerar

&MCOP;-gränssnitt är grunden för &arts;-konceptet. De är den nätverkstransparenta motsvarigheten till C++ klasser. Så snart det är möjligt bör du rikta in din konstruktion mot gränssnitt. Ett gränssnitt består av fyra delar:

- Synkrona strömmar

- Asynkrona strömmar

- Metoder

- Egenskaper

De här kan blandas på vilket sätt du vill. Nya teknologier bör definieras med hjälp av gränssnitt. Läs avsnitten om asynkrona strömmar och synkrona strömmar, samt KMedia2-gränssnittet, som är bra exempel på hur sådana saker fungerar.

Gränssnitt specificeras i `.idl`-kod och körs genom `mcopidl`-kompilatorn. Man härleder `Gränssnittsnamn_impl` klassen för att implementera dem, och använder `REGISTER_IMPLEMENTATION (Gränssnittsnamn_impl)` för att infoga en objektimplementering i &MCOP;:s objektsystem.

## Codec, dataavkodning

Kmedia2-gränssnittet låter dig bortse från att wav-filer, mp3-filer eller vad som helst består av dataflöden. Istället implementerar du bara metoder för att spela dem.

På så sätt kan du skriva en vågformsladdningsrutin på ett sätt så att du kan spela vågformsfiler (som PlayObject), men ingen annan kan använda din kod.

Asynkrona strömmar skulle vara alternativet. Man definierar ett gränssnitt som tillåter att datablock skickas in, och hämtas ut. Detta ser ut så här i &MCOP;:

    interface Codec {
      in async byte stream indata;
      out async byte stream outdata;
    };

Avkodare kan förstås också ange egenskaper för att skicka ut ytterligare data, som formatinformation.

    interface ByteAudioCodec {
      in async byte stream indata;
      out async byte stream outdata;
      readonly attribute samplingRate, bits, channels;
    };

Den här ByteAudioCodec kan till exempel anslutas till ett ByteStreamToAudio-objekt, för att skapa riktigt flytande ljud.

Andra typer av avkodare kan förstås innefatta att direkt skicka ut videodata, som

    interface VideoCodec {
      in async byte stream indata;
      out video stream outdata;      /* observera: videoströmmar finns inte ännu */
    };

Troligtvis bör ett avkodningskoncept användas istället för sättet du vet hur det spelas upp med det gör inte jag som till exempel WavPlayObject använder för närvarande. Någon måste dock sätta sig ner och experimentera lite innan ett programmeringsgränssnitt kan definieras.

## Video

Min idé är att tillhandahålla video som asynkrona strömmar för någon inbyggd &MCOP;-datatyp som innehåller bilder. Den här datatypen har inte skapats än. Genom att göra detta, kan insticksprogram som hanterar video kopplas ihop på samma sätt som ljudinsticksprogram.

Det finns några saker som är viktiga att inte utelämna:

- Det finns RGB och YUV färgrymder.

- Formatet bör markeras i strömmen på något sätt.

- Synkronisering är viktig.

Min idé är att lämna möjligheten att ändra implementeringen av `VideoFrame`-klassen öppen, så att den kan lagra grejor i ett delat minnessegment. Genom att göra detta kan till och med videoströmmar mellan olika processer bli möjligt utan alltför mycket problem.

För video är dock den vanliga situationen att alla saker är i samma process, från avkodningen till renderingen.

Jag har gjort en prototypimplementering av videoströmmar, som kan laddas ner härifrån. Det här behöver integreras med &MCOP; efter några experiment.

En rederingskomponent som stöder XMITSHM (med RGB och YUV) bör tillhandahållas. Martin Vogt talade om för mig att han arbetar på en sådan.

## Trådning

För närvarande är &MCOP; helt och hållet en enda tråd. För video kanske vi inte längre kan komma undan trådar. Ok. Det finns några saker som ska hanteras med försiktighet:

- SmartWrappers - de är inte trådsäkra på grund av osäker referensräkning och liknande.

- Avsändaren / I/O - inte heller trådsäkra.

Vad jag i alla fall kan tänka mig är att göra utvalda moduler trådsäkra, för både synkrona och asynkrona strömmar. På det här sättet kan man schemalägga signalflödet på två eller flera processorer, med ett flödessystem som känner till trådar. Det här borde också hjälpa en hel del med ljud med multiprocessorer.

Hur det skulle fungera:

- Flödessystemet bestämmer vilka moduler som ska beräkna vad, dvs:

  - videobilder (med metoden process_indata)

  - synkrona ljudflöden (calculateBlock)

  - andra asynkrona flöden, i huvudsak dataströmmar

- Modulerna kan beräkna de här sakerna i egna trådar. För ljud är det vettigt att återanvända trådar (t.ex. hantera det med fyra trådar om det finns fyra processorer, även om 100 moduler kör). För video- och datauppackning, kan det vara bekvämare att ha en blockerande implementering i en egen tråd, som synkroniseras med resten av &MCOP; med flödessystemet.

- Moduler får inte använda &MCOP;-funktioner (som fjärranrop) medan trådade operationer pågår.

## Synkronisering

Video och &MIDI; (och ljud) kan kräva synkronisering. I grund och botten är det här tidsstämplar. Idén jag har är att bifoga tidsstämplar till de asynkrona strömmarna, genom att lägga till en tidsstämpel till varje paket. Om man skickar två videobilder, görs det helt enkelt som två paket (de är stora ändå), så att man kan ha två olika tidsstämplar.

Ljud ska ha underförstådda tidsstämplar, eftersom det är synkront.

## Dynamisk sammansättning

Det bör vara möjligt att säga: En effekt FX består av de här enklare modulerna. FX bör se ut som en normal &MCOP;-modul (se maskering), men i själva verket bestå av andra moduler.

Det här krävs för aRts-byggaren.

## &GUI;

Alla komponenter i det grafiska gränssnittet kommer att vara &MCOP;-moduler. De bör ha egenskaper som storlek, etikett, färg, ... En RAD-byggare (aRts-byggaren) bör kunna sätta samman dem visuellt.

Det grafiska gränssnittet bör vara möjligt att spara genom att spara egenskaperna.

## &MIDI;

&MIDI;-grejorna kommer att implementeras som asynkrona strömmar. Det finns två alternativ, ett är att använda normala &MCOP;-strukturer för att definiera typerna och det andra är att introducera ytterligare egna typer.

Jag tror att normala strukturer kan räcka till, dvs något som:

    struct MidiEvent {
      byte b1,b2,b3;
      sequence<byte> sysex;
    }

Asynkrona strömmar bör stöda egna flödestyper.