Open Sound System

Původně Linuxový systém, později rozšířen na ostatní unixy.
/dev/dsp, /dev/audio — zařízení pro přehrávání a nahrávání samplů.
/dev/mixer — nastavení hlasitosti pro různé části zvukové karty.
/dev/music, /dev/sequencer, /dev/midi — přehrávání not.

/dev/dsp a /dev/audio se liší pouze implicitním formátem dat (8bit unsigned u /dev/dsp a mu-law u /dev/audio.
Je dovoleno pouze jedno otevření těchto zařízení.
Po otevření je třeba nastavit (v tomhle pořadí):

Formát

int format = AFMT_S16;
ioctl(h, SNDCTL_DSP_SETFMT, &format);
Pokud formát není podporován, je v proměnné vrácen skutečný nastavený formát. Nemusí být vrácen chybový kód.
Formáty:
Současné karty podporují AFMT_U8 a AFMT_S16_LE.

Počet kanálů

int channels = 2;
ioctl(h, SNDCTL_DSP_CHANNELS, &channels);
Nastaví mono (1 kanál) nebo stereo (2 kanály). Teoreticky je možno i více kanálů.
V proměnné je vrácen skutečně nastavený počet kanálů.

Frekvence

int rate = 44100;
ioctl(h, SNDCTL_DSP_SPEED, &rate);
Navrácena je skutečně nastavená rychlost. Pokud se liší jen málo od požadované, je možno použít. Pokud se liší o více, je třeba nahlásit chybu nebo samply dodávat v podporované frekvenci.

Čtení/zápis dat

Po nastavení parametrů je možno číst nebo zapisovat data pomocí syscallů read a write. Pomocí select je možno čekat na dostupnost dat při čtení nebo vytvoření mista v bufferu při zápisu.

Advancované featury

Fragmenty — buffer pro zvuk je kruhový a je rozdělený na fragmenty. Při každém fragmentu karta pošle interrupt. Přehrávají se pouze celé fragmenty, fragment se začne přehrávat, až je celý poslán. ioctl SNDCTL_DSP_POST — zahájí přehrátí neúplného fragmentu. ioctl SNDCTL_DSP_SYNC — zahájí přehrátí neúplného fragmentu a počká, až bude buffer vyprázdněn; stejný efekt má zavření zařízení.

SNDCTL_DSP_SUBDIVIDE — nastavení velikosti bufferu na 1/2 nebo 1/4 sekundy.
SNDCTL_DSP_SETFRAGMENT — přesné nastavení velikosti a počtu fragmentů.
SNDCTL_DSP_GETOSPACE, SNDCTL_DSP_GETISPACE — zjištění informace o počtu a velikosti fragmentu a o množství dat, jenž je možno přečíst nebo zapsat bez blokování.
SNDCTL_DSP_GETODELAY — zjištění doby od zapsání samplu do jeho přehrání — vhodné pro synchronizaci videa a zvuku.

Možnost mmapovat buffer zvukového zařízení (pouze Linux). Pomocí SNDCTL_DSP_GETOPTR a SNDCTL_DSP_GETIPTR je možno zjistit aktuální pozici. Někdy je pozice přesná na několik samplů (v případě, že je možno přečíst DMA pointer), někdy je pouze s přesností jednoho fragmentu.

SNDCTL_DSP_GETCAPS — schopnosti zařízení:

Mixer

Možnost otevřít /dev/mixer nebo ioctl provádět rovnou na otevřeném /dev/dsp. Pomocí ioctl je možno nastavovat hlasitost různých částí karty (levý kanál + 256 * pravý kanál, rozmezí je 0–100): Podporována jsou pouze některá ioctl, v závislosti na typu karty.
Pomocí následujících ioctl je možno zjistit, nastavit parametry karty:

Network Audio System

Publikován v roce 1994. Umožňuje přehrávat zvuk přes síť. Klient se napojí na server a tam může přehrávat nebo nahrávat zvuková data. Server poslouchá na portu 8000 nebo Unix domain socketu /tmp/.sockets/audio0.
Na serveru je možno vytvářet komplexní toky dat. Zařízení, ze kterých se toky skládají: Mezi zařízeními je možno vytvářet libovolné toky. Data je možno v libovolném uzlu sečíst s jinými data. Data je možno na libovolné hraně vynásobit konstantou a tak změnit hlastost.
Pokud se více aplikací snaží data poslat na jedno fyzické zařízení, budou automaticky smixovány.

AuServer *AuOpenServer(char *servername, int num_authproto, char *authproto, int num_authdata, char *authdata, char **ret_status)
Otevře spojení k serveru.

int AuServerMinSampleRate(AuServer *), int AuServerMaxSampleRate(AuServer *)
Povolené frekvence na serveru.

int AuServerNumTracks(AuServer *)
Maximální počet kanálů na serveru.

int AuServerNumFormats(AuServer *) a int AuServerFormat(AuServer *, int)
Zjistí formáty podporované serverem.

int AuServerNumDevices(AuServer *) a AuDeviceAttributes *AuServerDevice(AuServer *, int)
Zjistí, informace o fyzických zařízeních, jaká se na serveru vyskytují.

AuBool AuSoundPlaySynchronousFromFile(AuServer *server, char *filename, int volume)
Přehraje na serveru wav soubor. Počká, až zvuk bude přehrán. Hlasitost je 1 až 100.

AuEventHandlerRec *AuSoundPlayFromFile(AuServer *server, char *filename, AuDeviceID destination, AuFixedPoint volume, void (*callback) (AuServer *, AuEventHandlerRec *, AuEvent *, AuPointer), AuPointer callback_data, AuFlowID *flow, int *volume_mult_elem, int *monitor_element, AuStatus *status)
Přehraje soubor, ale nečeká na ukončení přehrávání. Po ukončení zavolá callback. Ve flow je vráceno id celého toku. V volume_mult_elem je vráceno id bloku, který provádí změnu hlasitosti. V monitor_element je vráceno id monitoru – je na něm možno zjistit stav přehrávání.

Příklad – přehrátí wav souboru

#include <stdlib.h>
#include <audio/audiolib.h>
#include <audio/soundlib.h>

int main(int argc, char **argv)
{
        AuServer *aud;
        if (argc != 2) exit(1);
        if (!(aud = AuOpenServer(NULL, 0, NULL, 0, NULL, NULL))) exit(1);
        return !AuSoundPlaySynchronousFromFile(aud, argv[1], 10000);
}

Práce s buckety

AuSoundCreateBucketFromFile, AuSoundCreateBucketFromData — vytvoření bucketu.
AuSoundDestroyBucket — zrušení bucketu.
AuSoundPlayFromBucket — přehrání bucketu.
AuSoundRecordToBucket — nahrání bucketu.
AuSoundCreateFileFromBucket — zkopírování bucketu do souboru.
AuSoundCreateDataFromBucket — zkopírování bucketu do paměti.

Práce s toky a elementy

AuMakeElementExportBucket — vytvoří výstupní element, jehož data budou ukládána do bucketu.
AuMakeElementExportClient — vytvoří výstupní element, jehož data budou předána klientovi.
AuMakeElementExportDevice — vytvoří výstupní element, jehož data budou poslána na device.
AuMakeElementImportBucket, AuMakeElementImportClient, AuMakeElementImportDevice — podobně vytvoří vstupní elementy.
AuMakeElementImportWaveForm — vytvoří vstupní element, jehož vstupem bude signál o dané frekvenci generovaný na serveru.
AuMakeElementSum — vytvoří element, jenž je součtem několika elamentů součet několika elementů.
AuMakeElementMultiplyConstant — vytvoří element, jenž bude měnit hlasitost násobením samplu.
AuSetElements — vytvoří tok ze vstupního a výstupního elementu.
AuStartFlow — spustí tok.

Samostatná práce se zvukovými soubory na lokálním klientovi, bez účasti serveru.

SoundOpenFileForReading, SoundOpenFileForWriting, SoundCreate — otevření souboru.
SoundReadFile, SoundWriteFile a další — práce se souborem.