1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
|
<!-- <?xml version="1.0" ?>
<!DOCTYPE chapter PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd">
To validate or process this file as a standalone document, uncomment
this prolog. Be sure to comment it out again when you are done -->
<chapter id="arts-apis">
<title>&arts; programmeringsgränssnitt</title>
<sect1 id="api-overview">
<title>Översikt</title>
<para>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. </para>
<para>Det finns en viktig distinktion som måste göras: De flesta gränssnitten är <emphasis> språk- och platsoberoende</emphasis> eftersom de är specificerade som <emphasis>mcopidl</emphasis>. 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: </para>
<variablelist>
<varlistentry>
<term>core.idl</term>
<listitem><para>Grundläggande definitioner som bildar grunden i MCOP-funktionen, som själva protokollet, definitioner av objekt, handlaren, flödessystemet och så vidare. </para></listitem>
</varlistentry>
<varlistentry>
<term>artsflow.idl</term>
<listitem><para>De här innehåller flödessystemet som man använder för att ansluta ljudflöden, definitionen av <emphasis>Arts::SynthModule</emphasis> som är grunden för alla gränssnitt som har strömmar, och till slut några användbara ljudobjekt </para></listitem>
</varlistentry>
<varlistentry>
<term>kmedia2.idl</term>
<listitem><para>Här definieras <emphasis>Arts::PlayObject</emphasis>, 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. </para></listitem>
</varlistentry>
<varlistentry>
<term>soundserver.idl</term>
<listitem><para>Här definieras ett gränssnitt för systemets ljudserver artsd. Gränssnittet benämns <emphasis>Arts::SoundServer</emphasis>, 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). </para></listitem>
</varlistentry>
<varlistentry>
<term>artsbuilder.idl</term>
<listitem><para>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 <emphasis>Arts::StructureDesc</emphasis>, <emphasis>Arts::ModuleDesc</emphasis> och <emphasis>Arts::PortDesc</emphasis> 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. </para></listitem>
</varlistentry>
<varlistentry>
<term>artsmidi.idl</term>
<listitem><para>Den här modulen definierar grundläggande midi-funktioner, som objekt som skapar midi-händelser, vad en midi-händelse är, och <emphasis>Arts::MidiManager</emphasis> för att förbinda producenter och konsumenter av midi-händelser, och så vidare. Som alltid är nätverkstransparens underförstådd. </para></listitem>
</varlistentry>
<varlistentry>
<term>artsmodules.idl</term>
<listitem><para>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. </para></listitem>
</varlistentry>
<varlistentry>
<term>artsgui.idl</term>
<listitem><para>Det här tar hand om synliga objekt. Det definierar den grundläggande typen <emphasis> Arts::Widget</emphasis> 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. </para></listitem>
</varlistentry>
</variablelist>
<para>Där det är möjligt implementeras aRts själv med IDL. Å andra sidan finns det några <emphasis>språkspecifika</emphasis> 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: </para>
<variablelist>
<varlistentry>
<term>KNotify, KAudioPlayer (ingår i libtdecore)</term>
<listitem><para>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. </para></listitem>
</varlistentry>
<varlistentry>
<term>libartsc</term>
<listitem><para>Enkelt C-gränssnitt för ljudservern. Mycket användbart för att anpassa gamla program. </para></listitem>
</varlistentry>
<varlistentry>
<term>libmcop</term>
<listitem><para>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. </para></listitem>
</varlistentry>
<varlistentry>
<term>libartsflow</term>
<listitem><para>Förutom implementeringen av artsflow.idl, några användbara verktyg för konvertering av samplingsfrekvens. </para></listitem>
</varlistentry>
<varlistentry>
<term>libqiomanager</term>
<listitem><para>Integration av MCOP i Qt:s händelsesnurra, när man skriver Qt-program som använder MCOP. </para></listitem>
</varlistentry>
</variablelist>
</sect1>
<sect1 id="knotify">
<title>knotify</title>
<para>Ännu inte skrivet. </para>
</sect1>
<sect1 id="kaudioplayer">
<title>kaudioplayer</title>
<para>Ännu inte skrivet. </para>
</sect1>
<sect1 id="libkmid">
<title>libkmid</title>
<para>Ännu inte skrivet. </para>
</sect1>
<sect1 id="kmedia2">
<title>kmedia2</title>
<para>Ännu inte skrivet. </para>
</sect1>
<sect1 id="soundserver">
<title>ljudserver</title>
<para>Ännu inte skrivet. </para>
</sect1>
<sect1 id="artsflow">
<title>artsflow</title>
<para>Ännu inte skrivet. </para>
</sect1>
<sect1 id="capi">
<title>C <acronym>API</acronym></title>
<sect2 id="capiintro">
<title>Inledning</title>
<para>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 <application>artsd</application>), 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;.</para>
<para>Jag gjorde två anpassningar för att verifiera idén: <application>mpg123</application> och <application>quake</application>. Du kan skaffa programfixarna <ulink url="http://space.twc.de/~stefan/kde/download/artsc-patches.tar.gz">härifrån</ulink>. 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.</para>
</sect2>
<sect2 id="capiwalkthru">
<title>Snabbtur</title>
<para>Att skicka ljud till ljudservern med gränssnittet är mycket enkelt:</para>
<procedure>
<step><para>infoga deklarationsfilen med <userinput>#include <artsc.h></userinput></para></step>
<step><para>initiera gränssnittet med <function>arts_init()</function></para></step>
<step><para>skapa en ström med <function>arts_play_stream()</function></para></step>
<step><para>anpassa särskilda parametrar med <function>arts_stream_set()</function></para></step>
<step><para>skriva samplingsdata till strömmen med <function>arts_write()</function></para></step>
<step><para>stänga strömmen med <function>arts_close_stream()</function></para></step>
<step><para>frigöra gränssnittet med <function>arts_free()</function></para></step>
</procedure>
<para>Här är ett exempel på ett litet program som visar det här:</para>
<programlisting>#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;
}
</programlisting>
</sect2>
<sect2 id="capiartscconfig">
<title>Att kompilera och länka: <application>artsc-config</application></title>
<para>För att lätt kunna kompilera och länka program med &arts; C-gränssnitt, finns verktyget <application>artsc-config</application> som känner till vilka bibliotek som man måste länka med och var deklarationsfilerna finns. Det anropas med</para>
<screen><userinput><command>artsc-config</command> <option>--libs</option></userinput>
</screen>
<para>för att ta reda på biblioteken och </para>
<screen><userinput><command>artsc-config</command> <option>--cflags</option></userinput>
</screen>
<para>för att ta reda på ytterligare C-kompilatorväljare. Exemplet ovan skulle ha kunnat kompileras med kommandoraden:</para>
<screen><userinput><command>cc</command> <option>-o artsctest artsctest.c `artsc-config --cflags` `artsc-config --libs`</option></userinput>
<userinput><command>cc</command> <option>-o artsctest</option> <option>artsctest.c</option> <option>`artsc-config --cflags`</option> <option>`artsc-config --libs`</option></userinput>
</screen>
</sect2>
<sect2 id="c-api-reference">
<title>Biblioteksreferens</title>
<para>[ATT GÖRA: skapa dokumentation för artsc.h med kdoc] </para>
</sect2>
</sect1>
</chapter>
|