# Simple DirectMedia Layer

Simple DirectMedia Layer (SDL) è una libreria libera multimediale multi piattaforma, scritta in C, che crea un livello astratto al di sopra di varie piattaforme software grafiche e sonore e dunque può controllare video, audio digitale, CD-ROM, suoni, thread, caricamento condiviso di oggetti, timer e networking. Questa astrazione permette ai programmatori di scrivere un'applicazione multimediale una sola volta e farla girare su molti sistemi operativi: la versione corrente supporta ufficialmente Linux, Windows, BeOS, MacOS e macOS, FreeBSD, OpenBSD, BSD/OS, Solaris, IRIX e QNX ma il codice sorgente offre il supporto non ufficiale anche per Windows CE, AmigaOS, Dreamcast, Atari, NetBSD, AIX, OSF/Tru64, RISC OS e SymbianOS.

## Storia

Sam Lantinga ha creato la libreria, rilasciandola agli inizi del 1998, mentre lavorava per la Loki Software. Gli venne l'idea mentre stava portando un'applicazione da Windows a Macintosh. Ha poi utilizzato SDL per portare Doom in BeOS (vedi Doom source port). Parecchie altre librerie libere sono state sviluppate per funzionare con SDL, quali ad esempio SMPEG e OpenAL. Sam Lantinga ha anche fondato la Galaxy Gameworks nel 2008 per fornire supporto commerciale ad SDL su sistemi iOS; tuttavia la compagnia è stata dismessa dallo stesso Lantinga nel 2011.
SDL 2.0 è un aggiornamento importante al codice di SDL 1.2 e modifica ampie porzioni dell'API. Alcune nuove caratteristiche comprendono il supporto a finestre multiple, il supporto a dispositivi di input multipli (molti mouse, tastiere, ecc...), grafica 2D accelerata, ed un supporto Unicode migliore. SDL 2.0 è distribuita sotto la Zlib license, e quindi liberamente utilizzabile con linking statico in progetti closed-source commerciali, a differenza di SDL 1.2 che invece permette solo il linking dinamico.

## Architettura

La libreria ha collegamenti con quasi ogni linguaggio di programmazione esistente, dai popolari C++, Perl, Python (attraverso pygame), Pascal ai meno conosciuti Euphoria e Pliant. Questo, e il fatto che è licenziato sotto la LGPL, fa di SDL una scelta comune per molte applicazioni multimediali.
SDL è molto semplice; funziona solamente come un wrapper leggero e multi piattaforma che fornisce il supporto alle operazioni 2D sui pixel, suoni, accesso ai file, gestione degli eventi, temporizzatori, thread e altro. È spesso usata come complemento alle OpenGL settando l'output grafico e fornendo la gestione dei dispositivi di input, funzionalità che sono ben oltre lo scopo delle OpenGL.
La libreria è suddivisa in sottosistemi, quali il Video (gestisce sia le funzioni per le superfici e per l'accesso a OpenGL), l'Audio, il CD-ROM, il Joystick e il Time. A parte il supporto a basso livello, vi sono alcune librerie ufficiali di supporto che forniscono funzionalità addizionali. Queste comprendono le "librerie standard", sono fornite sul sito ufficiale e incluse nella documentazione ufficiale:
* SDL_image - supporto per diversi formati di immagini
* SDL_mixer - funzioni audio complesse, principalmente per il missaggio dei suoni
* SDL_net - supporto alla rete
* SDL_ttf - supporto alla renderizzazione dei Font TrueType
* SDL_rtf - Renderizzazione semplice del Rich Text Format

## Portabilità

SDL ha la parola "layer" nel suo nome perché è uno strato di collegamento a funzionalità specifiche dei sistemi operativi. Lo scopo principale di SDL è di fornire un framework comune per accedere a queste funzionalità.
Per come è stata concepita l'architettura, gran parte del codice sorgente di SDL è suddiviso in moduli separati per ogni sistema operativo; quando SDL è compilato, i moduli corretti sono selezionati per il sistema operativo di destinazione.
Sotto Microsoft Windows, SDL fornisce di default un collegamento all'interfaccia GDI; è anche disponibile un collegamento alle librerie DirectX. Le vecchie versioni di SDL utilizzavano le DirectX 5, ma SDL 1.2 (la release stabile corrente) richiede le DirectX 7. Sam Lantinga ha dichiarato che intende utilizzare le DirectX 8 nelle future release di SDL.
Sulle piattaforme X11, incluso Linux, SDL usa Xlib per comunicare con il sistema X11 per la grafica e gli eventi.
Su macOS, SDL usa Quartz.

## Sottosistemi e sintassi

La sintassi di SDL si basa su funzioni: tutte le operazioni fatte in SDL vengono eseguite passando parametri a funzioni. Strutture di dati speciali sono usate per immagazzinare le informazioni delle quali SDL ha bisogno per funzionare. Ci sono alcuni sottosistemi sotto i quali SDL categorizza le sue funzioni:
* Il sottosistema Video, eventi e thread - questo fornisce funzionalità per il video, multi-threading, e gestione degli eventi.
* Il sottosistema Audio - questo fornisce le funzionalità audio.
* Il sottosistema Time
* Il sottosistema Joystick
* Il sottosistema CD-ROM

## Estensioni

* SMPEG - Libreria player MPEG SDL
* Guichan e ParaGUI - Sets di Widget
* GGI - interfaccia grafica multi platform libera