コード例 #1
0
        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");
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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();
        }
コード例 #4
0
        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.");
            }
        }
コード例 #5
0
ファイル: SoundEffect.cs プロジェクト: Powerino73/paradox
        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);
        }