public void WaveHeaderTest() { const uint TotalSize = 38; riffHeader[4] = (byte)((TotalSize & 0x000000FF) >> 0); riffHeader[5] = (byte)((TotalSize & 0x0000FF00) >> 8); riffHeader[6] = (byte)((TotalSize & 0x00FF0000) >> 16); riffHeader[7] = (byte)((TotalSize & 0xFF000000) >> 24); using (var handMadeWaveStream = new MemoryStream()) { handMadeWaveStream.Write(riffHeader, 0, riffHeader.Length); handMadeWaveStream.Write(waveFmt, 0, waveFmt.Length); handMadeWaveStream.Write(emptyData, 0, emptyData.Length); handMadeWaveStream.Seek(0, SeekOrigin.Begin); SoundStream waveStreamReader = null; Assert.DoesNotThrow(() => waveStreamReader = new SoundStream(handMadeWaveStream), "An error happened while reading of the wave file header."); var waveFormat = waveStreamReader.Format; Assert.AreEqual(waveFmt[8] + (waveFmt[9]<<8), (int)waveFormat.Encoding, "Audio formats do not match"); Assert.AreEqual(waveFmt[10] + (waveFmt[11] << 8), waveFormat.Channels, "Channel numbers do not match"); Assert.AreEqual(waveFmt[12] + (waveFmt[13] << 8) + (waveFmt[14] << 16) + (waveFmt[15] << 24), waveFormat.SampleRate, "Sample rates do not match"); Assert.AreEqual(waveFmt[16] + (waveFmt[17] << 8) + (waveFmt[18] << 16) + (waveFmt[19] << 24), waveFormat.AverageBytesPerSecond, "Byte rates do not match"); Assert.AreEqual(waveFmt[20] + (waveFmt[21] << 8), waveFormat.BlockAlign, "Block aligns do not match"); Assert.AreEqual(waveFmt[22] + (waveFmt[23] << 8), waveFormat.BitsPerSample, "Bits per samples do not match"); } }
private void LoadWaveFileIntoBuffers(out GCHandle handle, out DynSoundData sound, string filename) { sound = new DynSoundData(); WaveFormat dataFormat; using (var stream = AssetManager.FileProvider.OpenStream(filename, VirtualFileMode.Open, VirtualFileAccess.Read)) using (var memoryStream = new MemoryStream(new byte[stream.Length])) { stream.CopyTo(memoryStream); memoryStream.Position = 0; var waveStreamReader = new SoundStream(memoryStream); dataFormat = waveStreamReader.Format; sound.Data = new byte[waveStreamReader.Length]; handle = GCHandle.Alloc(sound.Data, GCHandleType.Pinned); if (waveStreamReader.Read(sound.Data, 0, (int)waveStreamReader.Length) != waveStreamReader.Length) throw new AudioSystemInternalException("The data length read in wave soundStream does not correspond to the stream's length."); } sound.Instance = new DynamicSoundEffectInstance(defaultEngine, dataFormat.SampleRate, (AudioChannels)dataFormat.Channels, (AudioDataEncoding)dataFormat.BitsPerSample); }
public void TestPlayableInterface() { WaveFormat dataFormat; using (var stream = AssetManager.FileProvider.OpenStream("EffectFishLamp", VirtualFileMode.Open, VirtualFileAccess.Read)) { var memoryStream = new MemoryStream((int)stream.Length); stream.CopyTo(memoryStream); memoryStream.Position = 0; var waveStreamReader = new SoundStream(memoryStream); dataFormat = waveStreamReader.Format; bufferData = new byte[waveStreamReader.Length]; if (waveStreamReader.Read(bufferData, 0, (int)waveStreamReader.Length) != waveStreamReader.Length) throw new AudioSystemInternalException("The data length read in wave soundStream does not correspond to the stream's length."); } dynSEInstance = new DynamicSoundEffectInstance(defaultEngine, dataFormat.SampleRate, (AudioChannels)dataFormat.Channels, (AudioDataEncoding)dataFormat.BitsPerSample); dynSEInstance.BufferNeeded += SubmitBuffer; ////////////////// // 1. Test play dynSEInstance.Play(); Utilities.Sleep(2000); Assert.AreEqual(SoundPlayState.Playing, dynSEInstance.PlayState, "Music is not playing"); ////////////////// // 2. Test Pause dynSEInstance.Pause(); Utilities.Sleep(600); Assert.AreEqual(SoundPlayState.Paused, dynSEInstance.PlayState, "Music is not Paused"); dynSEInstance.Play(); Utilities.Sleep(1000); ////////////////// // 2. Test Stop dynSEInstance.Stop(); bufferCount = 0; Utilities.Sleep(600); Assert.AreEqual(SoundPlayState.Stopped, dynSEInstance.PlayState, "Music is not Stopped"); dynSEInstance.Play(); Utilities.Sleep(9000); /////////////////// // 3. Test ExitLoop Assert.DoesNotThrow(dynSEInstance.ExitLoop, "ExitLoop crached"); /////////////// // 4. Volume var value = 1f; var sign = -1f; while (value <= 1f) { dynSEInstance.Volume = value; value += sign * 0.01f; Utilities.Sleep(30); if (value < -0.2) sign = 1f; } Utilities.Sleep(2000); ////////////////// // 5.Pan value = 0; sign = -1f; while (value <= 1f) { dynSEInstance.Pan = value; value += sign * 0.01f; Utilities.Sleep(30); if (value < -1.2) sign = 1f; } dynSEInstance.Pan = 0; Utilities.Sleep(2000); //////////////////////////////////////////////////////////////////////////// // 7. Wait until the end of the stream to check that there are not crashes Utilities.Sleep(50000); dynSEInstance.Dispose(); }
public void WaveDataTest() { const uint DataSize = 4 * 512; const uint TotalSize = DataSize + 38; riffHeader[4] = (byte)((TotalSize & 0x000000FF) >> 0); riffHeader[5] = (byte)((TotalSize & 0x0000FF00) >> 8); riffHeader[6] = (byte)((TotalSize & 0x00FF0000) >> 16); riffHeader[7] = (byte)((TotalSize & 0xFF000000) >> 24); using (var handMadeWaveStream = new MemoryStream()) { handMadeWaveStream.Write(riffHeader, 0, riffHeader.Length); handMadeWaveStream.Write(waveFmt, 0, waveFmt.Length); // generate the data header var dataHeader = new byte[] { 0x64, 0x61, 0x74, 0x61, // data (byte)((DataSize & 0x000000FF) >> 0), (byte)((DataSize & 0x0000FF00) >> 8), (byte)((DataSize & 0x00FF0000) >> 16), (byte)((DataSize & 0xFF000000) >> 24) }; handMadeWaveStream.Write(dataHeader, 0, dataHeader.Length); // generate the data var data = new byte[DataSize]; for (var i = 0; i < data.Length; ++i) data[i] = (byte)i; handMadeWaveStream.Write(data, 0, data.Length); handMadeWaveStream.Seek(0, SeekOrigin.Begin); SoundStream waveStreamReader = null; Assert.DoesNotThrow(() => waveStreamReader = new SoundStream(handMadeWaveStream), "An error happened while reading of the wave file."); var readData = new byte[waveStreamReader.Length]; waveStreamReader.Read(readData, 0, (int)waveStreamReader.Length); Assert.AreEqual(data, readData, "Expected data and read data are not the same."); } }
internal void Load(Stream stream) { if (stream == null) throw new ArgumentNullException("stream"); if (AudioEngine.IsDisposed) throw new ObjectDisposedException("Audio Engine"); // create a native memory stream to extract the lz4 audio stream. nativeDataBuffer = Utilities.AllocateMemory((int)stream.Length); var nativeStream = new NativeMemoryStream(nativeDataBuffer, stream.Length); stream.CopyTo(nativeStream); nativeStream.Position = 0; var waveStreamReader = new SoundStream(nativeStream); var waveFormat = waveStreamReader.Format; if (waveFormat.Channels > 2) throw new NotSupportedException("The wave file contains more than 2 data channels. Only mono and stereo formats are currently supported."); if (waveFormat.Encoding != WaveFormatEncoding.Pcm || waveFormat.BitsPerSample != 16) throw new NotSupportedException("The wave file audio format is not supported. Only 16bits PCM encoded formats are currently supported."); WaveFormat = waveFormat; WaveDataPtr = nativeDataBuffer + (int)nativeStream.Position; WaveDataSize = (int)waveStreamReader.Length; Name = "Sound Effect " + soundEffectCreationCount; AdaptAudioDataImpl(); // register the sound to the AudioEngine so that it will be properly freed if AudioEngine is disposed before this. AudioEngine.RegisterSound(this); Interlocked.Increment(ref soundEffectCreationCount); }