public void FailsWithMissingBitDepth()
        {
            var request = new AudioUtilityRequest
            {
                //BitDepth = 16,
                TargetSampleRate = 22050,
                Channels         = new[] { 1, 2, 3, 4 },

                //BandPass
            };

            var tester = new FfmpegRawPcmAudioUtilityTester();

            TestHelper.ExceptionMatches <InvalidOperationException>(
                () =>
            {
                tester.InvokeCheckRequestValid(
                    this.source,
                    MediaTypes.GetMediaType(this.source.Extension),
                    this.output,
                    MediaTypes.GetMediaType(this.output.Extension),
                    request);
            },
                "A BitDepth must be supplied");
        }
        public void FailsWithInvalidBitDepth()
        {
            var request = new AudioUtilityRequest
            {
                BitDepth         = 64,
                TargetSampleRate = 22050,
                Channels         = new[] { 1, 2, 3, 4 },

                //BandPass
            };

            var tester = new FfmpegRawPcmAudioUtilityTester();

            TestHelper.ExceptionMatches <BitDepthOperationNotImplemented>(
                () =>
            {
                tester.InvokeCheckRequestValid(
                    this.source,
                    MediaTypes.GetMediaType(this.source.Extension),
                    this.output,
                    MediaTypes.GetMediaType(this.output.Extension),
                    request);
            },
                "Supplied bit depth of 64");
        }
Example #3
0
        public void SegmentsMp3Correctly2Sox()
        {
            var expected = new AudioUtilityInfo
            {
                Duration      = TimeSpan.FromMinutes(3) + TimeSpan.FromSeconds(20),
                SampleRate    = 22050,
                ChannelCount  = 1,
                MediaType     = MediaTypes.MediaTypeMp3,
                BitsPerSecond = 32000,
            };

            var request = new AudioUtilityRequest
            {
                MixDownToMono = true,
                OffsetStart   = TimeSpan.FromSeconds(15),
                OffsetEnd     = TimeSpan.FromMinutes(3) + TimeSpan.FromSeconds(35),
            };

            var util = TestHelper.GetAudioUtilitySox();

            var source = TestHelper.GetAudioFile("Currawongs_curlew_West_Knoll_Bees_20091102-183000.mp3");
            var output = PathHelper.GetTempFile(MediaTypes.ExtMp3);

            util.Modify(source, MediaTypes.GetMediaType(source.Extension), output, MediaTypes.GetMediaType(output.Extension), request);

            var actual = util.Info(output);

            File.Delete(output.FullName);

            TestHelper.CheckAudioUtilityInfo(expected, actual);
        }
        public void SegmentsWavCorrectly5Master()
        {
            var expected = new AudioUtilityInfo
            {
                Duration      = TimeSpan.FromSeconds(90),
                SampleRate    = 17460,
                ChannelCount  = 1,
                MediaType     = MediaTypes.MediaTypeWav,
                BitsPerSecond = 279000,
            };

            var request = new AudioUtilityRequest
            {
                MixDownToMono    = true,
                OffsetStart      = TimeSpan.FromSeconds(27),
                OffsetEnd        = TimeSpan.FromSeconds(117),
                TargetSampleRate = 17460,
            };

            var util = TestHelper.GetAudioUtility();

            var source = TestHelper.GetAudioFile("FemaleKoala MaleKoala.wav");
            var output = PathHelper.GetTempFile(MediaTypes.ExtWav);

            util.Modify(source, MediaTypes.GetMediaType(source.Extension), output, MediaTypes.GetMediaType(output.Extension), request);

            var actual = util.Info(output);

            File.Delete(output.FullName);

            TestHelper.CheckAudioUtilityInfo(expected, actual);
        }
Example #5
0
        public void SegmentsWavCorrectly6Shntool()
        {
            var expected = new AudioUtilityInfo
            {
                Duration      = TimeSpan.FromSeconds(93),
                SampleRate    = 17460,
                ChannelCount  = 1,
                MediaType     = MediaTypes.MediaTypeWav,
                BitsPerSecond = 279000,
            };

            var request = new AudioUtilityRequest
            {
                //MixDownToMono = false,
                //Channel = 2,

                OffsetStart = TimeSpan.FromSeconds(27),

                //TargetSampleRate = 17460,
            };

            var util = TestHelper.GetAudioUtilityShntool();

            var source = TestHelper.GetAudioFile("geckos.wav");
            var output = PathHelper.GetTempFile(MediaTypes.ExtWav);

            util.Modify(source, MediaTypes.GetMediaType(source.Extension), output, MediaTypes.GetMediaType(output.Extension), request);

            var actual = util.Info(output);

            File.Delete(output.FullName);

            TestHelper.CheckAudioUtilityInfo(expected, actual);
        }
Example #6
0
        // Non functional / not used / not tested - jkust an idea
        private static string FormatChannelSelection(AudioUtilityRequest request)
        {
            throw new NotImplementedException();

            // -map_channel [input_file_id.stream_specifier.channel_id|-1][:output_file_id.stream_specifier]
            // each -map_channel corresponds to an **output** channel. order is important.
            // -ac 1 is a general mix down to mono

            var map = string.Empty;

            if (request.Channels.NotNull())
            {
                // minus 1 because ffmpeg channel specification starts at zero but our specification starts at 1
                map = string.Join(string.Empty, request.Channels.Select(c => $" -map_channel 0.0.{c - 1}"));
            }

            var mixDown = request.MixDownToMono.HasValue && request.MixDownToMono.Value;

            if (mixDown)
            {
                // mix down to mono
                map = " -ac 1";
            }

            return(map);
        }
Example #7
0
        public static void SeparateChannels(
            Arguments args,
            FileInfo ipFile,
            out double[] samplesL,
            out double[] samplesR,
            out double epsilon)
        {
            //you'd then use wavreader on the resulting preparedFile
            //the channel select functionality does not currently exist in AnalyzeLongRecording.   I need to add it.
            var request = new AudioUtilityRequest
            {
                OffsetStart      = args.StartOffset,
                OffsetEnd        = args.EndOffset,
                TargetSampleRate = args.SamplingRate,
                Channels         = new[] { 1, 2 },
                MixDownToMono    = false,
            };
            var audioFile = AudioFilePreparer.PrepareFile(args.OpDir, ipFile, args.OutputMediaType, request, args.OpDir).TargetInfo.SourceFile;

            var wavReader = new WavReader(audioFile);

            var recording = new AudioRecording(wavReader);

            samplesL = recording.WavReader.GetChannel(0);
            samplesR = recording.WavReader.GetChannel(1);
            epsilon  = Math.Pow(0.5, recording.BitsPerSample - 1);
        }
Example #8
0
        public void SegmentsWavpackCorrectly7Master()
        {
            var expected = new AudioUtilityInfo
            {
                Duration      = TimeSpan.FromMinutes(10) + TimeSpan.FromSeconds(0),
                SampleRate    = 17460,
                ChannelCount  = 1,
                MediaType     = MediaTypes.MediaTypeWav,
                BitsPerSecond = 279000,
            };

            var request = new AudioUtilityRequest
            {
                MixDownToMono    = true,
                TargetSampleRate = 17460,
            };

            var util = TestHelper.GetAudioUtility();

            var source = TestHelper.GetAudioFile("f969b39d-2705-42fc-992c-252a776f1af3_090705-0600.wv");
            var output = PathHelper.GetTempFile(MediaTypes.ExtWav);

            util.Modify(source, MediaTypes.GetMediaType(source.Extension), output, MediaTypes.GetMediaType(output.Extension), request);

            var actual = util.Info(output);

            File.Delete(output.FullName);

            TestHelper.CheckAudioUtilityInfo(expected, actual);
        }
Example #9
0
        public void SegmentsWavpackCorrectly3Wavunpack()
        {
            var expected = new AudioUtilityInfo
            {
                Duration      = TimeSpan.FromSeconds(55),
                SampleRate    = 22050,
                ChannelCount  = 1,
                MediaType     = MediaTypes.MediaTypeWav,
                BitsPerSecond = 353000,
            };

            var request = new AudioUtilityRequest
            {
                MixDownToMono = false,
                OffsetStart   = TimeSpan.FromSeconds(0),
                OffsetEnd     = TimeSpan.FromSeconds(55),

                //SampleRate = 11025
            };

            var source = TestHelper.GetAudioFile("f969b39d-2705-42fc-992c-252a776f1af3_090705-0600.wv");
            var output = PathHelper.GetTempFile(MediaTypes.ExtWav);

            TestHelper.GetAudioUtilityWavunpack().Modify(source, MediaTypes.GetMediaType(source.Extension), output, MediaTypes.GetMediaType(output.Extension), request);

            var actual = TestHelper.GetAudioUtility().Info(output);

            File.Delete(output.FullName);

            TestHelper.CheckAudioUtilityInfo(expected, actual);
        }
Example #10
0
        public static void Modify(
            string filename,
            AudioUtilityInfo sourceExpected,
            AudioUtilityRequest request,
            string outputMimeType,
            AudioUtilityInfo outputExpected,
            Action <AudioUtilityInfo, AudioUtilityInfo> additionalTests = null)
        {
            var source = PathHelper.GetTestAudioFile(filename);

            var destExtension  = MediaTypes.GetExtension(outputMimeType);
            var outputFilename = Path.GetFileNameWithoutExtension(filename) + "_modified." + destExtension;

            foreach (var util in new[] { TestHelper.GetAudioUtility() })
            {
                var dir    = PathHelper.GetTempDir();
                var output = new FileInfo(Path.Combine(dir.FullName, outputFilename));

                util.Modify(source, MediaTypes.GetMediaType(source.Extension), output, outputMimeType, request);

                var sourceInfo = util.Info(source);

                TestHelper.CheckAudioUtilityInfo(sourceExpected, sourceInfo);

                var outputInfo     = util.Info(output);
                var outputInfoText = GetDurationInfo(outputInfo);

                additionalTests?.Invoke(sourceExpected, sourceInfo);

                PathHelper.DeleteTempDir(dir);
            }
        }
Example #11
0
        /// <summary>
        /// Prepare an audio file. This will be a single segment of a larger audio file, modified based on the analysisSettings.
        /// </summary>
        /// <param name="outputDirectory">
        /// The analysis Base Directory.
        /// </param>
        /// <param name="source">
        /// The source audio file.
        /// </param>
        /// <param name="outputMediaType">
        /// The output Media Type.
        /// </param>
        /// <param name="startOffset">
        /// The start Offset from start of entire original file.
        /// </param>
        /// <param name="endOffset">
        /// The end Offset from start of entire original file.
        /// </param>
        /// <param name="targetSampleRateHz">
        /// The target Sample Rate Hz.
        /// </param>
        /// <returns>
        /// The prepared file. The returned FileSegment will have the targetFile and OriginalFileDuration set -
        /// these are the path to the segmented file and the duration of the segmented file.
        /// The start and end offsets will not be set.
        /// </returns>
        public async Task <FileSegment> PrepareFile(
            DirectoryInfo outputDirectory,
            string source,
            string outputMediaType,
            TimeSpan startOffset,
            TimeSpan endOffset,
            int targetSampleRateHz)
        {
            return(await Task.Run(() =>
            {
                FileInfo sourceFileInfo = source.ToFileInfo();

                var request = new AudioUtilityRequest
                {
                    OffsetStart = startOffset,
                    OffsetEnd = endOffset,
                    TargetSampleRate = targetSampleRateHz,
                };
                var preparedFile = AudioFilePreparer.PrepareFile(
                    outputDirectory,
                    sourceFileInfo,
                    outputMediaType,
                    request,
                    TempFileHelper.TempDir(),
                    oldFormat: this.useOldNamingFormat);

                return new FileSegment(
                    preparedFile.TargetInfo.SourceFile,
                    preparedFile.TargetInfo.SampleRate.Value,
                    preparedFile.TargetInfo.Duration.Value);
            }));
        }
Example #12
0
        public void SegmentsMp3Correctly6Master()
        {
            var expected = new AudioUtilityInfo
            {
                Duration      = TimeSpan.FromSeconds(134.6),
                SampleRate    = 44100,
                ChannelCount  = 1,
                MediaType     = MediaTypes.MediaTypeMp3,
                BitsPerSecond = 64000,
            };

            var request = new AudioUtilityRequest
            {
                MixDownToMono    = false,
                Channels         = 2.AsArray(),
                OffsetStart      = TimeSpan.FromSeconds(27),
                TargetSampleRate = 44100,
            };

            var util = TestHelper.GetAudioUtility();

            var source = TestHelper.GetAudioFile("A French Fiddle Speaks.mp3");
            var output = PathHelper.GetTempFile(MediaTypes.ExtMp3);

            util.Modify(source, MediaTypes.GetMediaType(source.Extension), output, MediaTypes.GetMediaType(output.Extension), request);

            var actual = util.Info(output);

            File.Delete(output.FullName);

            TestHelper.CheckAudioUtilityInfo(expected, actual);
        }
        /// <summary>
        /// Prepare an audio file. This will be a single segment of a larger audio file,
        /// modified based on the provided settings.
        /// </summary>
        /// <param name="outputDirectory">
        /// The analysis Base Directory.
        /// </param>
        /// <param name="source">
        /// The source audio file.
        /// </param>
        /// <param name="outputMediaType">
        /// The output Media Type.
        /// </param>
        /// <param name="startOffset">
        /// The start Offset from start of entire original file.
        /// </param>
        /// <param name="endOffset">
        /// The end Offset from start of entire original file.
        /// </param>
        /// <param name="targetSampleRateHz">
        /// The target Sample Rate Hz.
        /// </param>
        /// <returns>
        /// The prepared file. The returned FileSegment will have the targetFile and OriginalFileDuration set -
        /// these are the path to the segmented file and the duration of the segmented file.
        /// The start and end offsets will not be set.
        /// </returns>
        public async Task <FileSegment> PrepareFile(
            DirectoryInfo outputDirectory,
            string source,
            string outputMediaType,
            TimeSpan startOffset,
            TimeSpan endOffset,
            int targetSampleRateHz)
        {
            throw new NotImplementedException();
            var request = new AudioUtilityRequest
            {
                OffsetStart      = startOffset,
                OffsetEnd        = endOffset,
                TargetSampleRate = targetSampleRateHz,
            };
            var preparedFile = AudioFilePreparer.PrepareFile(
                outputDirectory,
                source.ToFileInfo(),
                outputMediaType,
                request,
                TempFileHelper.TempDir());

            return(new FileSegment(
                       preparedFile.TargetInfo.SourceFile,
                       preparedFile.TargetInfo.SampleRate.Value,
                       preparedFile.TargetInfo.Duration.Value));
        }
Example #14
0
        private static string FormatChannelSelection(AudioUtilityRequest request)
        {
            /*
             * Where a range of channels is specified, the channel numbers to the left and right of the hyphen are
             * optional and default to 1 and to the number of input channels respectively. Thus
             *    sox input.wav output.wav remix −
             * performs a mix-down of all input channels to mono.
             */

            var remix   = string.Empty;
            var mixDown = request.MixDownToMono.HasValue && request.MixDownToMono.Value;

            if (mixDown && request.Channels.NotNull())
            {
                // select a subset of channels
                remix = "remix " + string.Join(",", request.Channels);
            }
            else if (mixDown)
            {
                // mix down to mono
                remix = "remix -";
            }
            else if (request.Channels.NotNull())
            {
                // get channels but don't mix down
                remix = "remix " + string.Join(" ", request.Channels);
            }

            return(remix);
        }
Example #15
0
        public void SoxResamplingShouldBeDeterministic()
        {
            var expected = new AudioUtilityInfo
            {
                Duration      = TimeSpan.FromSeconds(60),
                SampleRate    = 22050,
                ChannelCount  = 1,
                MediaType     = MediaTypes.MediaTypeWav,
                BitsPerSecond = 352800,
            };

            var request = new AudioUtilityRequest
            {
                MixDownToMono    = true,
                TargetSampleRate = 22050,
            };

            var util = TestHelper.GetAudioUtility();

            var source = TestHelper.GetAudioFile("CaneToad_Gympie_44100.wav");

            var repeats = new double[5][];

            for (int r = 0; r < repeats.Length; r++)
            {
                var output = PathHelper.GetTempFile(MediaTypes.ExtWav);

                util.Modify(source, MediaTypes.GetMediaType(source.Extension), output,
                            MediaTypes.GetMediaType(output.Extension), request);

                var actual = util.Info(output);

                TestHelper.CheckAudioUtilityInfo(expected, actual);

                var reader = new WavReader(output);

                TestHelper.WavReaderAssertions(reader, actual);

                repeats[r] = reader.Samples;

                File.Delete(output.FullName);
            }

            for (int i = 1; i < repeats.Length; i++)
            {
                Assert.AreEqual(repeats[0].Length, repeats[1].Length);

                var totalDifference = 0.0;
                for (int j = 0; j < repeats[0].Length; j++)
                {
                    var delta = Math.Abs(repeats[i][j] - repeats[0][j]);
                    totalDifference += delta;
                }

                CollectionAssert.AreEqual(repeats[0], repeats[i], $"Repeat {i} was not identical to repeat 0. Total delta: {totalDifference}");
            }
        }
 public void InvokeCheckRequestValid
 (
     FileInfo source,
     string sourceMediaType,
     FileInfo output,
     string outputMediaType,
     AudioUtilityRequest request)
 {
     this.CheckRequestValid(source, sourceMediaType, output, outputMediaType, request);
 }
 private void RunUtility(AudioUtilityRequest request)
 {
     TestHelper
     .GetAudioUtilityFfmpegRawPcm()
     .Modify(
         this.source,
         MediaTypes.GetMediaType(this.source.Extension),
         this.output,
         MediaTypes.GetMediaType(this.output.Extension),
         request);
 }
        public void AdvancedChannelSelectionFfmpegRawPcmFails(int[] channelMap)
        {
            var audioUtilityRequest = new AudioUtilityRequest
            {
                Channels         = channelMap,
                MixDownToMono    = false,
                TargetSampleRate = 22050,
                BitDepth         = 16,
            };

            var mediaType      = MediaTypes.MediaTypePcmRaw;
            var otherMediaType = MediaTypes.MediaTypeWav1;
            var utility        = TestHelper.GetAudioUtilityFfmpegRawPcm();
            var file           = FourChannelFileRaw;

            Assert.ThrowsException <ChannelSelectionOperationNotImplemented>(
                () =>
            {
                utility.Modify(
                    TestHelper.GetAudioFile(file),
                    mediaType,
                    TempFileHelper.NewTempFile(MediaTypes.GetExtension(otherMediaType)),
                    otherMediaType,
                    audioUtilityRequest);
            });

            audioUtilityRequest.MixDownToMono = true;

            Assert.ThrowsException <ChannelSelectionOperationNotImplemented>(
                () =>
            {
                utility.Modify(
                    TestHelper.GetAudioFile(file),
                    mediaType,
                    TempFileHelper.NewTempFile(MediaTypes.GetExtension(otherMediaType)),
                    otherMediaType,
                    audioUtilityRequest);
            });

            audioUtilityRequest.Channels = null;

            Assert.ThrowsException <InvalidOperationException>(
                () =>
            {
                utility.Modify(
                    TestHelper.GetAudioFile(file),
                    mediaType,
                    TempFileHelper.NewTempFile(MediaTypes.GetExtension(otherMediaType)),
                    otherMediaType,
                    audioUtilityRequest);
            });
        }
        private static void AssertAdvancedChannelConversionFails(string file, string mediaType, IAudioUtility utility, string otherMediaType = null, bool skipMonoCheck = false)
        {
            // array of channels of frequencies (expected in each channel)
            var audioUtilityRequest = new AudioUtilityRequest {
                Channels = new[] { 1, 2, 3, 4 }, MixDownToMono = false
            };

            otherMediaType = otherMediaType ?? mediaType;

            Assert.ThrowsException <ChannelSelectionOperationNotImplemented>(
                () =>
            {
                utility.Modify(
                    TestHelper.GetAudioFile(file),
                    mediaType,
                    TempFileHelper.NewTempFile(MediaTypes.GetExtension(otherMediaType)),
                    otherMediaType,
                    audioUtilityRequest);
            });

            audioUtilityRequest.MixDownToMono = true;

            Assert.ThrowsException <ChannelSelectionOperationNotImplemented>(
                () =>
            {
                utility.Modify(
                    TestHelper.GetAudioFile(file),
                    mediaType,
                    TempFileHelper.NewTempFile(MediaTypes.GetExtension(otherMediaType)),
                    otherMediaType,
                    audioUtilityRequest);
            });

            if (skipMonoCheck)
            {
                return;
            }

            audioUtilityRequest.Channels = null;

            Assert.ThrowsException <ChannelSelectionOperationNotImplemented>(
                () =>
            {
                utility.Modify(
                    TestHelper.GetAudioFile(file),
                    mediaType,
                    TempFileHelper.NewTempFile(MediaTypes.GetExtension(otherMediaType)),
                    otherMediaType,
                    audioUtilityRequest);
            });
        }
        public void FfmpegRawPcmFailsSelectsAllChannelsCorrectly()
        {
            // array of channels of frequencies (expected in each channel)
            // expect 4 channels
            var expectedFrequencies = new[] { 4000.AsArray(), 3000.AsArray(), 2000.AsArray(), 1000.AsArray() };

            // raw conversions need extra information to work
            var request = new AudioUtilityRequest()
            {
                BitDepth = 16, TargetSampleRate = 44100
            };

            ChannelTest(FourChannelFileRaw, new[] { 1, 2, 3, 4 }, null, expectedFrequencies, request);
        }
        public void FailsWithBandpassSet()
        {
            var request = new AudioUtilityRequest
            {
                BitDepth         = 16,
                TargetSampleRate = 22050,
                Channels         = new[] { 1, 2, 3, 4 },
                BandPassType     = BandPassType.Bandpass,
            };

            TestHelper.ExceptionMatches <NotSupportedException>(
                () => { this.RunUtility(request); },
                "Bandpass operations are not supported");
        }
Example #22
0
        private FileInfo SegmentWavpackToWav(FileInfo source, AudioUtilityRequest request)
        {
            // use a temp file for wvunpack.
            var wavunpackTempFile = TempFileHelper.NewTempFile(this.TemporaryFilesDirectory, MediaTypes.GetExtension(MediaTypes.MediaTypeWav));

            if (this.Log.IsDebugEnabled)
            {
                this.Log.Debug("Segmenting wavpack file " + source.FullName + " to wav " + wavunpackTempFile.FullName + " using wvunpack. Settings: " + request);
            }

            // use wvunpack to segment and convert to wav.
            this.wvunpackUtility.Modify(source, MediaTypes.MediaTypeWavpack, wavunpackTempFile, MediaTypes.MediaTypeWav, request);

            return(wavunpackTempFile);
        }
        public void FailsChannelSelection()
        {
            var request = new AudioUtilityRequest
            {
                BitDepth         = 16,
                TargetSampleRate = 22050,
                Channels         = new[] { 5, 2, 3, 4 },

                //BandPass
            };

            TestHelper.ExceptionMatches <ChannelSelectionOperationNotImplemented>(
                () => { this.RunUtility(request); },
                "The Channels specifier must contain channel numbers");
        }
        public void FailsWithMissingChannels()
        {
            var request = new AudioUtilityRequest
            {
                BitDepth         = 16,
                TargetSampleRate = 22050,

                //Channels = new[] { 1, 2, 3, 4 },
                //BandPass
            };

            TestHelper.ExceptionMatches <InvalidOperationException>(
                () => { this.RunUtility(request); },
                "The Channels must be set");
        }
Example #25
0
        private static void SegmentsCorrectly(
            string filename, string mimetype, TimeSpan start, TimeSpan end, TimeSpan maxVariance)
        {
            foreach (var util in new[] { TestHelper.GetAudioUtility() })
            {
                var dir = PathHelper.GetTempDir();

                var destMimeType = mimetype;
                if (mimetype == MediaTypes.MediaTypeWavpack)
                {
                    destMimeType = MediaTypes.MediaTypeWav;
                }

                var output =
                    new FileInfo(
                        Path.Combine(
                            dir.FullName,
                            Path.GetFileNameWithoutExtension(filename) + "_segmented."
                            + MediaTypes.GetExtension(destMimeType)));

                var audioUtilRequest = new AudioUtilityRequest {
                    OffsetStart = start, OffsetEnd = end
                };

                var input = PathHelper.GetTestAudioFile(filename);
                util.Modify(input, mimetype, output, destMimeType, audioUtilRequest);

                var utilInfoInput  = util.Info(input);
                var utilInfoOutput = util.Info(output);
                var infoInput      = GetDurationInfo(utilInfoInput);
                var infoOutput     = GetDurationInfo(utilInfoOutput);

                var compareResult = "Expected duration " + (end - start) + " actual duration " + utilInfoOutput.Duration.Value
                                    + " expected max variation " + maxVariance + " actual variation "
                                    + (end - start).Subtract(utilInfoOutput.Duration.Value).Duration();

                using (var cr = new ConsoleRedirector())
                {
                    LoggedConsole.WriteLine(compareResult);
                }

                Assert.IsTrue(
                    TestHelper.CompareTimeSpans(utilInfoOutput.Duration.Value, end - start, maxVariance),
                    compareResult + ". Info input: " + infoInput + "." + Environment.NewLine + "Info output: " + infoOutput);

                PathHelper.DeleteTempDir(dir);
            }
        }
Example #26
0
        protected override void CheckRequestValid(
            FileInfo source,
            string sourceMediaType,
            FileInfo output,
            string outputMediaType,
            AudioUtilityRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request), " must not be null - raw PCM data requires prior knowledge");
            }

            if (request.BitDepth == null)
            {
                throw new InvalidOperationException($"A {nameof(request.BitDepth)} must be supplied - can not be null");
            }

            if (!this.ValidBitDepths.Contains(request.BitDepth.Value))
            {
                throw new BitDepthOperationNotImplemented($"Supplied bit depth of {request.BitDepth.Value} is not valid");
            }

            if (request.BandPassType != BandPassType.None ||
                request.BandpassHigh.NotNull() ||
                request.BandpassLow.NotNull())
            {
                throw new NotSupportedException("Bandpass operations are not supported");
            }

            if (request.TargetSampleRate == null)
            {
                var message = $"A {nameof(request.TargetSampleRate)} must be supplied to the {nameof(FfmpegRawPcmAudioUtility)}";
                throw new InvalidOperationException(message);
            }

            if (request.Channels.IsNullOrEmpty())
            {
                var message = $"The {nameof(request.Channels)} must be set for the {nameof(FfmpegRawPcmAudioUtility)}";
                throw new InvalidOperationException(message);
            }

            if (request.Channels.Select((c, i) => c == i + 1).Any(b => !b))
            {
                var message =
                    $"The {nameof(request.Channels)} specifier must contain channel numbers mapping to their index only for the {nameof(FfmpegRawPcmAudioUtility)}";
                throw new ChannelSelectionOperationNotImplemented(message);
            }
        }
Example #27
0
        internal static void FormatFfmpegOffsetArgs(AudioUtilityRequest request, StringBuilder args)
        {
            if (request.OffsetStart.HasValue && request.OffsetStart.Value > TimeSpan.Zero)
            {
                args.AppendFormat(ArgsSeek, FormatTimeSpan(request.OffsetStart.Value));
            }

            if (request.OffsetEnd.HasValue && request.OffsetEnd.Value > TimeSpan.Zero)
            {
                var duration = request.OffsetStart.HasValue
                    ? FormatTimeSpan(request.OffsetEnd.Value - request.OffsetStart.Value)
                    : FormatTimeSpan(request.OffsetEnd.Value - TimeSpan.Zero);

                args.AppendFormat(ArgsDuration, duration);
            }
        }
Example #28
0
        private FileInfo SegmentRawPcmToWav(FileInfo source, AudioUtilityRequest request)
        {
            // use a temp file for wvunpack.
            var extension = MediaTypes.GetExtension(MediaTypes.MediaTypeWav1);
            var rawFile   = TempFileHelper.NewTempFile(this.TemporaryFilesDirectory, extension);

            if (this.Log.IsDebugEnabled)
            {
                this.Log.Debug("Converting/segmenting raw file " + source.FullName + " to wav " + rawFile.FullName + " using ffmpeg. Settings: " + request);
            }

            // use ffmpeg to segment and convert to wav.
            this.ffmpegRawPcmUtility.Modify(source, MediaTypes.MediaTypePcmRaw, rawFile, MediaTypes.MediaTypeWav, request);

            return(rawFile);
        }
Example #29
0
        private FileInfo ConvertNonWavOrMp3(FileInfo source, string sourceMimeType, AudioUtilityRequest request)
        {
            // use a temp file to segment.
            var ffmpegTempFile = TempFileHelper.NewTempFile(this.TemporaryFilesDirectory, MediaTypes.GetExtension(MediaTypes.MediaTypeWav));

            if (this.Log.IsDebugEnabled)
            {
                this.Log.Debug("Converting " + sourceMimeType + " file " + source.FullName + " to wav " +
                               ffmpegTempFile.FullName + " using ffmpeg. Settings: " + request);
            }

            // use ffmpeg to segment.
            this.ffmpegUtility.Modify(source, sourceMimeType, ffmpegTempFile, MediaTypes.MediaTypeWav, request);

            return(ffmpegTempFile);
        }
        public void FfmpegRawPcmFailsMixesDown1234Correctly()
        {
            // array of channels of frequencies (expected in each channel)
            var expectedFrequencies = new[]
            {
                new[] { 4000 },
                new[] { 3000 },
                new[] { 2000 },
                new[] { 1000 },
            };

            // raw conversions need extra information to work
            var request = new AudioUtilityRequest()
            {
                BitDepth = 16, TargetSampleRate = 44100
            };

            ChannelTest(FourChannelFileRaw, new[] { 1, 2, 3, 4 }, false, expectedFrequencies, request);
        }