APPENDICE: IMPLEMENTAZIONE DI UN DECODER ADPCM PER JMF
Come per la prima parte del tutorial,chiudiamo illustrando un'applicazione di quanto visto
in questa parte dedicata alla compressione audio.Si tratta di una classe Java in grado di
convertire un file audio compresso dal formato ADPCM al formato PCM lineare,che può essere
usata come codec per Java Media Framework (JMF).

Che cos'e' Java Media Framework
-------------------------------

Java Media Framework (JMF) e' una suite di classi e interfacce pensate da Sun e IBM per
acquisire e manipolare dati multimediali (audio,video e immagini).
JMF è implementato nel package javax.media e può essere liberamente scaricato all'indirizzo
java.sun.com insieme all'applicazione dimostrativa JM STUDIO.

Presuppongo che chi mi sta leggendo abbia una certa familiarità con Java e la programmazione
a oggetti.

Descrizione essenziale
----------------------

Le classi più importanti di javax.media sono le seguenti

javax.media.Codec
javax.media.Demultiplexer
javax.media.Renderer
javax.media.Multiplexer
javax.media.Effect

Per i nostri scopi ci interessa solo la prima.

Un oggetto che implementa l'interfaccia javax.media.Codec è in grado di comprimere,decomprimere
o convertire dati multimediali da un formato a un altro;per esempio,da PCM lineare a MP3 nel
caso di un encoder audio (o viceversa,nel caso di un decoder audio).

Per implementare un codec bisogna definire i seguenti metodi

public Format[] getSupportedInputFormats()

Restituisce la lista dei formati multimediali che il codec accetta come ingresso.
Un decoder audio restituirà una serie di oggetti che specificano il tipo di compressione,il
tasso di campionamento,il numero dei canali,l'endianess e la polarità dei dati in ingresso
(signed/unsigned).

public Format[] getSupportedOutputFormats(Format input)

Restituisce la lista dei formati multimediali che il codec è in grado di generare per un certo
formato in ingresso.
Generalmente la corrispondenza è di tipo 1:1,nel senso che ad ogni formato dei dati in ingresso
corrisponde un solo formato in uscita.

public Format setInputFormat(Format format)

Definisce il formato dei dati in ingresso;il codec restituisce il formato richiesto o un
formato "simile" a quello richiesto.
Per esempio,a un decoder audio potrebbe essere richiesto di trattare un segnale audio con
tasso di campionamento di 44100 campioni/secondo,ma funzionare su un dispositivo obsoleto in
grado di elaborare al massimo 22050 campioni/secondo.In questo caso,il codec restituirà il
tasso di campionamento massimo possibile per il dispositivo.

public Format setOutputFormat(Format format)

Definisce il formato dei dati in uscita;il codec restituisce il formato richiesto o un
formato "simile" a quello richiesto.
Per esempio,a un decoder audio potrebbe essere richiesto di decomprimere un segnale audio su
44100 campioni/secondo ma funzionare su una scheda audio in grado di riprodurre al massimo
22050 campioni/secondo.In questo caso,il codec restituirà il tasso di campionamento massimo
gestibile dalla scheda audio.

public int process(Buffer input, Buffer output)

Qui i dati in ingresso vengono letti,convertiti nel formato di uscita e depositati nel buffer
apposito.
Al termine del processo il codec restituisce un codice d'errore,tipicamente BUFFER_PROCESSED_OK
se i dati sono stati elaborati e convertiti correttamente o BUFFER_PROCESSED_FAILED in caso
contrario (per esempio perchè non è stato riconosciuto il formato d'ingresso o perchè c'e'
congestione nella rete da cui arrivano i dati).

Funzionamento essenziale di JM STUDIO
-------------------------------------

JM STUDIO è una semplice applicazione per acquisire e riprodurre file multimediali di ogni
tipo,presenti nel filesystem locale o prelevati da una rete.
Le capacità di JMS possono essere estese aggiungendo classi alla voce PlugIns del JMF Registry
Editor;questa è divisa in 5 sottovoci

Demultiplexer
Codec
Effect
Renderer
Multiplexer

Aggiungere una classe ad una di queste cinque sottovoci significa permettere a JM STUDIO di
leggere e manipolare nuovi formati di dati multimediali,oppure di manipolare diversamente
formati di dati già esistenti.

Prima di passare all'installazione dobbiamo definire un altro paio di metodi per permettere al
nostro decoder ADPCM di funzionare come un plug-in all'interno di JMS

public String getName()

Restituisce il nome identificativo del plug-in;il nome da me scelto è Custom IMA ADPCM Decoder
(notare la fantasia da ingegnere...)

public Object[] getControls()

Assegna una serie di controlli visuali a questo codec (per esempio regolazione del volume per
un codec audio,o della luminosità per un codec video).Per i nostri scopi possiamo ignorare
questo metodo.

Ok,let's go!!

Installazione e prova del codec
-------------------------------

Dopo aver scaricato JM STUDIO,lanciamolo.Cliccando su File->Preferences... entriamo diretti
nel JMF Registry Editor.A questo punto,andiamo alla voce PlugIns e da qui selezioniamo il menu
Codec:dovremmo vedere una schermata del genere

Dalla barra di testo Codec digitiamo il package in cui si trova il decoder che vogliamo instal= lare,seguito dal nome del file di classe;nel mio caso il package è tuttowindows98.com.geocities. codecs.audio.IMADPCM e il nome della classe è IMADPCM_Decoder.Clicchiamo su Add e poi su Commit per confermare;se tutto è ok,il nostro codec è stato aggiunto in fondo all'elenco di sinistra.

Quando deve riprodurre una sequenza di dati multimediali,JM STUDIO legge dalla lista dei codec in ordine e seleziona il primo codec adatto che trova. JMS dispone già di un decoder ADPCM registrato come com.ibm.media.codec.audio.ima4.JavaDecoder _ms,perciò dobbiamo fare in modo che il nostro compaia in lista prima di questo,cliccando su Move Up e poi di nuovo su Commit.

A questo punto possiamo uscire dal registry,apriamo un file audio compresso con ADPCM e clic= chiamo su Player->PlugIn Viewer;dovremmo vedere questo

Questa è la sequenza di plug-in che JM STUDIO sta usando per riprodurre il file,e in mezzo c'e' proprio il *nostro* decoder:ma vieeeeeeniiiiii!!!!!!!!! IMADPCM_Decoder.jar Va indrè