示例#1
0
        /// <summary>
        /// Finalises the wav writing and returns a list of all the files created
        /// </summary>
        /// <returns>System.String.</returns>
        public async Task <string> Finalise()
        {
            //drain the un-processed buffers on this object
            while (Buffer.Count > 0)
            {
                await Task.Delay(200);
            }

            var archiveFile = Path.Combine(Path.GetTempPath(), BotConstants.DefaultOutputFolder, _settings.MediaFolder, _processorId, $"{Guid.NewGuid()}.zip");

            try
            {
                using (var stream = File.OpenWrite(archiveFile))
                {
                    using (ZipArchive archive = new ZipArchive(stream, ZipArchiveMode.Create))
                    {
                        // drain all the writers
                        foreach (var writer in _writers.Values)
                        {
                            var localFiles    = new List <string>();
                            var localArchive  = archive; //protect the closure below
                            var localFileName = writer.Filename;
                            localFiles.Add(writer.Filename);
                            await writer.FlushAsync();

                            writer.Dispose();

                            // Is Resampling and/or mono to stereo conversion required?
                            if (_settings.AudioSettings.WavSettings != null)
                            {
                                // The resampling is required
                                localFiles.Add(AudioFileUtils.ResampleAudio(localFileName, _settings.AudioSettings.WavSettings, _settings.IsStereo));
                            }
                            else if (_settings.IsStereo) // Is Stereo audio required?
                            {
                                // Convert mono WAV to stereo
                                localFiles.Add(AudioFileUtils.ConvertToStereo(localFileName));
                            }

                            // Remove temporary saved local WAV file from the disk
                            foreach (var localFile in localFiles)
                            {
                                await Task.Run(() =>
                                {
                                    var fInfo = new FileInfo(localFile);
                                    localArchive.CreateEntryFromFile(localFile, fInfo.Name, CompressionLevel.Optimal);
                                    File.Delete(localFile);
                                }).ConfigureAwait(false);
                            }
                        }
                    }
                }
            }
            finally
            {
                await End();
            }

            return(archiveFile);
        }
示例#2
0
        /// <summary>
        /// Initialises the wav file writer.
        /// </summary>
        /// <param name="rootFolder">The root folder.</param>
        /// <param name="id">The identifier.</param>
        /// <returns>WavFileWriter.</returns>
        private WaveFileWriter InitialiseWavFileWriter(string rootFolder, string id)
        {
            var path = AudioFileUtils.CreateFilePath(rootFolder, $"{id}.wav");

            // Initialize the Wave Format using the default PCM 16bit 16K supported by Teams audio settings
            var writer = new WaveFileWriter(path, new WaveFormat(
                                                rate: AudioConstants.DefaultSampleRate,
                                                bits: AudioConstants.DefaultBits,
                                                channels: AudioConstants.DefaultChannels));

            _writers.Add(id, writer);

            return(writer);
        }