protected override bool LoadAudioFile(string audioFile, DirectSound directSound) { try { // Open the wave file in binary. var reader = new BinaryReader(File.OpenRead(SystemConfiguration.DataFilePath + audioFile)); // Read in the wave file header. chunkId = new string(reader.ReadChars(4)); chunkSize = reader.ReadInt32(); format = new string(reader.ReadChars(4)); subChunkId = new string(reader.ReadChars(4)); subChunkSize = reader.ReadInt32(); audioFormat = (WaveFormatEncoding )reader.ReadInt16(); numChannels = reader.ReadInt16(); sampleRate = reader.ReadInt32(); bytesPerSecond = reader.ReadInt32(); blockAlign = reader.ReadInt16(); bitsPerSample = reader.ReadInt16(); dataChunkId = new string(reader.ReadChars(4)); dataSize = reader.ReadInt32(); // Check that the chunk ID is the RIFF format // and the file format is the WAVE format // and sub chunk ID is the fmt format // and the audio format is PCM // and the wave file was recorded in stereo format // and at a sample rate of 44.1 KHz // and at 16 bit format // and there is the data chunk header. // Otherwise return false. if (chunkId != "RIFF" || format != "WAVE" || subChunkId.Trim() != "fmt" || audioFormat != WaveFormatEncoding.Pcm || numChannels != 2 || sampleRate != 44100 || bitsPerSample != 16 || dataChunkId != "data") return false; // Set the buffer description of the secondary sound buffer that the wave file will be loaded onto and the wave format. var buffer = new SoundBufferDescription(); buffer.Flags = BufferFlags.ControlVolume; buffer.BufferBytes = dataSize; buffer.Format = new WaveFormat(44100, 16, 2); buffer.AlgorithmFor3D = Guid.Empty; // Create a temporary sound buffer with the specific buffer settings. _SecondaryBuffer = new SecondarySoundBuffer(directSound, buffer); // Read in the wave file data into the temporary buffer. var waveData = reader.ReadBytes(dataSize); // Close the reader reader.Close(); // Lock the secondary buffer to write wave data into it. DataStream waveBufferData2; var waveBufferData1 = _SecondaryBuffer.Lock(0, dataSize, LockFlags.None, out waveBufferData2); // Copy the wave data into the buffer. waveBufferData1.Write(waveData, 0, dataSize); // Unlock the secondary buffer after the data has been written to it. var result = _SecondaryBuffer.Unlock(waveBufferData1, waveBufferData2); if (result != Result.Ok) return false; } catch { return false; } return true; }
static void Main(string[] args) { DirectSound directSound = new DirectSound(); var form = new Form(); form.Text = "SharpDX - DirectSound Demo"; // Set Cooperative Level to PRIORITY (priority level can call the SetFormat and Compact methods) // directSound.SetCooperativeLevel(form.Handle, CooperativeLevel.Priority); // Create PrimarySoundBuffer var primaryBufferDesc = new SoundBufferDescription(); primaryBufferDesc.Flags = BufferFlags.PrimaryBuffer; primaryBufferDesc.AlgorithmFor3D = Guid.Empty; var primarySoundBuffer = new PrimarySoundBuffer(directSound, primaryBufferDesc); // Play the PrimarySound Buffer primarySoundBuffer.Play(0, PlayFlags.Looping); // Default WaveFormat Stereo 44100 16 bit WaveFormat waveFormat = new WaveFormat(); // Create SecondarySoundBuffer var secondaryBufferDesc = new SoundBufferDescription(); secondaryBufferDesc.BufferBytes = waveFormat.ConvertLatencyToByteSize(60000); secondaryBufferDesc.Format = waveFormat; secondaryBufferDesc.Flags = BufferFlags.GetCurrentPosition2 | BufferFlags.ControlPositionNotify | BufferFlags.GlobalFocus | BufferFlags.ControlVolume | BufferFlags.StickyFocus; secondaryBufferDesc.AlgorithmFor3D = Guid.Empty; var secondarySoundBuffer = new SecondarySoundBuffer(directSound, secondaryBufferDesc); // Get Capabilties from secondary sound buffer var capabilities = secondarySoundBuffer.Capabilities; // Lock the buffer DataStream dataPart2; var dataPart1 =secondarySoundBuffer.Lock(0, capabilities.BufferBytes, LockFlags.EntireBuffer, out dataPart2); // Fill the buffer with some sound int numberOfSamples = capabilities.BufferBytes/waveFormat.BlockAlign; for (int i = 0; i < numberOfSamples; i++) { double vibrato = Math.Cos(2 * Math.PI * 10.0 * i /waveFormat.SampleRate); short value = (short) (Math.Cos(2*Math.PI*(220.0 + 4.0 * vibrato)*i/waveFormat.SampleRate)*16384); // Not too loud dataPart1.Write(value); dataPart1.Write(value); } // Unlock the buffer secondarySoundBuffer.Unlock(dataPart1, dataPart2); // Play the song secondarySoundBuffer.Play(0, PlayFlags.Looping); Application.Run(form); }