コード例 #1
0
        public void OutputChannelCountIsCorrect()
        {
            var input1 = new TestSampleProvider(32000, 1);
            var mp     = new MultiplexingSampleProvider(new ISampleProvider[] { input1 }, 3);

            Assert.AreEqual(3, mp.OutputChannelCount);
        }
コード例 #2
0
        public void HasConnectInputToOutputMethod()
        {
            var input1 = new TestSampleProvider(32000, 2);
            var mp     = new MultiplexingSampleProvider(new ISampleProvider[] { input1 }, 1);

            mp.ConnectInputToOutput(1, 0);
        }
コード例 #3
0
        public void ConnectInputToOutputThrowsExceptionForInvalidOutput()
        {
            var input1 = new TestSampleProvider(32000, 2);
            var mp     = new MultiplexingSampleProvider(new ISampleProvider[] { input1 }, 1);

            Assert.Throws <ArgumentException>(() => mp.ConnectInputToOutput(1, 1));
        }
コード例 #4
0
        public void StereoInTwoOutShouldCopyStereo()
        {
            var input1 = new TestSampleProvider(32000, 2);

            float[] expected = new float[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 };
            var     mp       = new MultiplexingSampleProvider(new ISampleProvider[] { input1 }, 2);
        }
コード例 #5
0
        public void PerformanceTest()
        {
            var input1 = new TestSampleProvider(32000, 1);
            var input2 = new TestSampleProvider(32000, 1);
            var input3 = new TestSampleProvider(32000, 1);
            var input4 = new TestSampleProvider(32000, 1);
            var mp     = new MultiplexingSampleProvider(new ISampleProvider[] { input1, input2, input3, input4 }, 4);

            mp.ConnectInputToOutput(0, 3);
            mp.ConnectInputToOutput(1, 2);
            mp.ConnectInputToOutput(2, 1);
            mp.ConnectInputToOutput(3, 0);

            float[]   buffer   = new float[input1.WaveFormat.AverageBytesPerSecond / 4];
            Stopwatch s        = new Stopwatch();
            var       duration = s.Time(() =>
            {
                // read one hour worth of audio
                for (int n = 0; n < 60 * 60; n++)
                {
                    mp.Read(buffer, 0, buffer.Length);
                }
            });

            Console.WriteLine("Performance test took {0}ms", duration);
        }
コード例 #6
0
        private void EnsureReadsExpected(MultiplexingSampleProvider mp, float[] expected)
        {
            float[] buffer = new float[expected.Length];
            var     read   = mp.Read(buffer, 0, expected.Length);

            Assert.AreEqual(expected.Length, read);
            Assert.AreEqual(expected, buffer);
        }
コード例 #7
0
        public void OneInOneOutShouldCopyInReadMethod()
        {
            var input1 = new TestSampleProvider(32000, 1);

            float[] expected = new float[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            var     mp       = new MultiplexingSampleProvider(new ISampleProvider[] { input1 }, 1);

            mp.AssertReadsExpected(expected);
        }
コード例 #8
0
        public void OneInTwoOutShouldConvertMonoToStereo()
        {
            var input1 = new TestSampleProvider(32000, 1);

            float[] expected = new float[] { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9 };
            var     mp       = new MultiplexingSampleProvider(new ISampleProvider[] { input1 }, 2);

            mp.AssertReadsExpected(expected);
        }
コード例 #9
0
        public void TwoInOneOutShouldSelectLeftChannel()
        {
            var input1 = new TestSampleProvider(32000, 2);

            float[] expected = new float[] { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 };
            var     mp       = new MultiplexingSampleProvider(new ISampleProvider[] { input1 }, 1);

            mp.AssertReadsExpected(expected);
        }
コード例 #10
0
        public void TwoInOneOutShouldCanBeConfiguredToSelectRightChannel()
        {
            var input1 = new TestSampleProvider(32000, 2);

            float[] expected = new float[] { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };
            var     mp       = new MultiplexingSampleProvider(new ISampleProvider[] { input1 }, 1);

            mp.ConnectInputToOutput(1, 0);
            mp.AssertReadsExpected(expected);
        }
コード例 #11
0
        public void ReadReturnsCountIfOneInputHasEndedButTheOtherHasnt()
        {
            var input1 = new TestSampleProvider(32000, 1, 0);
            var input2 = new TestSampleProvider(32000, 1);

            float[] expected = new float[] { 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7 };
            var     mp       = new MultiplexingSampleProvider(new ISampleProvider[] { input1, input2 }, 2);

            mp.AssertReadsExpected(expected);
        }
コード例 #12
0
        public void OneInOneOutShouldCopyWaveFormat()
        {
            var input1          = new Mock <ISampleProvider>();
            var inputWaveFormat = WaveFormat.CreateIeeeFloatWaveFormat(32000, 1);

            input1.Setup(x => x.WaveFormat).Returns(inputWaveFormat);
            var mp = new MultiplexingSampleProvider(new ISampleProvider[] { input1.Object }, 1);

            Assert.AreEqual(inputWaveFormat, mp.WaveFormat);
        }
コード例 #13
0
        public void StereoInTwoOutCanBeConfiguredToSwapLeftAndRight()
        {
            var input1 = new TestSampleProvider(32000, 2);

            float[] expected = new float[] { 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10 };
            var     mp       = new MultiplexingSampleProvider(new ISampleProvider[] { input1 }, 2);

            mp.ConnectInputToOutput(0, 1);
            mp.ConnectInputToOutput(1, 0);
            mp.AssertReadsExpected(expected);
        }
コード例 #14
0
        public void ReadReturnsZeroIfSingleInputHasReachedEnd()
        {
            var input1 = new TestSampleProvider(32000, 1, 0);

            float[] expected = new float[] { };
            var     mp       = new MultiplexingSampleProvider(new ISampleProvider[] { input1 }, 1);

            float[] buffer = new float[10];
            var     read   = mp.Read(buffer, 0, buffer.Length);

            Assert.AreEqual(0, read);
        }
コード例 #15
0
        public void TwoMonoInTwoOutShouldCreateStereo()
        {
            var input1 = new TestSampleProvider(32000, 1);
            var input2 = new TestSampleProvider(32000, 1)
            {
                Position = 100
            };

            float[] expected = new float[] { 0, 100, 1, 101, 2, 102, 3, 103, 4, 104, 5, 105 };
            var     mp       = new MultiplexingSampleProvider(new ISampleProvider[] { input1, input2 }, 2);

            mp.AssertReadsExpected(expected);
        }
コード例 #16
0
            public AudioSampleBuffer Build()
            {
                BuildOutputMap();

                multiplexer = new MultiplexingSampleProvider(inputs, outputMap.Length);
                for (int i = 0; i < outputMap.Length; i++)
                {
                    var input = outputMap[i];
                    multiplexer.ConnectInputToOutput(input, i);
                    AudioEngine.Log($" ch: {input} ==> {i}");
                }

                return(new AudioSampleBuffer(multiplexer.WaveFormat)
                {
                    Processor = this
                });
            }
コード例 #17
0
        public void ShouldZeroOutBufferIfInputStopsShort()
        {
            var input1 = new TestSampleProvider(32000, 1, 6);

            float[] expected = new float[] { 0, 1, 2, 3, 4, 5, 0, 0, 0, 0 };
            var     mp       = new MultiplexingSampleProvider(new ISampleProvider[] { input1 }, 1);

            float[] buffer = new float[10];
            for (int n = 0; n < buffer.Length; n++)
            {
                buffer[n] = 99;
            }
            var read = mp.Read(buffer, 0, buffer.Length);

            Assert.AreEqual(6, read);
            Assert.AreEqual(expected, buffer);
        }
コード例 #18
0
 public static ISampleProvider AdjustChannelCount(ISampleProvider snd, UInt32 AudioChannelCount)
 {
     if (AudioChannelCount == 1)
     {
         if (snd.WaveFormat.Channels == 1)
         {
             return(snd);
         }
         return(new MultiChannelToMonoSampleProvider(snd));
     }
     else if (AudioChannelCount == 2)
     {
         if (snd.WaveFormat.Channels == 2)
         {
             return(snd);
         }
         if (snd.WaveFormat.Channels == 1)
         {
             return(new MonoToStereoSampleProvider(snd));
         }
         var sInput = new MultiplexingSampleProvider(new ISampleProvider[] { snd }, 2);
         if (snd.WaveFormat.Channels == 6)
         {
             // 5.1 sound
             sInput.ConnectInputToOutput(0, 0);  // FRONT-LEFT -> LEFT
             sInput.ConnectInputToOutput(1, 1);  // FRONT-RIGHT -> RIGHT
             sInput.ConnectInputToOutput(2, 0);  // CENTRE -> LEFT
             sInput.ConnectInputToOutput(2, 1);  // CENTRE -> RIGHT
                                                 // sInput.ConnectInputToOutput(3, ?);   // LFE -> ???
             sInput.ConnectInputToOutput(3, 0);  // LOW-FREQ -> LEFT
             sInput.ConnectInputToOutput(3, 1);  // LOW-FREQ -> RIGHT
             sInput.ConnectInputToOutput(4, 0);  // SURROUND-LEFT -> LEFT
             sInput.ConnectInputToOutput(5, 1);  // SURROUND-RIGHT -> RIGHT
         }
         else if (snd.WaveFormat.Channels == 8)
         {
             // 7.1 sound (assuming standard order, but alternative still goes to same stereo channel)
             // L, R, C, LFE, RL, RR, SL, SR
             sInput.ConnectInputToOutput(0, 0);  // LEFT
             sInput.ConnectInputToOutput(1, 1);  // RIGHT
             sInput.ConnectInputToOutput(2, 0);  // CENTRE
             sInput.ConnectInputToOutput(2, 1);
             sInput.ConnectInputToOutput(3, 0);  // LOW-FREQ
             sInput.ConnectInputToOutput(3, 1);
             sInput.ConnectInputToOutput(4, 0);  // REAR-LEFT
             sInput.ConnectInputToOutput(5, 1);  // REAR-RIGHT
             sInput.ConnectInputToOutput(6, 0);  // SIDE-LEFT
             sInput.ConnectInputToOutput(7, 1);  // SIDE-RIGHT
         }
         else
         {
             throw new UnsupportedAudioException(I18NString.Lookup("Audio_ChannelConversionFailed"));
         }
         return(sInput);
     }
     else if (AudioChannelCount == 6)
     {
         if (snd.WaveFormat.Channels == 6)
         {
             return(snd);
         }
         if (snd.WaveFormat.Channels == 1)
         {
             return(new MonoToMultiChannelSampleProvider(snd, 6));
         }
         var sInput = new MultiplexingSampleProvider(new ISampleProvider[] { snd }, 6);
         if (snd.WaveFormat.Channels == 8)
         {
             sInput.ConnectInputToOutput(0, 0);
             sInput.ConnectInputToOutput(1, 1);
             sInput.ConnectInputToOutput(2, 2);
             sInput.ConnectInputToOutput(3, 3);
             sInput.ConnectInputToOutput(4, 4);
             sInput.ConnectInputToOutput(5, 5);
             sInput.ConnectInputToOutput(6, 4);
             sInput.ConnectInputToOutput(7, 5);
         }
         else if (snd.WaveFormat.Channels == 2)
         {
             sInput.ConnectInputToOutput(0, 0);
             sInput.ConnectInputToOutput(1, 1);
             sInput.ConnectInputToOutput(0, 2);
             sInput.ConnectInputToOutput(1, 2);
             sInput.ConnectInputToOutput(0, 3);
             sInput.ConnectInputToOutput(1, 3);
             sInput.ConnectInputToOutput(0, 4);
             sInput.ConnectInputToOutput(1, 5);
         }
         else
         {
             throw new UnsupportedAudioException(I18NString.Lookup("Audio_ChannelConversionFailed"));
         }
         return(sInput);
     }
     else if (AudioChannelCount == 8)
     {
         if (snd.WaveFormat.Channels == 8)
         {
             return(snd);
         }
         if (snd.WaveFormat.Channels == 1)
         {
             return(new MonoToMultiChannelSampleProvider(snd, 8));
         }
         var sInput = new MultiplexingSampleProvider(new ISampleProvider[] { snd }, 8);
         if (snd.WaveFormat.Channels == 6)
         {
             sInput.ConnectInputToOutput(0, 0);
             sInput.ConnectInputToOutput(1, 1);
             sInput.ConnectInputToOutput(2, 2);
             sInput.ConnectInputToOutput(3, 3);
             sInput.ConnectInputToOutput(4, 4);
             sInput.ConnectInputToOutput(5, 5);
             sInput.ConnectInputToOutput(4, 6);
             sInput.ConnectInputToOutput(5, 7);
         }
         else if (snd.WaveFormat.Channels == 2)
         {
             sInput.ConnectInputToOutput(0, 0);
             sInput.ConnectInputToOutput(1, 1);
             sInput.ConnectInputToOutput(0, 2);
             sInput.ConnectInputToOutput(1, 2);
             sInput.ConnectInputToOutput(0, 3);
             sInput.ConnectInputToOutput(1, 3);
             sInput.ConnectInputToOutput(0, 4);
             sInput.ConnectInputToOutput(1, 5);
             sInput.ConnectInputToOutput(0, 6);
             sInput.ConnectInputToOutput(0, 7);
         }
         else
         {
             throw new UnsupportedAudioException(I18NString.Lookup("Audio_ChannelConversionFailed"));
         }
         return(sInput);
     }
     else
     {
         throw new UnsupportedAudioException(I18NString.Lookup("Audio_ChannelConversionFailed"));
     }
 }