Panoramica di ADPCM

La modulazione del codice a impulsi adattivi (ADPCM) è un formato di compressione di perdita implementato per XAudio2 per fornire funzionalità aggiuntive per specificare le dimensioni del blocco di esempio di compressione. Con un formato di compressione con perdita alcuni dati vengono modificati e persi durante la compressione. ADPCM può ottenere rapporti di compressione fino a 4:1.

L'implementazione di ADPCM per XAudio2 offre funzionalità aggiuntive per specificare le dimensioni del blocco di esempio di compressione. ADPCM consente alla finestra di progettazione audio di scegliere un'impostazione appropriata tra dimensioni, qualità e risoluzione (per l'inserimento di punti ciclo).

XAudio2 usa una versione modificata del codec Microsoft ADPCM che supporta la formattazione dei dati estesa necessaria per fornire dimensioni personalizzate dei blocchi di esempio. Per questo motivo, i dati audio XAudio2 non possono essere riprodotti dai motori audio che non supportano questa versione del codec ADPCM.

Nota

Attualmente, la compressione ADPCM è disponibile solo per Windows, tra cui XNA Game Studio Express per le distribuzioni di Windows.

 

Codifica ADPCM

I dati audio vengono codificati in ADPCM usando lo strumento da riga di comando AdpcmEncode.

  • AdpcmEncode

    Per codificare i file audio come ADPCM da usare con XAudio2, usare lo strumento da riga di comando AdpcmEncode .

Decodifica ADPCM

La decodifica software di ADPCM è supportata in XAudio2.

SamplesPerBlock

La compressione ADPCM funziona separando la forma d'onda in blocchi e stimando la variazione dei campioni della forma d'onda all'interno di ogni blocco. Le dimensioni dei blocchi sono misurate negli esempi. Le dimensioni più piccole del blocco sono 32 e il massimo è 512 campioni.

I blocchi più grandi consentono una migliore compressione, che comporta dimensioni di file più piccole, ma a spese della qualità del suono e della risoluzione per l'allineamento dei punti ciclo.

In generale, la modifica del valore SamplesPerBlock comporta questi compromessi:

Se SamplesPerBlock... Compressione file Qualità audio Risoluzione del punto ciclo
Aumenta (fino a max 512) Aumenta Diminuisce Diminuisce
Riduce (fino a min 32) Diminuisce Aumenta Aumenta

 

Restrizioni

Poiché ADPCM usa blocchi di esempio allineati uno dopo l'altro, un'onda compressa con ADPCM potrebbe avere un blocco parziale non completato alla fine. Il decodificatore ADPCM genera il silenzio per il resto di questo blocco parziale, che mantiene senza problemi l'onda.

Il valore del parametro SamplesPerBlock influisce sulla risoluzione con cui è possibile allineare i dati delle onde e i punti ciclo.

Se si tenta di applicare la compressione a un'onda non allineata, si riceverà un errore o un avviso a seconda che l'onda venga usata in qualsiasi evento di riproduzione in ciclo. Non è possibile comprimere un'onda usata in qualsiasi evento di riproduzione ciclo. Rimuoverlo dagli eventi di riproduzione ciclo e riapplicare la compressione.

Se si usa l'onda esclusivamente in modalità non ciclo, la restrizione di allineamento del blocco di esempio non si applica.

Struttura file ADPCM

Un file ADPCM è un file RIFF standard con i tipi di blocchi seguenti.

Blocco FCC Descrizione
RIFF Blocco RIFF standard contenente un tipo di file con il valore WAVE nei primi quattro byte della sezione dati e gli altri blocchi nel file nella parte restante della sezione dati.
Fmt Contiene l'intestazione di formato per il file ADPCM. I dati in questo blocco corrispondono a una struttura ADPCMWAVEFORMAT .
data Contiene i dati audio ADPCM codificati. Quando si usa ADPCM in XAudio2, è necessario leggere il contenuto del blocco di dati in un buffer e passarlo a una voce di origine come membro pAudioData di una struttura XAUDIO2_BUFFER . Non è necessario scambiare il contenuto del blocco di dati.
smpl e wsmp Tipi di blocchi facoltativi contenenti le informazioni di ciclo per il file ADPCM. Quando si usa ADPCM in XAudio2, i valori contenuti nei blocchi smpl o wsmp vengono usati per popolare i membri LoopBeginLoopLength e LoopCount della struttura XAUDIO2_BUFFER . Nella Xbox 360 è necessario scambiare i dati caricati da un blocco smpl per tenere conto della differenza di endianness tra Windows e Xbox 360.

 

Guida per programmatori