FONDAMENTI DI INFORMATICA Prof. PIER LUCA MONTESSORO Università degli Studi di Udine Scrittura di programmi applicativi per audio real-time: la libreria portaudio Il segnale audio V amplificatore segnale audio analogico (elettrico) t suono: successione di compressioni e rarefazioni dell’aria amplificatore: amplifica il livello della tensione/corrente microfono: converte il suono in variazioni di una tensione o corrente elettrica Il segnale audio • È continuo: – nel tempo – nelle ampiezze • Per la codifica digitale è necessario rendere discreto il segnale: – per il tempo campionamento – per le ampiezze quantizzazione Campionamento V “CAMPIONAMENTO” t Campionamento Teorema del campionamento (Shannon, Nyquist) • Si applica a segnali reali limitati in banda (potenza nulla al di sopra di una frequenza massima B) • Permette di rappresentare completamente un segnale continuo nel tempo mediante una sequenza discreta di valori campionati a frequenza Fc • Vincolo: Fc2B Quantizzazione • Il campionamento produce dei numeri reali di precisione virtualmente infinita • Per la rappresentazione digitale è necessario utilizzare un numero finito di bit • La quantizzazione arrotonda i valori dei campioni introducendo irreversibilmente una perdita di informazione detta “rumore di quantizzazione” Quantizzazione V V t campionamento V t quantizzazione t Alcuni esempi • Voce per telefonia digitale PCM (Pulse Code Modulation) – B 3400 Hz (il canale telefonico ha banda 300-3400 Hz) – Fc = 8 kHz – Quantizzazione: 8 bit/campione – 64 kb/s – 1 minuto: 480 kB Alcuni esempi • Musica su CD audio – B 20 kHz (l’insieme di frequenze udibili dall’orecchio umano è 20-20000 Hz) – Fc = 44.1 kHz – Quantizzazione: 16 bit/campione (per ognuno dei due canali: il CD è stereo) – 1.411 Mb/s – 1 minuto: circa 10 MB In linguaggio C, file WAV • I campioni da 16 bit sono rappresentati da valori di tipo signed short int • La sequenza di campioni è memorizzata in un vettore in cui i valori del canale destro e canale sinistro sono alternati signed short int buffer[88200] Interfaccia audio dispositivo hardware driver software qui ci pensa il costruttore… programma applicativo qui tocca a noi! Libreria portaudio • http://www.portaudio.com/ “Portable cross-platform Audio API” • Compatibile con cygwin/gcc • Wrapper per le esercitazioni di “Architettura dei calcolatori”: rtalib (real-time audio library) Un piccolo problema Il driver software esiste già. Come fa a chiamare una funzione della nostra applicazione? Funzioni di CALLBACK!!! Callback function driver software programma applicativo f_inizializzazione (indirizzo_fz_appl) chiamata di (*indirizzo_fz_appl)() rtalib • Limitata al formato CD audio (44.1 KHz, 16 bit, stereo) • Richiede i file cygportaudio-2.dll e libportaudio.dll.a (Windows) o libportaudio.so (Linux), portaudio.h, rtalib.c, rtalib.h, wav.c, wav.h, (sul sito www.montessoro.it) • per compilare: cc_rta <nome programma> (Windows) ./cc_rta <nome programma> (Linux) rtalib: funzioni di inizializzazione int init_stream_for_input (void) int init_stream_for_output (void) int init_stream_for_input_and_output (void) rtalib: funzioni di callback void write_buffer_to_play (signed short int *buffer, int buffer_size) void read_recorded_buffer (signed short int *buffer, int buffer_size) void read_and_write_buffer (signed short int *input_buffer, signed short int *output_buffer, int buffer_size) rtalib: temporizzazione e chiusura void sleep_while_stream_is_running (double seconds) int close_stream (void) Esempio: wire void wire (void) { if (init_stream_for_input_and_output() == -1) { printf ("error opening output stream\n"); exit (EXIT_FAILURE); } printf ("Playing... 'X' to terminate.\n"); while (toupper(getchar()) != 'X'); return; } Esempio: wire void read_and_write_buffer (signed short int *input_buffer, signed short int *output_buffer, int buffer_size) { int i; for (i = 0; i < buffer_size; i++) { *output_buffer++ = *input_buffer++; *output_buffer++ = *input_buffer++; } return; } /* left */ /* right */