14.11.1 Oggetti dispositivi audio

Prima che si possa scrivere o leggere da un dispositivo audio, si devono chiamare tre metodi nel corretto ordine:

  1. setfmt() per impostare il formato di uscita
  2. channels() per impostare il numero dei canali
  3. speed() per impostare la frequenza di campionamento
Alternativamente, si può usare il metodo setparameters() per impostare tutti e tre i parametri in una volta. Questo è più conveniente, ma potrebbe non essere così flessibile in tutti i casi.

L'oggetto dispositivo audio restituito da open() definisce i seguenti metodi:

close( )
Chiude esplicitamente il dispositivo audio. Quando si sta scrivendo sopra o leggendo da una periferica audio, si dovrebbe esplicitamente chiuderla. Una periferica chiusa non può essere nuovamente usata.

fileno( )
Restituisce il descrittore di file associato al dispositivo.

read( size)
Legge la dimensione, size, in byte dall'input audio e lo restituisce come una stringa Python. Diversamente da molti driver di dispositivi Unix, i dispositivi audio OSS in modalità bloccante (predefinita) bloccheranno read() finché l'intero ammontare di dati richiesto sia disponibile.

write( data)
Scrive la stringa Python data nel dispositivo audio e restituisce il numero dei byte scritti. Se la periferica audio è in modalità bloccante (predefinità), l'intera stringa viene sempre scritta (ancora, questo è differente dalla solita semantica dei dispositivi Unix). Se il dispositivo è in modalità non bloccante, alcuni dati potrebbero non essere scritti (vedere writeall()).

writeall( data)
Scrive l'intera stringa Python data nel dispositivo audio: aspetta finché la periferica audio non sia in grado di accettare dati e ripete finché i dati data non verranno interamente scritti. Se il dispositivo è in modalità bloccante (predefinita), questo ha lo stesso effetto di write(); writeall() è utile soltanto in modalità non bloccante. Non vengono restituiti valori poiché la quantità di dati scritti è sempre uguale a quella dei dati letti.

I seguenti metodi mappano ognuno una chiamata di sistema ioctl(). La corrispondenza è evidente: per esempio, setfmt() corrisponde al SNDCTL_DSP_SETFMT ioctl e sync() per SNDCTL_DSP_SYNC (questo può essere utile quando si consulta la documentazione OSS). Se la sottostante ioctl() fallisce, verranno sollevate tutte eccezioni IOError.

nonblock( )
Pone la periferica in modalità non bloccante. Una volta in modo non bloccante, non c'è modo di farla tornare in modo bloccante.

getfmts( )
Restituisce una maschera dei bit dei formati audio supportati dalla scheda sonora. Su un tpico sistema Linux, questi formati sono:

Formato  Descrizione 
AFMT_MU_LAW un logaritmo di codifica (usato dai file .au Sun e /dev/audio)
AFMT_A_LAW un logaritmo di codifica
AFMT_IMA_ADPCM Un formato di compressione 4:1 definito da Interactive Multimedia Association
AFMT_U8 Non firmato, audio ad 8-bit
AFMT_S16_LE Non firmato, audio a 16-bit, con ordine little-endian (come usato dai processori Intel)
AFMT_S16_BE Non firmato, audio a 16-bit audio, con ordine big-endian (come usato dai processori 68k, PowerPC, Sparc)
AFMT_S8 Non firmato, audio ad 8 bit
AFMT_U16_LE Non firmato, audio little-endian a 16-bit
AFMT_U16_BE Non firmato, audio big-endian a 16-bit
Molti sistemi supportano solamente un sotto insieme di questi formati. Numerosi dispositivi supportano solamente AFMT_U8; il formato oggi più comunemente usato è il AFMT_S16_LE.

setfmt( format)
Tenta di impostare il corrente formato audio a format (vedere getfmts() per una lista). Restituisce il formato audio per il quale il dispositivo era stata impostata, che potrebbe non essere il formato richiesto. Potrebbe anche essere usato per restituire il corrente formato audio--si otterrà questo passando un ``audio format'' di AFMT_QUERY.

channels( nchannels)
Imposta il numero dei canali di output a nchannels. Un valore di 1 indica suono mono, 2 stereo. Alcuni dispositivi possono avere più di due canali ed alcune periferiche hig-end potrebbero non supportare il mono. Restituisce il numero dei canali del dispositivo che erano stati impostati.

speed( samplerate)
Tenta di impostare il campionamento audio alla frequenza di campionamento samplerate, di campioni per secondo. Restituisce la frequenza attualmente impostata. La maggior parte dei dispositivi audio non supporta campionamenti di frequenza arbitrari. I più comuni campionamenti sono:
Frequenza  Descrizione 
8000 frequenza predefinita per /dev/audio
11025 registrazione vocale
22050  
44100 Qualità audio CD (a 16 bits/campione e 2 canali)
96000 Qualità audio DVD (a 24 bits/campione)

sync( )
Attende finché il dispositivo audio abbia riprodotto ogni byte nel suo buffer. Questo succede implicitamente quando la periferica è chiusa. La documentazione OSS raccomanda la chiusura e la riapertura del dispositivo piuttosto che l'uso di sync().

reset( )
Interrompe immediatamente la riproduzione e la registrazione, e riporta la periferica ad uno stato che può accettare comandi. La documentazione OSS raccomanda la chiusura e la riapertura del dispositivo dopo avere chiamato reset().

post( )
Dice al driver che c'è qualcosa di simile ad una pausa nell'output, rendendo possibile per il dispositivo la gestione della pausa in modo più intelligente. E' possibile perciò usarla dopo avere riprodotto un effetto sonoro, prima di aspettare l'input dell'utente o prima di accedere all'I/O del disco.

I seguenti metodi sono convenienti e combinano vari ioctls, o un ioctl ed alcuni semplici calcoli.

setparameters( format, nchannels, samplerate [, strict=False])

Imposta i parametri della chiave audio di campionatura: il formato dei campioni, il numero dei canali e la frequenza di campionamento in una chiamata. format, nchannels e samplerate dovrebbero essere specificati nei metodi setfmt(), channels() e speed(). Se strict è vero, setparameters() cerca di vedere se ogni parametro era attualmente impostato al valore richiesto, e solleva un'eccezione OSSAudioError se così non è. Restituisce una tupla (format, nchannels, samplerate) che indica i parametri dei valori che venivano attualmente impostati dal driver del dispositivo (ad esempio, la stessa cosa dei valori restituiti da setfmt(), channels() e speed()).

Per esempio,

  (fmt, channels, rate) = dsp.setparameters(fmt, channels, rate)
è equivalente a
  fmt = dsp.setfmt(fmt)
  channels = dsp.channels(channels)
  rate = dsp.rate(channels)

bufsize( )
Restituisce la grandezza del buffer hardware, in campioni.

obufcount( )
Restituisce il numero di campioni che sono nel buffer hardware che sono ancora da riprodurre.

obuffree( )
Restituisce il numero di campioni presenti nel buffer hardware e che sono ancora da riprodurre.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.