\\ Home : Articoli : Stampa
DirectSound - Riprodurre un wave
Di RobyDx (del 26/10/2007 @ 18:42:15, in DirectX9, linkato 7113 volte)

Direct Sound è la libreria di DirectX destinata alla riprodurre i file audio di tipo wave. Le funzionalità di Direct Sound sono cresciute sempre di più e rappresentano senza dubbio la soluzione ideale ad ogni problema audio. Tramite questa libraria sono infatti possibili numerosissimi effetti tra cui audio 3D e gestione di suono Dolby Surround. I file wave sono praticamente i migliori per tutti i suoni di un gioco, dagli spari ai discorsi dei personaggi: questo perchè sono i più leggeri e semplici da elaborare per le schede audio. Cominciamo a chiarire subito le idee. Direct Sound riproduce esclusivamente wave e non midi ne tantomeno mp3 o qualsiasi cosa vi inventiate. Tuttavia sono ammessi la maggior parte dei formati di compressione wav e di conseguenza se usate un formato molto compresso potete farci comunque di tutto (ad esempio esiste il formato mpeg layer 3 che è identico al formato mp3 ma è comunque un wave). Una volta capito questo è estremamente semplice riprodurre brani wave. Ricordo inoltre che DirectSound è un componente autonomo e quindi non deve essere usato per forza con Direct3D o DirectDraw (sembra banale ma qualcuno si confonde spesso).

Innanzitutto aggiungiamo i riferimenti alle librerie.
Dal menù progetto andate al menù aggiungi riferimenti e inserite questi riferimenti

Microsoft.DirectX Microsoft.DirectX.DirectSound

Ora è necessario creare un Device di DirectSound. Un device è un oggetto che controlla la gestione di Direct Sound. Dichiarate un oggetto pubblico di tipo device

Public DirectSound As Device

e createlo

DirectSound = New DirectSound.Device()
DirectSound.SetCooperativeLevel(fhWnd, CooperativeLevel.Priority)

fhWnd è un oggetto System.Windows.Forms.Control e deve essere posto uguale al form che verrà usato per l'applicazione.
CooperativeLevel è una delle opzioni per la creazione. Ci sono tre possibilità ma si consiglia di usare solo una di queste due

Priority : gestione normale tramite hardware dove possibile, la migliore nella maggior parte delle situazioni

Normal : c'è una gestione meno accellerata ma utile per sistemi lenti in cui girano molte applicazioni audio

Anche per device ci sono delle possibilità. Una delle opzioni per la creazione dell'oggetto è quello di usare come parametro un System.Guid. Dato che in molti PC ci sono più schede con il compito di gestire l'audio si può decidere quale usare. Nel prossimo tutorial vedremo come ottenere le Guide delle schede audio. Nel nostro caso senza passare guide usiamo la periferica standard (scelta migliore).
Ora possiamo creare oggetti per la riproduzione di brani. Possiamo crearne moltissimi ed ognuno indipendente per volume e settaggi. Un suono è gestito da un oggetto secondaryBuffer. Per crearne uno da file dichiarate un oggetto

Public suono As SecondaryBuffer

create un oggetto

Dim d As New BufferDescription()

e settate la proprietà flags uguale a

BufferDescriptionFlags.ControlPan Or BufferDescriptionFlags.ControlFrequency Or_
BufferDescriptionFlags.ControlVolume

infine ponete

suono= New SecondaryBuffer(fileSrc, d, DirectSound)

In questo modo il suono avrà la possibilità di gestire il Pan (alias il Balance, la differenza di suono tra le casse destra e sinistra), la frequenza ed il volume. Nella creazione dell'oggetto passiamo la stringa filesrc che contiene il path completo del file. Conviene creare una funzione che generi un secondarybuffer.

Function caricaSuono (ByVal fileSrc As String) As SecondaryBuffer
Dim d As New BufferDescription()
    d.Flags = BufferDescriptionFlags.ControlPan Or BufferDescriptionFlags.ControlFrequency Or_
                                                         BufferDescriptionFlags.ControlVolume
Return New SecondaryBuffer(fileSrc, d, DirectSound)
End Function

Ora l'oggetto è creato e può essere usato. Ecco alcune delle istruzioni.

Play

suono.Play(0, BufferPlayFlags.Default)

Play continuo

suono.Play(0, BufferPlayFlags.Looping)

Stop

Per fermare il brano; se il brano viene fatto ripartire con un play continua da dove si era fermato non dall'inizio

suono.Stop

Setta la posizione corrente

suono.SetCurrentPosition(0)

Volume, balance e frequenza

Nell'ordine

suono.Volume = intero da 0 Decibel (massimo) a -10000 Decibel (minimo). Già a -1000 in genere non si sente più nulla dato che la diminuzione non è lineare.

suono.Pan = intero (da -10000 a +10000). Lo 0 indica il suono centrale.

suono.Frequency = intero da 100 a 10000 ma lo 0 è il default

Stato del buffer

suono.Status.Playing = se uguale a True indica che il brano sta suonando

suono.Status.Looping = se uguale a True indica che il brano sta effettuando looping

Posizione Attuale

Per ricevere la posizione iniziale dovete dichiarare 2 variabili intere e passarle all'istruzione

suono.GetCurrentPosition(p, w)

L'intero p conterrà la posizione in riproduzione, w in scrittura (per il cattura audio).
Infine si possono settare le caratteristiche di riproduzione audio in modo da ottimizzare il suono per cuffie, casse stereo e Dolby Surround. Dichiarate un oggetto

Dim c As Speakers

e settate a true il tipo che vi interessa e passatelo a Direct Sound. La modifica riguarderà tutto l'audio.

c.Surround = True
DirectSound.SpeakerConfig = c

I nomi sono sufficientemente chiari. Potete comunque non settare nulla ed usare l'impostazione normale.
Caratteristiche del brano
Leggete le proprietà di

suono.Format

per conoscere sample rate, se il file è stereo ecc. Ad esempio se channel è 2 allora è stereo altrimenti mono.
Questo tutorial è più che sufficiente per la maggior parte dei suoni che possono essere riprodotti. Direct Sound è a mio avviso il migliore per suoni brevi come spari, esplosioni ecc.. ma nulla vieta di carica lunghi brani come colonne sonore dei giochi (se il brano è in formato mpeg layer 3 avrà le dimensioni pari ad un mp3 e di conseguenza la cosa si fa interessante).

Vi lascio agli esempiun esempio che riprodono un wave.

Esempio VB.Net

Esempio C#