|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
|
Announcements
Chapters
Services
Feature Zones
|
IntroductionManaged DirectSound 9 is a part of Managed DirectX 9 library. In this tutorial I’m going to explain how to play sounds with Microsoft Managed DirectSound 9, how to apply effects, select the output audio device and a few more tricks. I hope you’ll discover that DirectSound is not as difficult as it seems. RequirementsIn order to develop and run applications using Managed DirectSound 9 (and all Managed DirectX 9), you have to install in your system the DirectX 9 standard redistributable package specifying in the command line the argument /InstallManagedDX (for example D:\Download\dxsetup /InstallManagedDX). You can also download from Microsoft’s website the package called the ‘DirectX 9.0c Redistributable for Software Developers - with updated DirectX for Managed Code and D3DX’, which includes and installs automatically the Managed DirectX libraries. Obviously, you have to add to your projects the references to Here is an important note: in order to run the apps, the user is not forced to install the Managed DX9, but it is sufficient to copy in your apps’ root folder the referenced assemblies. To do this, set the using Microsoft.DirectX;
using Microsoft.DirectX.DirectSound;
First lines of code: play a Wave fileThe first operation you have to do, is to create a DirectSound private Device dSound;
After this, set it up: dSound = new Device();
dSound.SetCooperartiveLevel(handle,
CooperativeLevel.Priority);
Notes: The next step is to create a private SecondaryBuffer sound;
private BufferDescription d = new BufferDescription();
// Set descriptor’s flags
d.ControlPan = true;
d.ControlVolume = true;
d.ControlFrequency = true;
d.ControlEffects = true;
The flags are:
There are a few other flags, but we are not interested in them. // Create the sound
sound = new SecondaryBuffer(filePath, d, dSound);
The operations you can perform with a
Using speakersAnother amazing thing you can do, is to set the correct type of speakers attached to the output audio card. This option allows you to obtain better sound on each output system. The property you have to set is // Create new Speakers
Speakers s = new Speakers();
// Set properties
s.Mono = false; // Sets as a mono speaker
s.Headphone = false; // Sets as headphones
s.Stereo = false; // Sets as generic stereo speakers
s.Quad = false; // Sets as quad system (two front, two rear)
s.FiveDotOne = false; // Sets as a 5.1 surround system
s.SevenDotOne = true; // Sets as a 7.1 surround system
s.Surround = false; // Sets as a generic surround system
dSound.SpeakerConfig = s;
Note: if you set the Choosing between sound cardsIn many systems there are more than one sound card. DirectSound 9 allows you to choose the correct one, arranging a way to select the default one, or to choose the card that the user wants. To enumerate and show the user the installed cards, do as follows (supposing that the list of sound cards is put into a private DevicesCollection devList = new DevicesCollection();
cmbAudioCards.Items.Clear();
for(int i = 0; i < devList.Count; i++) {
cmbAudioCards.Items.Add(devList[i].Description);
}
The first element is the default audio card that is always listed. The other items are the ‘physical’ audio cards. For example you can see:
When the user selects a specific card, you can rebuild the Device as follows (in the dSound = new Device(devList[cmbAudioCards.SelectedIndex].DriverGuid);
dSound.SetCooperativeLevel(this.Handle, CooperativeLevel.Priority);
// You have to recreate the sound (the descriptor d can be reused)
sound = new SecondaryBuffer(filePath, d, dSound);
Selecting different audio cards can effect the system performance: in the example above, the SoundBlaster Live! has in-hardware acceleration capabilities and supports upto 5.1 systems. Bluetooth audio is worst, and can cause a CPU load increment while applying effects or when managing 3D audio. Applying effects to the audio playbackOne of the most important features of DirectSound 9 is the possibility to apply real-time audio effects to the sounds in playback. You can also apply a virtually unlimited chain of effects (according to the system capabilities). All the effects are applied in-hardware whenever possible, otherwise emulated via-software (causing an important drop in the performance!). Remember to set the flag In DirectSound 9 there are – needless to say :) – 9 effects: Chorus, Compressor, Distortion, Echo, Flanger, Gargle, Interactive3DLevel2Reverb, ParamEqualizer, WavesReverb. I want to say that there is not much documentation about these effects, especially because each of them has different settings. The first thing is to create an array of EffectDescription[] fx = new EffectDescription[1];
In this example we use only one effect, but if you want, you can use more effects by creating an array long enough, and inserting one effect per element. Suppose you want to apply the Echo effect: fx[0].GuidEffectClass = DSoundHelper.StandardEchoGuid;
sound.SetEffects(fx);
Suppose now you want to apply the Parametric Equalizer effect: fx[0].GuidEffectClass = DSoundHelper.StandardParamEqGuid;
sound.SetEffects(fx);
Note: you can apply effects only when the sound is not played. As I reported above, each effect has different options. I will explain here how to set up the Parametric Equalizer effect: fx[0].GuidEffectClass = DSoundHelper.StandardParamEqGuid;
sound.SetEffects(fx);
ParamEqEffect eqEffect = (ParamEqEffect)sound.GetEffects(0);
EffectsParamEq eqParams = eqEffect.AllParameters;
// Specific properties!
eqParams.Bandwidth = 36; // Apply a gain on the highest frequency
eqParams.Gain = ParamEqEffect.GainMax;
eqEffect.AllParameters = eqParams;
Abstracting the procedure, you have to first create an array of effects with sound = new SecondaryBuffer(filePath, d, dSound);
For further info about the effects, please go through the MSDN Library. ConclusionsBy now you should have developed a little familiarity with a DirectSound device, the Effects and other options. DirectSound fits to playbacks of short sounds, such as explosions, shots and so on. If you want to play a long Wave sound you should use the namespace
|
||||||||||||||||||||||