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#