RELAZIONE TESINA by pengtt

VIEWS: 343 PAGES: 25

									                   RELAZIONE TESINA
                     INFORMATICA
Alunni: Boccaletti Yuri & Pedretti Manuel
Classe: 5°B Informatica
Anno Scolastico: 2004/2005
Scuola: I.T.I.S. -Leonardo Da Vinci - Parma
Professori: Alberto Ferrari & Alberto Paganuzzi
Titolo: “YUMA PLAYER”
Sottotitolo:“Programma per riproduzione di file
          multimediali”

Indice:

   Introduzione

   Cosa sono i file multimediali

   Cosa sono gli mp3

   Gestione TagId3

   Il linguaggio utilizzato

   Classi fondamentali

   Descrizione delle procedure della classe Principale

   Formati Audio-Video-Immagini supportati

   Creazione del pacchetto di installazione

   Documentazione utilizzata

   Conclusioni
                                                          1
                                Introduzione
Il nostro programma, YUMA Player si ispira ad altri programmi come Real One Player,
WinAmp o Windows Media Player.
Il suo principale obiettivo è la riproduzione dei file multimediali.
Il linguaggio da noi utilizzato per sviluppare questa applicazione è Visual Basic.NET di cui
descriveremo le principali caratteristiche all’interno di questa relazione.
Le fasi dello sviluppo di questa applicazione sono state lo studio del linguaggio e la
programmazione del player.
L’interfaccia è molto semplice e presenta una playlist nella quale vengono visualizzati i file
multimediali aperti.
Vi sono poi dei comandi destinati al lettore, come Play, Stop…. per la gestione della
riproduzione dei file.
Sulla parte bassa della form ci sono una serie di bottoni che permettono di eliminare un file
dalla playlist,cancellare la playlist, visualizzare i TagId3, ed infine di aprire una nuova
finestra per vedere a tutto schermo le immagini e i video.




                                                                                            2
               Cosa sono i file multimediali
Per file multimediali si intendono quei formati audio, filmati, immagini e animazioni che
sono utilizzati molto spesso in Internet.


JPG - Immagini
Lo standard creato dal Joint Photographic Experts Group è sicuramente quello più
diffuso nell’archiviazione delle immagini, al punto che Internet è letteralmente invasa da
questa tipologia di descrizione visiva, impiegata peraltro in moltissimi dispositivi hardware
orientati alla grafica: telecamere digitali, macchine fotografiche digitali, ecc.
Col trascorrere del tempo, il gruppo di lavoro si è evoluto, aggiornando il proprio
prodotto per ottenere prestazioni sempre migliori, grazie anche alla crescente capacità
d’elaborazione degli attuali calcolatori elettronici. In sintesi, la storia del formato JPEG può
essere riassunta nei tre passi seguenti:
1. standard JPEG, divenuto tale a livello internazionale nel 1992;
2. standard JPEG-LS, dove “LS” sta per “lossless”;
3. standard JPEG 2000.
Siccome la presente relazione vuole documentare lo stato “più attuale” delle cose, i
primi due stadi vengono omessi, in quanto trattati durante lo svolgimento del corso di
“Sistemi Informativi II”.
La sigla “JPEG 2000” indica l’attività svolta dal Joint Photographic Experts Group
mirata all’evoluzione del formato grafico in sé, senza rimpiazzare completamente quanto
realizzato in passato, bensì corredandolo con nuove aggiunte. Traendo spunto dai
successi e dai limiti delle opere passate, l’idea era di preservare alcuni fattori che hanno
decretato il successo di questo modello, integrandoli con nuove caratteristiche:
· aspetti economici legati ad eventuali royalty. Non si voleva obbligare gli utilizzatori a
dover sborsare somme in denaro per usufruire di certe opere intellettuali, almeno per
quanto concerne un impiego delle funzionalità di base;
· fornitura di codice C e Java agli implementatori software, caratterizzato da buona fattura
ed efficienza;
· raggiungimento di una “qualità visiva” di livello lossless per l’immagine, con fattori di
compressione almeno pari a quelli già raggiunti da JPEG in passato;
· definizione di caratteristiche di visualizzazione delle immagini;
· maggior qualità con compression ratio sempre migliori, che unita all'accuratezza
progressiva significa che le parti più rilevanti dell’immagine vengono mostrate in istanti
successivi, qualora si abbia a disposizione una banda di trasmissione troppo ristretta per
una fruizione istantanea o quasi;
· andare oltre certi limiti strutturali propri di JPEG, come:

la dimensione massima delle immagini, le quali vengono decomposte in blocchi da 64
kilobyte l’uno qualora superino una certa lunghezza;

l’eccessivo numero delle modalità di decompressione dei dati (ben 44 modi distinti!),
raggruppandole entro un unico blocco architettonico per semplicità;



                                                                                               3
limitata robustezza e qualità dell’immagine in presenza di canali trasmissivi affetti da un
elevato tasso di errore;

gestione delle immagini create dal computer altamente migliorabile.
Lo standard JPEG è stato ottimizzato per i disegni di origine “naturale”, come la
scansione di una fotografia, ad esempio; si voleva migliorarne le prestazioni in presenza
di grafica computerizzata di provenienza “vettoriale”, caratterizzata dai contorni degli
oggetti molto marcati, nonché povera di sfumature di colore, in linea di massima;

alcuni dei maggiori inconvenienti legati alla Discrete Cosine Transform (DCT) in
presenza di elevati fattori di compressione, come l’alterazione dei bordi netti e
bruschi, la presenza di profili rettangolari che conferiscono al disegno un effetto “a
mattoni”, la quantizzazione del colore troppo grezza, e così via;

aggiungere peculiarità utili per impieghi di e-commerce, come la protezione
dell’immagine mediante crittografia, l’inserimento di contratti di licenza e registrazione,
la filigrana, ecc.
Il gruppo di lavoro ha avuto inizio nel 1996, aggiornandosi periodicamente mediante i
meeting trimestrali preposti. Il 18 agosto 2000 l’ISO ha conferito lo stato di “Final Draft
International Standard” alla prima parte di JPEG 2000, segnando un’importante tappa
verso la definizione finale. Da notare che alcuni elementi di JPEG 2000 sono comuni al
progetto JBIG: il codificatore entropico realizzato per quest’ultimo, ad esempio, è incluso
come parte integrante di JPEG 2000.
Il procedimento inglobato in questa versione dello standard non si discosta molto, in
linea di principio, dalle realizzazioni precedenti e dalle tecniche di compressione delle
immagini in generale, orientate sia alla frequenza, sia all’importanza.




A grandi linee, il procedimento di codifica studiato per JPEG 2000 consta dei seguenti
passi fondamentali:
1. decomposizione del disegno nelle sue componenti cromatiche. Un caso tipico è la
separazione dei tre canali RGB. Ciascuna componente è compressa separatamente, con
la possibilità di esser processata secondo un proprio livello di accuratezza, distinto rispetto
alle altre;

2. suddivisione (di ciascuna componente) dell’immagine in regioni rettangolari prive di
overlap, denominate “tiles” (letteralmente significa “mattonelle”). È un concetto analogo
ai “blocchi” 8´8 di JPEG ma più flessibile, in quanto i lati di queste aree sono di
lunghezza arbitraria, purché esprimibili come potenza di 2; un valore usuale è 64´64. Da
questo momento in poi ciascun tile è processato individualmente, nel senso che le

                                                                                              4
operazioni successive vengono applicate ad ogni blocco a se stante. Tutto ciò permette di
individuare facilmente delle regioni rettangolari all’interno dell’immagine complessiva,
estraendole persino dallo stream compresso;

3. eventuale level-shifting dei campioni contenuti nei singoli blocchi, sottraendo loro una
costante numerica. Non sempre quest’operazione è richiesta, perché i valori potrebbero
essere già ripartiti entro il tipo di range richiesto;

4. “trasformazione” della forma d’onda, nel senso matematico del termine, mediante la
Discrete Wavelet Transform (DWT): tre sono i tipi di decomposizione supportati, ma per
default si adopera quella di Mallat, seguita tipicamente dal filtro 9/7 di Daubechies nel
caso di codifica irreversibile (riduzione lossy), oppure da un filtro simmetrico 5/3 di Le
Gall per compressioni di tipo lossless. Quest’operazione decompone l’immagine nelle sue
componenti frequenziali, concentrando l’informazione nei segnali a bassa frequenza. Il
concetto è identico a quello della Discrete Cosine Transform adottata da JPEG, con la
differenza che la DWT è “meno discontinua” fra zone grafiche adiacenti, eliminando
perciò il fastidioso effetto “a blocchi 8´8” tipico di JPEG;

5. quantizzazione dei valori ottenuti al passo precedente. Si adottano matrici di coefficienti
simili a quelle di JPEG;

6. codifica entropica, accompagnata da un passo di codifica aritmetica a bassa
complessità.
La decodifica si ottiene tramite le operazioni inverse di quelle precedenti.
Una stima della complessità introdotta da JPEG 2000 porta a concludere che il
decoder associato a questo standard sia circa un ordine di grandezza più complesso dei
suoi antenati, basati su DCT. Tutto questo è giustificato dalle nuove caratteristiche offerte:
· immagini in formato compresso oppure no; nel primo caso sono ammessi algoritmi di tipo
lossy oppure lossless;
· possibilità di definire regioni di interesse (letteralmente, “Regions Of Interest”) all’interno
della figura o dello stream, le quali possono essere codificate a risoluzioni maggiori
oppure in modalità lossless, preservando note distintive particolarmente rilevanti.
Quest’aspetto è molto importante in ambito medico, ad esempio, dove spesso quello che
interessa è un unico elemento all’interno dell’immagine;
· l’uso dei marker denominati “resync” fa sì che JPEG 2000 sia efficace anche in presenza
di canali trasmissivi soggetti ad elevati tassi di errore. Questo è il caso, ad esempio, della
telefonia mobile;
· qualità dell’immagine accettabile sino a 0.1 bpp o anche meno;
· possibilità di personalizzare sia l’encoder, sia il decoder nei casi di:
  banda trasmissiva limitata, intesa come numero di bit al secondo scambiati. Questo
  consente, per certe velocità, un funzionamento in real-time del decoder, ad esempio;

 lunghezza del flusso contenente il media soggetta ad un limite massimo;
 applicazioni che richiedono bassa occupazione di memoria;
· elaborazione ed accesso ai dati di tipo random all’interno del flusso di bit;
· elevata qualità ed alta fedeltà nel trattamento di immagini a colori, con profondità di
colore più ampia e maggior estensione della figura;
· impiego di canali alfa ed altre funzioni per venire incontro a necessità grafiche future ed
alle richieste di Internet;
· meccanismi per fornire sicurezza dell’immagine ed inclusione di metadati.
L’ultimo punto è stato abbondantemente discusso dal gruppo di lavoro. Esso consiste

                                                                                                5
nella salvaguardia dei diritti sulla proprietà dell’informazione contenuta in un’immagine
digitale, permettendo di definirne il proprietario, ad esempio, oppure di limitarne l’uso e
garantirne l’integrità, assicurando che l’oggetto non sia stato manomesso.
Esiste una moltitudine di tecniche rivolte a questo tipo di problemi, suddivise
principalmente in “filigranatura” visibile oppure invisibile: le prime alterano esplicitamente
il contenuto grafico del media, mentre le seconde no, avvalendosi tipicamente di
estrazione dei dati dalla versione originale per mezzo di riferimenti ad essa.
Queste problematiche sono state studiate ed applicate sia a JPEG, sia a JPEG 2000,
senza però giungere a tutt’oggi ad una conclusione definitiva, capace di risolvere ogni
questione. A ciò va aggiunto che queste tematiche non erano menzionate nel piano di
lavoro iniziale dello standard, dunque sono emerse strada facendo, cogliendo impreparati i
membri del gruppo.


WAVE - Audio
Il Waveform Audio File Format, noto anche come “WAVE”, rappresenta un caso
particolare del formato RIFF, concepito dalla Microsoft Corporation per memorizzare dati
multimediali in generale, corredati di descrizione del contenuto che portano con sé.
Il formato RIFF delinea una molteplicità di oggetti multimediali, fra i quali viene
considerato, in questa sede, il solo formato insito nei file “.wav
Come prima cosa è lampante notare che questo standard ha origini commerciali,
dunque i motivi che hanno spinto alla sua creazione sono tutt’altro che filosofici o
prettamente pratici, come nel caso di PNG, JPEG e MPEG.
In questi anni la Microsoft è stata al centro di numerose critiche, legate soprattutto alla
posizione predominante che riveste nel mondo informatico: dalla “Guerra dei browser
MSInternet Explorer vs Netscape Navigator”, alla diatriba “JavaScript di Netscape contro
Jscript della Microsoft”, dove all’atto pratico sembra che la sola differenza consista nella
distanza di edit che separa i nomi dei due linguaggi…
Il fatto di avere origini commerciali rappresenta un pregio oppure un difetto a seconda
del proprietario stesso dello standard, il quale è incaricato di effettuare le scelte di
correzione, mantenimento ed evoluzione cui vincolare il proprio prodotto, dove ciascuna di
esse può essere più o meno azzeccata dal punto di vista degli utilizzatori finali, nonché dei
programmatori.
Di sicuro, i file WAVE hanno l’indiscusso quanto unico privilegio di essere allegati ai
sistemi operativi della casa di Redmond. Windows 95, 98, ME e NT portano con sé alcune
centinaia di questi file al termine della sola installazione.
Viene descritta ora la struttura interna dei file audio in questione.




                                                                                             6
Nato fra la fine degli anni Ottanta e l’inizio degli anni Novanta, lo standard WAVE
prevede che gli archivi su disco siano costituiti da una successione di record logici,
denominati “chunk”. Ciascun record è composto da un ottetto di byte che descrive il chunk
stesso, dopodiché seguono ulteriori dati.
Gli otto byte iniziali sono equamente ripartiti su due campi numerici: il primo
rappresenta la tipologia del record logico, il secondo contiene la lunghezza (intesa come
numero di byte) dei dati che seguono e che fanno parte del chunk stesso. Questo fa sì che
ciascun record sia auto-esplicativo, portando con sé la descrizione dei dati, oltre che i dati
stessi, naturalmente.
Ovviamente la Microsoft ha standardizzato i tipi di chunk ammissibili, dopodiché, col
passare del tempo, sono state apportate correzioni ed aggiunte alla lista originaria.
Certamente la struttura a record logici auto-descrittivi rappresenta un punto di forza,
poiché consente un’espansibilità pressoché illimitata, permettendo di introdurre, in futuro,
chunk legati ad utilizzi che non si possono prevedere allo stato attuale delle cose.

AVI - Filmati
AVI è l’acronimo di “Audio Video Interleaved”, un formato ideato dalla Microsoft
Corporation come specializzazione del RIFF; AVI è una sorta di “fratello” della descrizione
audio WAVE, con la quale condivide le caratteristiche concettuali e strutturali.
In linea di principio, i file conformi a questo standard contengono molteplici stream
eterogenei di dati multimediali. La maggior parte di essi racchiudono sia tracce audio che
tracce video, ma alcuni costituiscono una parziale eccezione, inglobando solamente il
flusso
video.
Senza entrare nel merito dei singoli chunk, la struttura interna di un file memorizzato
secondo AVI ricopia quella già illustrata nel caso dei WAVE.
A livello concettuale, dunque, non c’è nessuna novità tecnica da rilevare. L’oggetto in
esame costituisce una sorta di “rivisitazione” delle soluzioni alternative già presenti sul
mercato, fondendole tutte assieme all’interno di un unico wrapper esterno, capace di
celare quest’eterogeneità di media in quanto a formato di memorizzazione.
Se di standard si può parlare, allora AVI merita sicuramente di esser catalogato come
“standard de facto”, avendo guadagnato il titolo sul campo grazie alla diffusione assistita
dalla casa produttrice.


MPEG -Filmati
Il Moving Picture Experts Group è certamente stato il gruppo di lavoro più produttivo
nel settore dei filmati multimediali audiovisivi; esso è autore di ben cinque prodotti:
· standard MPEG-1, prodotto nel 1988 e divenuto internazionale nel 1992;
· standard MPEG-2, avviato nel 1990, diventato internazionale nel 1994;
· standard MPEG-4, iniziato nel 1994, promosso a livello internazionale nel 1998 come
versione 1, nel 1999 come versione 2;
· standard MPEG-7, incominciato nell’ottobre 1996;
· standard MPEG-21, in fase di sviluppo.
MPEG-7 è uno standard rivolto alla descrizione del contenuto di stream audiovisivi in
ambiti multimediali, mirato a semplificare le operazioni di ricerca e reperimento delle
informazioni, a prescindere dal formato specifico nel quale sono archiviati i dati
multimediali.
                                                                                            7
Formalmente, esso è indicato come “Multimedia Content Description Interface”.
Proseguendo lungo la rotta seguita in passato dal gruppo di lavoro, MPEG-7 racchiude
al suo interno le emanazioni precedenti, ovvero MPEG-1, MPEG-2 e MPEG-4.
Lo scopo che ha motivato l’avvio questo progetto è tanto ambizioso e complesso,
quanto potenzialmente utile: si va dall’interpretazione delle immagini, alla conversione fra
tipi eterogenei di media (da filmati a testo, da audio ad immagini statiche, ecc.),
all’information retrieval da sorgenti non testuali.
Rispetto al passato, MPEG si sta muovendo verso un livello di astrazione più alto,
interessandosi della semantica contenuta negli oggetti multimediali; le versioni precedenti
dello standard riguardavano aspetti più fisici, di più basso livello.
Il grado di dettaglio cui si può arrivare nella caratterizzazione dei dati è variabile, con
l’ulteriore possibilità di effettuare descrizioni multiple (alternative o meno) a seconda del
contesto in cui verrà trattato il media, cioè a discrezione dell’applicativo software finale.
I principali elementi definiti da MPEG-7 sono:
· Descriptors (D): rappresentazioni di feature. Definiscono la sintassi e la semantica di
ciascuna figurazione di caratteristiche;
· Description Schemes (DS): specificano la struttura e la semantica delle relazioni che
intercorrono fra i membri. Questi ultimi possono essere sia Descriptors, sia Description
Schemes;
· Description Definition Language (DDL): linguaggio per la creazione di nuovi
Description Schemes e, possibilmente, anche di Descriptors. Permette l’espansione e la
modifica di Description Schemes preesistenti:




· tool di sistema: devono supportare il multiplexing delle descrizioni, la loro
sincronizzazione col contenuto, meccanismi di trasmissione, rappresentazioni codificate
(sia binarie che testuali) per storage e trasferimenti efficienti, gestione e protezione della
proprietà intellettuale, ecc.
Lo standard deve essere in grado di operare su dati sia memorizzati, sia sotto forma di
stream, in modalità real-time oppure no rispetto alla creazione della figurazione.
Lo stato corrente dell’iter di MPEG-7 prevede la sua promozione a standard
                                                                                                 8
internazionale nell’autunno 2001. Per ora è certamente impossibile disporre di materiale
idoneo ad una sua valutazione complessiva.
L’ultimo lavoro, in ordine di tempo, cui si sta dedicando il gruppo di lavoro MPEG è
lo standard MPEG-21. Esso punta a descrivere come i singoli elementi di un’infrastruttura
atta alla distribuzione e all’uso di dati multimediali interagiscono fra loro. Si tratta, dunque,
di formalizzare le interazioni che si hanno fra le singole parti di un framework multimediale,
rivolto al trasporto di media fra la sorgente e gli utilizzatori finali. Per fare un paragone, una
situazione analoga è rappresentata dal modello ISO-OSI in ambito di computer
networking, ove si descrivono i singoli livelli con le rispettive interfacce, senza però
trattarne l’implementazione interna.
Il risultato finale vuole essere un framework per la distribuzione e l’impiego di
multimedia di tipo “aperto”, portando benefici sia ai creatori dei media, sia ai provider dei
servizi, sia agli user finali. La visione finale di MPEG è definire un contesto generale,
mirato al trasparente ed accresciuto impiego di risorse multimediali, fruibili al di sopra di
molteplici reti e dispositivi usati da comunità eterogenee.
I sette elementi chiave definiti in MPEG-21 sono:
· Digital Item Declaration: un’astrazione uniforme e flessibile, nonché uno schema
interoperabile per la dichiarazione di Digital Items;
· Digital Item Identification and Description: un framework per l’identificazione e la
descrizione di qualsiasi entità indipendentemente dalla sua natura, tipologia o granularità;
· Content Handling and Usage: fornisce interfacce e protocolli che consentono
creazione, manipolazione, ricerca, accesso, storage, consegna e (ri)uso di contenuti
attraverso il processo di distribuzione e consumo;
· Intellectual Property Management and Protection: permette un’affidabile gestione dei
contenuti, garantendone la protezione anche dinanzi a molteplici reti e dispositivi;
· Terminals and Networks: la capacità di fornire accesso trasparente ed interoperabile al
di sopra di reti e terminali. Consiste in API, NPI e protocolli per la gestione della qualità di
servizio per terminali, reti e la loro mutua interazione;
· Content Representation: come le risorse multimediali sono rappresentate, mediante
tecniche all’uopo, capaci di descrivere contenuti multimediali in maniera efficace ed
efficiente, nonché scalabile e robusta a fronte di errori;
· Event reporting: definizione delle misure e delle interfacce che permettono agli utenti di
comprendere appieno la performance di tutti gli eventi registrabili entro il framework.
Il livello di astrazione richiesto per questo progetto è amplissimo: gli stessi autori
ammettono che saranno necessari contributi provenienti dall’esterno del gruppo di lavoro,
con un particolare occhio di riguardo verso le attività correlate che sono in fase di sviluppo
da parte di altri soggetti. Si vuole ottenere una regolamentazione “aperta”, al di sopra della
quale siano in grado di posizionarsi molteplici tecnologie, create da produttori qualsiasi.
La tabella di marcia, stabilita per MPEG-21, pianifica la standardizzazione
internazionale delle parti di cui si compone tra la fine del 2001 e quella del 2002. In
passato le date pronosticate sono state sovente superate, con ritardi di qualche mese.
Vista e considerata la complessità del progetto, è facile aspettarsi che l’episodio possa
ripetersi.
Allo stato attuale delle cose non è possibile fare una valutazione critica di questo
progetto, perché mancano i responsi pratici conseguenti all’utilizzo di un sistema conforme
a questa normativa. Lo scopo finale è chiaro quanto ambizioso, tanto da collocarsi ad un
livello di astrazione così estremo da stentare a credere che possa sfociare in applicativi
software “palpabili con mano”. Solo il futuro decreterà la bontà di questa formalizzazione.
Peraltro, visti gli autori coinvolti nell’operazione, c’è da aspettarsi un prodotto quantomeno
meritevole…


                                                                                                9
                          Cosa sono gli Mp3
Sebbene rientrino nello standard MPEG-2, gli stream audio memorizzati in accordo
con MPEG-2 Layer 3 meritano una trattazione a parte, vuoi per la diffusione che hanno,
vuoi per il clamore che hanno suscitato in tutto il mondo della musica.
L’innovazione introdotta da questi media ha surclassato nettamente i possibili
concorrenti, se di concorrenti si può parlare… Fino a prima dell’avvento di MP3, il settore
audio non presentava certo un’ampia scelta in termini di formati di (effettiva)
compressione; la differenza fra le singole alternative consisteva più in sfumature
implementative anziché in radicali filosofie di compattazione.
Lo standard in questione è riuscito ad abbinare, per la prima volta, un’elevata qualità
sonora ad una ridotta occupazione di memoria da parte del media, consentendo un
ampliamento dei possibili usi che se ne possono fare. La crescente diffusione di Internet
nelle case e la passione dei giovani (e non) per la musica ha fatto il resto, portando ad uno
scambio di stream audio fra tutti gli utenti. Impossibile non citare Napster e Gnutella come
reti peer to peer, concepite per il libero scambio degli oggetti in questione.
Il merito di MPEG-2 Layer 3 risiede, perciò, nella capacità di aver abbinato
caratteristiche di qualità del suono ad aspetti pratici legati alla memorizzazione ed alla
trasmissione via rete del media. In sintesi, si può dire che MP3 ha permesso di aumentare
la qualità “complessiva” degli archivi audio.
L’industria discografica ha poi sollevato un’infinità di questioni riguardanti il baratto
di canzoni musicali, le quali, convertite in MP3, venivano scambiate a migliaia fra gli utenti
di Napster, Gnutella e simili. Le fondamenta di tutto ciò consistono in un aspetto legale
molto radicato, legato alle violazioni sui diritti di autore, ma questo non toglie che
nell’alimentare la protesta sia stata confusa la pirateria musicale con l’adozione di MP3,
ingenerando nella coscienza della gente l’uguaglianza “MP3 = pirateria musicale”. Nulla di
più falso, ma spiegarlo a buona parte del mondo occidentale è problematico…
I fondamenti scientifici introdotti da MPEG-2 nel campo audio sono universalmente
noti e validi, tanto che in seguito sono stati ripresi da moltissime applicazioni: la
compressione impiegata è di tipo ibrido, essendo orientata sia all’importanza, sia alla
frequenza. Sostanzialmente è il medesimo principio che sta alla base dei più recenti
standard, JPEG 2000 compreso.
MPEG-4 ha portato a delle ottimizzazioni ancora più spinte nel settore dei media
sonori, però il clamore suscitato dalla versione precedente è stato tale da farle passare in
secondo piano. Basti ricordare che la dicitura “MPEG-3” è stata esclusa a priori per il
timore di essere confusa con MP3!
Gli investimenti economici che ruotano attorno a questa forma di dati digitali sono tali
da promuoverne la diffusione. Un contesto economico particolarmente ricco diminuisce
l’inerzia che ostacola l’impiego di certe convenzioni; ai giorni d’oggi non si contano più le
aziende che immettono sul mercato lettori audio di MP3, telefonini mobili capaci di
riprodurre file MP3 scaricati dalla rete tramite WAP, autoradio in grado di leggere carte
magnetiche sulle quali sono memorizzati brani musicali in MP3, e via discorrendo.
Complessivamente, l’adozione di quest’elemento di MPEG-2 ha costituito più un
fenomeno di massa che non un’innovazione scientifica vera e propria. Chi ne ha
beneficiato maggiormente è il settore commerciale, alimentato dai continui investimenti
spinti da nuove possibili applicazioni dei flussi audio digitali. Tutto questo per porre
l’accento sulla strada privilegiata intrapresa da una parte di uno standard ben più ampio, il
quale, ad ogni modo, ha riportato un notevolissimo successo.

                                                                                           10
                             Gestione TagId3
All’interno dei file Mp3 è possibile incorporare informazioni relative ad esso. Esistono
diverse versioni dei TagId3; la tecnologia, infatti, ha permesso di salvare sempre più
informazioni. YUMA Player gestisce i Tag di prima versione, ossia quelli che riguardano il
titolo, la artista, l’album, l’anno, il genere e il commento relativo al brano Mp3 in questione.


                      Il Linguaggio Utilizzato

Il futuro di Visual Basic si chiama Visual Basic.NET
L’ultima versione di Visual Basic si chiama Visual Basic.NET e, tra l'altro, include tre
importanti novità: Web Form, Web Service ed estensioni orientate agli oggetti. La
tecnologia Web Form consente di sviluppare applicazioni web-based nello stesso modo e
con la stessa semplicità con la quale si sviluppano oggi le classiche applicazioni Visual
Basic. Attraverso XML ed il protocollo SOAP siamo in grado di creare Web Service,
contenitori di servizi che possono essere identificati su Internet da una semplice URL.
Inoltre sono introdotte nuove parole chiave che arricchiscono notevolmente le
caratteristiche object oriented del linguaggio. Come vediamo, anche Visual Basic supporta
l'ereditarietà, il polimorfismo e l'overloading delle funzioni. Tutto ciò rende il codice
flessibile alla pari del codice C++ o Java.


Web Form
Il nuovo concetto di Web Form non sarà esclusivamente una novità presente in Visual
Basic ma sarà una nuova tecnologia di cui potranno usufruire tutti i prodotti presenti in
Visual Studio. L'obiettivo di Web Form sarà quello di estendere le caratteristiche RAD di
Visual Basic verso le applicazioni basate su Web. In altre parole si potranno sviluppare
applicazioni Web con la stessa filosofia visuale che contraddistingue le classiche
applicazioni Visual Basic. Una pagina Web Form è composta da due parti: un file HTML
che è la rappresentazione visuale della pagina ed un file sorgente che contiene il codice
necessario per la gestione degli eventi. Come abbiamo già detto, un Web Form può
essere creato nello stesso identico modo in cui si crea un Form Visual Basic. Ci sarà una
toolbar di controlli che potranno essere trascinati sul form vero e proprio che sarà
denominato html designer. A questo punto è possibile impostare le proprietà dei controlli e
scrivere il codice appropriato per la gestione degli eventi. Nel processo di creazione
avremo a disposizione tutti i comfort di Visual Studio: WYSIWYG form, IntelliSense e
possibilità di generare codice eseguibile. Da quanto detto, uno sviluppatore in grado di
sviluppare un'applicazione Visual Basic sarà automaticamente in grado di sviluppare
anche un Web Form. Da punto di vista elaborativo un Web Form sarà eseguito su parte
server, ciò che il client riceve è solo il codice html che rappresenta la form. Questo modo
di lavorare rende di fatto i Web Form indipendenti dal Web Browser. Essendo
l'elaborazione lato server (come del resto avviene con ASP) è sufficiente che il client
riesca ad interpretare codice html versione 3.2. A differenza di ASP, il codice sarà
compilato per ottenere migliori prestazioni. L'utente avrà la sensazione di lavorare con
un'applicazione Visual Basic all'interno del proprio browser. Tutto ciò potrebbe somigliare
alle Applet Java, ma esiste una sostanziale differenza: le Applet sono eseguite sul client

                                                                                              11
da una virtual machine locale, le applicazioni Web Forms sono eseguite sul server, ciò che
si vede nel browser è solo un'immagine della maschera. Ad ogni clic di mouse scaturirà un
evento che l'applicazione server intercetterà ed interpreterà.

Web Service
La diffusione di Internet ha introdotto un nuovo scenario dove utenti e sistemi, attraverso la
rete, colloquiano in modo totalmente differente rispetto alle tradizionali applicazioni stand-
alone. Visto che la rete può connettere sistemi basati su architetture completamente
diverse (Windows, Unix, Mac-OS) è stato necessario creare uno
standard per la comunicazione di rete vera e propria (TCP/IP - HTTP) e per lo scambio dei
dati (XML). Se fino a dieci anni fa per software s'intendeva un'applicazione in grado di
lavorare su un singolo computer o su n collegati mediante una LAN, oggi il software può
essere visto come una serie di servizi che svolgono particolari funzionalità utilizzabili da
tutti coloro che hanno accesso ad Internet. Chi ha letto gli articoli su .NET presenti nei
numeri precedenti avrà certamente notato che uno degli obiettivi di .NET è quello di
favorire la nascita di un insieme di servizi che comunicano e cooperano tra loro attraverso
la rete. Tra questi Web Service alcuni saranno forniti direttamente con il sistema operativo:
i .NET building block services. A partire da questi gli sviluppatori potranno creare i propri
servizi. Quello che ci aspettiamo quindi da Visual Basic.NET è che sia un valido supporto
per la creazione di Web Service. Infatti è proprio così, realizzare un nuovo Web Service
sarà semplice come aggiungere una nuova classe Visual Basic. Il nuovo Web Service
sarà visto da Visual Basic come un contenitore di normali moduli di classe alle quali è
possibile aggiungere proprietà e metodi. Come avrete notato, i Web Service
non sono una prerogativa di Visual Basic ma possono essere sviluppati anche con gli altri
prodotti della famiglia Visual Studio.NET.



Visual Basic orientato agli oggetti
Dalla prossima versione (Visual Basic.NET ) finalmente anche Visual Basic entra nella
lobby dei linguaggi Object Oriented. E' vero che già dalla versione 5 sono state introdotte
classi ed interfacce, ma ancora non si poteva affermare che Visual Basic fosse orientato
agli oggetti. Mancavano infatti paradigmi essenziali e fondamentali che saranno introdotti
in Visual Basic.NET. Visual Basic 5 e 6 non consentono ad una classe di ereditare da
un'altra. L'ereditarietà deve essere simulata attraverso la delegazione, ma ovviamente non
è la stessa cosa. Visual Basic.NET supporta l'ereditarietà "del codice" così come avviene
in C++ e Java. Quindi, avendo una classe Persona:

Class Persona

possiamo creare la classe Impiegato che estende Persona in questo modo:

Classe Impiegato Inherits Persona

La nuova parola chiave Inherits consente di creare classi derivate da altre. E' ora possibile
anche l'overloading delle funzioni e delle procedure. Possiamo quindi attribuire lo stesso
nome a due o più funzioni che presentano parametri di tipo diverso. In questo caso è
necessario usare la parola chiave Overloads:

Overloads sub MiaSub(param As String)


                                                                                           12
Overloads sub MiaSub(param As Integer)
Overloads sub MiaSub(param As Double)

In questo modo invocando:

MiaSub "Ciao"
Dim n As Integer
n=3
MiaSub n
Dim d As Double
d = 45.76
MiaSub d

saranno richiamati tre sub diverse. Il compilatore identificherà di volta in volta quella da
invocare in base al tipo dei parametri passati. Visual Basic.NET supporta anche il
polimorfismo e di conseguenza l'overriding dei metodi delle classi base nelle classi
derivate. Nell'esempio seguente il metodo Show è sovrascritto nella classe Impiegato:

class Persona
 Sub Show
  Debug.print "Io sono Persona"
 end sub
class Impiegato Inherits Persona
 Overload Sub Show
  Debug.print "Io sono Impiegato"
 end sub


A questo punto il codice seguente visualizzerà "Io sono Persona" sulla finestra di debug:
Dim p As Persona
set p = new Persona
p.Show

il codice seguente visualizzerà "Io sono Impiegato".

Dim p As Persona
set p = new Impiegato
p.Show

Come si può notare, nel secondo caso l'oggetto p sarà definito come un oggetto Persona
ma sarà assegnato ad un nuovo oggetto Impiegato. Per questo motivo il metodo Show
invocato sarà quello di Impiegato e non quello di Persona.

Altre novità
Finalmente in Visual Basic.NET è prevista l'introduzione dei thread. Visual Basic è sempre
stato un linguaggio sincrono; ma dalla prossima versione anche le applicazioni Visual
                                                                                               13
Basic potranno creare e lanciare thread propri per effettuare operazioni asincrone. Gestire
thread in Visual Basic sarà quindi facile come farlo in Java. L'unica intersezione tra thread
e Visual Basic era rappresentata dalla possibilità di realizzare controlli e classi che
adottano il modello thread-apartment. Non c'era però nessuna possibilità di delegare parte
di elaborazioni a thread dedicati. Visual Basic.NET consentirà tutto ciò. Il seguente
esempio definirà un thread che eseguirà il codice scritto nel metodo MyMethod della
classe MyClass:

set t = new Thread(New Threadstart
(AddressOf(MyClass.MyMethod)))

Come si può notare, Visual Basic.NET fornirà la funzione AddressOf integrata nel
linguaggio stesso. Non sarà più necessario dichiarare la definizione API ed importarla
dalla DLL "User32". Un'altra novità di cui si sentiva l'esigenza è quella relativa alla
gestione degli errori. L'istruzione On Error.. Goto è un costrutto "antico" che Visual Basic
ha ereditato dal gw-basic e dai basic ancora precedenti. Una gestione degli errori decente
è quasi impossibile utilizzando questa strada. Visual Basic.NET introdurrà qualcosa a
riguardo che i programmatori C++ e Java già conoscono: la funzionalità
Try..Catch..Finally. In questo modo il linguaggio diventerà più moderno ed il
programmatore potrà beneficiare del nuovo costrutto di maggiore utilità e flessibilità. Il
funzionamento di Try..Catch..Finally è illustrato dal seguente esempio:

Sub ScriviFile
 Try
   Open "Prova.txt"
   ....
   ....
   Write #1
 Catch
    Debug.Print "Errore di scrittura"
 Finally
    Close #1
 End Try
End Sub

Se avviene un qualsiasi errore run-time nelle istruzioni che compaiono tra Try e Catch il
controllo passerà al blocco Catch che visualizzerà il messaggio. In ogni caso sarà
eseguito il contenuto del blocco Finally, cioè la chiusura del file. A differenza di On Error ..
Goto, il costrutto Try..Catch..Finally potrà apparire anche nidificato:

Try 'Try #1
 ....
 ....
 Try 'Try #2
  ....
  ....

                                                                                              14
 Catch 'Gestione di Try #2
  ....
  ....
 End Try 'End Try #2
 Catch 'Gestione di Try #1
 ....
 ....
End Try 'End Try #1

Come si può notare il blocco Finally non è obbligatorio. Cambiando discorso, i
programmatori Visual Basic potranno inizializzare le variabili al momento della
dichiarazione, come già avviene in C, C++ e Java. Sarà quindi possibile scrivere:

Dim n As Integer = 10

oppure

Dim p As Persona = new Impiegato

Dove per Persona ed Impiegato si intendono due classi tale che Impiegato erediti da
Persona, come visto in precedenza. Questa nuova caratteristica renderà possibile
dichiarare e definire variabili all'interno di espressioni.



                             Classi Fondamentali
Il programma è suddiviso in cinque classi:

           Principale.vb
           Comandi.vb
           Ingrand.vb
           Mp3Tag.vb
           Mp3ID3v1.vb

La classe Principale è utilizzata per la gestione dei file multimediali. Questa classe, infatti,
presenta tutti i metodi fondamentali per l’ascolto e la visualizzazione dei file audio e video.


            Descrizione procedure della classe
                        Principale
Private Sub play()
        If ListaFile.SelectedItem = "" Then
             Exit Sub
        Else
             ListBox1.SelectedIndex = ListaFile.SelectedIndex
             LettoreFile.FileName = ListBox1.SelectedItem

                                                                                              15
              nomeFile.Text = ListaFile.SelectedItem
              nomemp3 = ListBox1.Text
              objMP3V1 = New MP3ID3v1(nomemp3)
              tb.Maximum = LettoreFile.Duration
              tb.Value = 0
              Timer1.Start()

                   LettoreFile.Play()

        End If
    End Sub
Permette l’esecuzione del file, è formata da un blocco if… else… nel quale si controlla se
è stato selezionato un file, nel caso in cui il file non sia stato selezionato si esce dalla
procedura altrimenti si procede con il settaggio di vari componenti e con l’esecuzione del
file.

'>>> PULSANTE STOP <<<<
Private Sub stop_s()
        LettoreFile.Stop()
        tb.Value = 0
        Textdurata.Text = ""
        Timer1.Stop()
        LettoreFile.FileName = Apri_File.FileName
        LettoreFile.Stop()
        nomeFile.Text = ""
    End Sub
Si limita a settare i componenti a valori predefiniti e a fermare l’esecuzione del file.

Private Sub pause()
        On Error Resume Next
        LettoreFile.Pause()
    End Sub
Con un primo click sul bottone si mette in stato di pause il player mentre con un secondo
click sullo stesso bottone si riprende l’esecuzione del file file dal punto in cui ci si era
fermata.

'>>> FUNZIONE CHE SELEZIONA FILE SUCCESSIVO <<<
Private Sub nxt()
         On Error GoTo Fix
         If ListaFile.Items.Count < 1 Then
             Exit Sub
         End If
         ListBox1.SelectedIndex = ListBox1.SelectedIndex + 1
         ListaFile.SelectedIndex = ListaFile.SelectedIndex + 1
         Timer1.Start()
         LettoreFile.FileName = ListBox1.Text
         nomeFile.Text = ListaFile.SelectedItem
         nomemp3 = ListBox1.Text
         objMP3V1 = New MP3ID3v1(nomemp3)
         Exit Sub
Fix:
         ListaFile.SelectedIndex = 0
         ListBox1.SelectedIndex = 0
         Timer1.Start()
         LettoreFile.FileName = ListBox1.Text
         nomeFile.Text = ListaFile.SelectedItem
         nomemp3 = ListBox1.Text
         objMP3V1 = New MP3ID3v1(nomemp3)
     End Sub

                                                                                           16
    ' >>> FUNZIONE CHE SELEZIONA FILE PRECEDENTE <<<
    Private Sub prev()
        If ListaFile.Items.Count < 1 Then
             Exit Sub
        End If
        If ListBox1.SelectedIndex - 1 > -1 Then
             ListaFile.SelectedIndex = ListaFile.SelectedIndex - 1
             ListBox1.SelectedIndex = ListBox1.SelectedIndex - 1
             Timer1.Start()
             LettoreFile.FileName = ListBox1.Text
             nomeFile.Text = ListaFile.SelectedItem
             nomemp3 = ListBox1.Text
             objMP3V1 = New MP3ID3v1(nomemp3)
        Else
             ListaFile.SelectedIndex = ListaFile.Items.Count - 1
             ListBox1.SelectedIndex = ListBox1.Items.Count - 1
             Timer1.Start()
             LettoreFile.FileName = ListBox1.Text
             nomeFile.Text = ListaFile.SelectedItem
             nomemp3 = ListBox1.Text
             objMP3V1 = New MP3ID3v1(nomemp3)
        End If
    End Sub
Queste due procedure permettono lo scorrimento in entrambi I sensi della playlist

'FUNZIONE >>> OPEN <<<
     Private Sub open()
         On Error GoTo Fix
         Dim i As Integer
         Apri_File.Filter = "File
Supportati|*.mp3;*.wav;*.mpg;*.avi;*.wmv;*.bmp;*.jpg;*.gif"
         Apri_File.RestoreDirectory = True
         Apri_File.ShowDialog()
         If Apri_File.FileName = "" Then
              Exit Sub
         Else
              Dim sR As String
              Dim s2 As String
              Dim s1 As String
              For i = 1 To Apri_File.FileNames.Length
                  ListBox1.Items.Add(Apri_File.FileNames(i - 1))
                  s1 = Apri_File.FileNames(i - 1)
                  sR = StrReverse(s1)
                  s2 = s1.Substring(Len(s1) - sR.IndexOf("\"))
                  ListaFile.Items.Add(s2)
              Next i
         End If
         Apri_File.FileName = ""
Fix:
         Exit Sub
     End Sub
Questa procedura serve per l’apertura dei file.
Mediante il comando filter si controlla l’estensione del file se è una di quelle indicate il file
viene visualizzato, in caso contrario non viene visualizzato.

Private Sub TrackBar_ValueChanged(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles tb.ValueChanged
        If tb.Value = tb.Maximum Then
            If ListBox1.SelectedIndex < ListBox1.Items.Count - 1 Then


                                                                                                17
                     ListBox1.SelectedIndex = ListBox1.SelectedIndex + 1
                     ListaFile.SelectedIndex = ListaFile.SelectedIndex + 1
                     nomeFile.Text = ListaFile.SelectedItem
                     nomemp3 = ListBox1.Text
                     objMP3V1 = New MP3ID3v1(nomemp3)
              Else
                ListBox1.SelectedIndex = 0
                ListaFile.SelectedIndex = 0
                nomeFile.Text = ListaFile.SelectedItem
                nomemp3 = ListBox1.Text
                objMP3V1 = New MP3ID3v1(nomemp3)
            End If
            LettoreFile.FileName = ListBox1.SelectedItem
        End If
    End Sub
Controlla lo scorrimento della trackbar e nel caso in cui il file sia terminato passa al file
successivo.

'>>>> BARRA BILANCIAMENTO <<<<
    Private Sub Bilanciamento_Scroll_1(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Bilanciamento.Scroll
        LettoreFile.Balance = Bilanciamento.Value
    End Sub
Determina l’uscita nella cassa destra o sinistra

'>>>>>>> TASTO MUTE <<<<
    Private Sub muto_CheckedChanged_1(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles muto.CheckedChanged
        If muto.Checked = True Then
             LettoreFile.Mute = True
        Else
             LettoreFile.Mute = False
        End If
    End Sub
Se il checkbox viene selezionato viene attivata la modalità Mute mentre se è
deselezionato viene disattivata.

Private Sub volume1_Scroll(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles volume1.Scroll
        LettoreFile.Volume = volume1.Value
        If muto.Checked = True Then
            MsgBox("La modalità MUTE è attiva")
        End If
    End Sub
Scorrendo a destra o sinistra si abbassa o si alza il volume a valori predefiniti

'>>> PULSANTE ELIMINA FILE DALLA LISTA <<<
    Private Sub Elimina_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Elimina.Click
        ListBox1.SelectedIndex = ListaFile.SelectedIndex
        ListBox1.Items.Remove(ListBox1.SelectedItem)
        ListaFile.Items.Remove(ListaFile.SelectedItem)
        LettoreFile.FileName = ""
        nomeFile.Text = LettoreFile.FileName
        Textdurata.Text = ""
    End Sub
Premendo il seguente pulsante il file selezionato viene cancellato dalla playlist


                                                                                                18
' >>> PULSANTE SVUOTA LISTA <<<
    Private Sub svuota_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles svuota.Click
        ListBox1.Items.Clear()
        ListaFile.Items.Clear()
        LettoreFile.FileName = ""

        nomeFile.Text = LettoreFile.FileName
        Textdurata.Text = ""
    End Sub

Questo pulsante invece cancella tutta la playlist

' >>> APRE UNA NUOVA FORM -->> INGRAND
    Private Sub ingrand_Click_1(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles ingrand.Click
        ' LettoreFile.EnableFullScreenControls = True
        Dim i As New Ingrand
        Dim j As New Comandi

         'Me.Visible = False

         i.FormPrincipale = Me
         i.Form2 = j
         j.formMedia = i
         j.Main = Me

        LettoreFile.Stop()
        LettoreFile.Enabled = False
        If nomeFile.Text = "" Then
             MsgBox("Non è selezionato nessun file")
        Else
             i.Show()
             j.Show()
        End If
    End Sub

Cliccando su questo pulsante invece vengono aperte due nuove form una nella quale
visualizzare immagini e video mentre nell’altra vi sono i comandi base per la riproduzione

Private Sub bottoneTAG_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles bottoneTAG.Click
        Dim i As New Mp3Tag
        If LettoreFile.FileName = "" Then
             MsgBox("Non è selezionato nessun file!!")
        Else
             i.Show()
             i.TextBox1.Text = objMP3V1.Frame(MP3ID3v1.FrameTypes.Title)
             i.TextBox3.Text = (objMP3V1.Frame(MP3ID3v1.FrameTypes.Artist))
             i.TextBox4.Text = (objMP3V1.Frame(MP3ID3v1.FrameTypes.Album))
             i.TextBox2.Text = (objMP3V1.Frame(MP3ID3v1.FrameTypes.Genre))
             i.TextBox6.Text = (objMP3V1.Frame(MP3ID3v1.FrameTypes.Track))
             i.TextBox5.Text = (objMP3V1.Frame(MP3ID3v1.FrameTypes.Year))
             i.TextBox7.Text = (objMP3V1.Frame(MP3ID3v1.FrameTypes.Comment))
        End If
    End Sub

Per finire ciccando su questo pulsante dopo aver selezionato un file mp3 vengono
visualizzate le TagId3



                                                                                         19
Formati Audio-Video-Immagini supportati
YUMA Player riesce a riprodurre i formati comuni.
Questi sono i formati che vengono riprodotti:

                 AUDIO                    VIDEO                 IMMAGINI
                    Mp3                      Mpeg                     Bmp
                    Wave                      Avi                      Jpg
                    Wmv                                                Gif
                    Midi




  Creazione del pacchetto di installazione
Come il .Net Framework semplifica il lavoro
La prima cosa da dire è che Visual Studio .NET permette di creare pacchetti di
installazione per Windows Installer, cioè i famosi database con estensione .MSI che
eravate in grado di creare anche con Visual Studio Installer.
L'introduzione del .NET Framework permette di semplificare notevolmente la creazione di
un pacchetto di installazione, o addirittura di un programma di installazione personalizzato,
in quanto la maggior parte delle dipendenze sono contenute nel Framework medesimo.
Normalmente, infatti, un'applicazione basata sul .NET Framework dovrebbe essere in
grado di funzionare su un PC, ovviamente contenente il Framework stesso,
semplicemente copiandone la struttura a directory, metodo, quest'ultimo, definito in gergo
XCOPY, a ricordo del comando di Ms-Dos che, appunto, era in grado di copiare un'intera
struttura di directories, proprio per il fatto che l'applicazione utilizza come base il .NET
Framework, utilizzando in casi abbastanza rari componenti esterni, facendo invece uso
massiccio delle classi e dei namespaces contenuti nel Framework nonché del Common
Language Runtime. Vedremo, comunque, anche come inserire nel pacchetto eventuali
componenti esterni ad esso.
In teoria sarebbe davvero semplice creare un programma di installazione per la propria
applicazione addirittura senza ricorrere ad altri strumenti che lo facciano per noi, in quanto,
come ho detto poc'anzi, il setup dovrebbe semplicemente creare una directory e copiarvi i
files eseguibili dell'applicazione, più quelli utilizzati dalla stessa, ad esempio eventuali
database, documenti vari, immagini. Tuttavia un buon programma di installazione
dovrebbe anche "registrare" l'applicazione in modo che la stessa disponga di un sistema di
disinstallazione, concetto quest'ultimo riservato a programmatori più esperti e che
comunque esula dall'argomento principale di questo articolo, nonché rilevare la presenza
di componenti DLL fornite da terze parti.

Creare un pacchetto in pratica
Passiamo ora alla fase pratica per la creazione di un setup completo e funzionante per la
nostra applicazione. Nell'esempio che riporto creeremo un progetto da zero in Visual Basic


                                                                                            20
.NET e poi creeremo un progetto di installazione. Quando creerete le vostre installazioni,
al posto del progetto "Vuoto" di VB .NET ci sarà il vostro progetto aperto.

Dal menu File selezioniamo ancora
Nuovo e Progetto.
Dalla finestra di dialogo Nuovo
progetto selezioniamo Progetti di
installazione e distribuzione.
Selezioniamo Installazione guidata
avendo cura di selezionare
l'opzione Aggiungi a soluzione
appena sotto il percorso del
progetto.

Vi consiglio, a meno che non siate
utenti esperti, di utilizzare la
procedura per l'installazione
guidata. Potreste, altrimenti, voler
creare un progetto vuoto ed
aggiungere manualmente le varie voci.

Visual Studio .NET, a questo punto, vi richiederà alcune informazioni guidandovi nella
creazione del pacchetto. Prima di
tutto vi verrà richiesto che tipo di
installazione vogliate creare.
Potete scegliere quello che è
necessario per voi, in questo
articolo tratterò l'installazione di
applicazioni Windows, cioè la
prima possibilità (che è anche
quella di default).
Il passo successivo è quello di
indicare gli outputs del progetto.
Senza impazzire più di tanto, sarà
sufficiente cliccare sulla casella
Output primario da... in quanto
questa opzione aggiunge tutti i files
necessari al funzionamento
dell'applicazione, legge le
dipendenze e, ove necessario,
aggiunge automaticamente i
componenti esterni utilizzati (nel
caso della programmazione basata su .NET si tratterà di files .DLL), senza che siamo noi
a preoccuparcene; infatti, un'applicazione .NET richiede che i componenti esterni siano
presenti nella directory del progetto, pertanto per il compilatore non è difficile rilevare ed
aggiungere gli eventuali componenti di terze parti.
Nel passo successivo è possibile indicare eventuali files di testo o HTML da utilizzare nel
pacchetto. Infine apparirà una finestra riportante il riepilogo delle informazioni e dovremo
cliccare su Fine. Potete modificare le informazioni specificate utilizzando il pulsante
Indietro.


                                                                                             21
Il progetto di installazione verrà così creato. Nella finestra Esplora Soluzioni potete notare
che ora coesistono due progetti, ovvero l'applicazione vera e propria ed il progetto di
installazione. Entrambi i progetti fanno parte della stessa soluzione.
Vi prego di notare che in Setup1 appare una cartella denominata Dipendenze rilevate.
Questa cartella contiene le dipendenze che non risultano incluse nel .NET Framework,
cioè i componenti esterni utilizzati dall'applicazione. Fate molta attenzione al fatto che,
sebbene il .NET Framework venga incluso come dipendenza sotto forma del file
dotnetfxredist_x86_ita.msm, lo stesso non viene incluso nel pacchetto, questo anche a
causa delle dimensioni del .NET Framework (circa 20 Mb ancora compresso). Questo
comporta che il .NET Framework debba essere già installato sulla macchina di
destinazione, oppure dovrete includerlo separatamente sul vostro supporto di
distribuzione, e magari prevederne un'installazione "preventiva". Trovate il file ridistribuibile
del .NET Framework sul CD denominato Windows Component Update di Visual Studio,
oppure potete scaricarlo dal sito web della Microsoft.
Sarà ora necessario personalizzare il pacchetto di installazione, specificando i dati del
produttore, le cartelle di destinazione, eventuali bitmap, eccetera. Selezionate Setup1
nella finestra Esplora soluzioni. Nel riquadro sottostante appariranno le proprietà del
progetto. Nella tabella che segue riporto le proprietà da modificare ed il relativo significato:
Proprietà                    Significato
Author                       Nome dell'autore
                             Commenti che appaiono nella finestra Proprietà
Description
                             quando l'utente fa click destro sull'icona del pacchetto
Localization                 Indica la lingua da utilizzare nel pacchetto
Manufacturer                 Produttore (per informazioni sul supporto)
                             Indirizzo web o e-mail del produttore (per informazioni
ManufacturerUrl
                             sul supporto)
                             GUID univoco per l'applicazione. Può essere
ProductCode                  cambiato manualmente o facendo click sul piccolo
                             pulsante che appare alla destra.
ProductName                  Nome del prodotto
                             Sostituisce, ove presenti, versioni precedenti del
RemovePreviousVersions
                             prodotto
                             Indica il percorso in cui ricercare files, assembly e
SearchPath
                             moduli unione per la compilazione del pacchetto
Subject                      Informazioni aggiuntive circa il pacchetto
SupportPhone                 Numero di telefono per il supporto
SupportUrl                   Indirizzo web o e-mail per il supporto
                             Titolo dell'applicazione che apparirà nelle finestre del
Title
                             setup
                             GUID per l'aggiornamento del programma che può
UpgradeCode
                             essere modificato come descritto sopra
Version                      Versione del pacchetto (es. 1.0.2.0)

                                                                                              22
Personalizzare l'interfaccia utente
La personalizzazione dell'interfaccia utente non si discosta molto da quella già conosciuta
con Visual Studio Installer. Nella finestra Esplora soluzioni fate click destro su Visualizza e
poi su Interfaccia utente. Apparirà un elenco delle finestre di dialogo disponibili. E'
possibile aggiungerne ulteriori facendo click destro sulla finestra; sarà possibile
selezionare una finestra per il contratto di licenza, una per il file Leggimi, ed altre ancora.
Selezionando la singola finestra di dialogo si potrà modificarne le proprietà, come ad
esempio una bitmap da visualizzare nella parte superiore delle finestre del pacchetto, il
testo da visualizzare all'interno delle finestre medesime, oppure, come nel caso del
contratto di licenza, specificare un file .RTF contenente il testo del contratto.
Le immagini da utilizzare nelle finestre di dialogo devono avere dimensioni di 500 x 70
pixel, e devono essere in formato Bitmap o JPeg.

Modificare il registro di sistema
Rispetto a Visual Studio Installer questa peculiarità è stata ampliata. Fate click destro sul
nome del progetto, selezionate Visualizza e poi ancora Registro di sistema. Al centro dello
schermo apparirà una finestra contenente le voci del registro di Windows che è possibile
modificare dal pacchetto di installazione.
Per inserire una chiave in una delle voci del registro, fate click destro e selezionate Nuova
chiave. Sarà così possibile specificare il nome della chiave. All'interno di ogni chiave sarà
possibile, con lo stesso procedimento, inserire dei valori di tipo stringa, stringa di
ambiente, binario o DWORD od anche una sottochiave.
Appare importante sottolineare che l'editor di Visual Studio .NET predispone delle
sottochiavi SOFTWARE nelle voci HKEY_LOCAL_MACHINE e HKEY_CURRENT_USER
all'interno delle quali è inserita un'ulteriore sottochiave a disposizione del produttore del
software, in modo tale che per l'applicazione sia riservato un apposito spazio all'interno del
registro.
Se non siete programmatori esperti, o se non avete un'idea chiara di come modificare il
registro di sistema, lasciate inalterata questa caratteristica. Modificare il registro di sistema
è sempre molto rischioso.

Aggiunta di azioni personalizzate
Questa caratteristica è una novità di Visual Studio .NET e permette di eseguire dei files
binari, come ad esempio eseguibili o Dll, in determinati momenti del processo di
installazione. Facendo click destro su una delle situazioni offerte, è possibile specificare
uno dei files contenuti nel File System del pacchetto di installazione (il File System verrà
trattato nel seguito).

Tipi di files: registrare estensioni proprietarie
Come già avveniva in Visual Studio Installer, è possibile creare
delle estensioni personalizzate per i files eventualmente creati ed
utilizzati dalla nostra applicazione. Fate click destro su Setup1, poi
puntate su Visualizza ed infine su Tipi di file. Nella finestra che
appare noterete che l'IDE predispone un nuovo tipo di file vuoto.
Nel riquadro delle Proprietà in basso a destra dello schermo
potrete specificare il nome del tipo di file, l'estensione vera e
propria, il file eseguibile che eseguirà le operazioni sul file, la
descrizione, l'icona associata ed il tipo MIME.
E' importante sottolineare che quando si tratta di specificare, in

                                                                                               23
qualsiasi situazione di progettazione, il nome dell'eseguibile della nostra applicazione (non
lo troveremo mai), dovremo sempre selezionare Output primario da NomeProgetto in
quanto quest'elemento fa riferimento all'eseguibile vero e proprio.
Nella figura accanto è riportato a titolo esemplificativo il riquadro delle proprietà creato per
questo progetto.
L'editor automaticamente predispone quello che in Visual Studio Installer era definito verb
e cioè il tipo di operazione da eseguire sul file; viene automaticamente predisposta
l'apertura del file con l'eseguibile precedentemente specificato (Open). E' comunque
possibile inserire altre azioni, come ad esempio print che permette di stampare il file con la
nostra estensione attraverso l'applicazione che stiamo installando.


Il file system: come organizzare files, cartelle e collegamenti
Fate click destro sul nome del progetto, puntate su Visualizza e poi ancora su File System.
Nella finestra che appare potrete organizzare i vari files e creare dei collegamenti.
Gli utenti di Visual Studio Installer noteranno subito alcuni positivi cambiamenti.
Innanzitutto non è più inserita tra quelle di default la cartella di sistema di Windows
(Windows System Folder). Questo è dovuto proprio al fatto che non ci sono dipendenze e
componenti da registrare, dato che tutto è basato sul .NET Framework.
A conferma di questo, se disponete di un visualizzatore di dipendenze, potrete verificare
che l'unica che viene mostrata per l'eseguibile della vostra applicazione è la libreria
Mscoree.Dll che è il "cuore" del run-time di .NET Framework.
E' stata poi inserita una cartella che identifica il menu Programmi dell'utente, cosa che non
avviene in Visual Studio Installer.
Fate doppio click sulla cartella Cartella applicazione. Al suo interno troverete solo Output
primario da Vuoto. Qui dovrete inserire tutti gli altri files che non vengono rilevati da Visual
Studio, quali database e documenti propri dell'applicazione, semplicemente facendo click
destro al suo interno, puntando su Aggiungi. Come noterete è possibile inserire uno o più
files, ma anche interi progetti compilati (Output progetto).
Per creare un collegamento sul desktop, entrate nella cartella Desktop utente, fate click
destro e selezionate Crea collegamento. Dalla finestra di dialogo che appare selezionate
Output primario da Vuoto per creare il collegamento all'eseguibile. Se avete inserito altri
files all'interno della Cartella applicazione potrete creare collegamenti ad altri tipi di file.
Per creare una cartella ed i relativi collegamenti nel menu Avvio\Programmi, fate click
destro sulla cartella Programmi dell'utente, aggiungete una cartella col tasto destro, datele
il nome che volete, poi con lo stesso procedimento utilizzato per il Desktop create i
collegamenti desiderati.

Compilare il pacchetto
Il pacchetto è ora pronto per essere compilato, testato e distribuito. Ricordatevi sempre,
prima di rilasciare una versione definitiva dell'applicazione, di impostare la configurazione
di compilazione su Release; è possibile farlo anche dalla casella presente sulla barra degli
strumenti standard.
Selezionate con un click il progetto di installazione Setup1 dall'Esplora soluzioni. Dal menu
Progetto fate click su Genera Setup1. In questo modo il pacchetto di installazione verrà
creato e conterrà, oltre al pacchetto .MSI, anche un eseguibile chiamato Setup.Exe, i files
ridistribuibili di Windows Installer ed un file di informazioni di esecuzione. Questi files


                                                                                              24
andranno poi riportati sul supporto di distribuzione, ad esempio un CD-Rom.
Provate ad eseguire il pacchetto, noterete che l'applicazione verrà installata correttamente.
Per rimuoverla sarà sufficiente utilizzare la funzionalità Installazione applicazioni del
Pannello di Controllo di Windows.

Ulteriori impostazioni: le condizioni di avvio
E' possibile includere nel pacchetto di installazione delle condizioni di avvio, ossia
completare l'esecuzione del pacchetto solo in presenza di determinate condizioni.
E' possibile impostare delle condizioni di avvio "pure", che però tralascerò in questa sede,
e delle condizioni di avvio basate sulla ricerca di files, voci di registro, o di componenti in
base al GUID specificato.
Supponiamo di voler dire al pacchetto che deve proseguire la sua esecuzione solo se
nella cartella di sistema di Windows è presente il file ShFolder.Dll. Trattandosi di una
libreria di sistema, l'esecuzione deve funzionare.
Procediamo in questo modo:

           1. Facciamo click destro su Setup1, puntiamo su Visualizza, e su Condizioni di
              avvio;
           2. Facciamo click destro su Cerca nel computer di destinazione e selezioniamo
              Aggiungi ricerca file;
           3. Rinominiamo la voce in Ricerca1 e nella casella delle proprietà, digitiamo
              ShFolder.Dll nella proprietà FileName e lasciamo inalterato il contenuto della
              proprietà Folder. Nel nostro caso lasciamo invariate le altre proprietà, ma è
              possibile specificarne altre, come la versione del file da cercare, la data di
              creazione o l'ora.

Il progetto così modificato va nuovamente compilato ed eseguito per verificarne la corretta
esecuzione.

                  Documentazione Utilizzata
          Documentazione sui file multimediali dal sito http://www-
           db.deis.unibo.it/courses/SI2/Relazioni/FormatiMultimediali.pdf

          Informazioni generali sul VB Net e sui player dal sito http://www.visual-basic.it


                                  Conclusioni
Siamo riusciti a sviluppare tutti i punti che ci eravamo prefissati.
Le difficoltà incontrate sono derivate dall’ambiente di sviluppo utilizzato e specialmente
nella creazione del progetto di installazione e nell’istanziamento dei form.
D'altronde, però, abbiamo preferito realizzare il nostro progetto VB Net poiché ci
interessava approfondire questo linguaggio.


                                                                                                  25

								
To top