예제 #1
0
 public void BufferWave(
     string file,
     float volume)
 {
     lock (WaveBuffer)
     {
         var key = GetBufferKey(file, volume);
         WaveBuffer[key] = new WaveDataContainer(ReadWaveSamples(file, volume));
     }
 }
예제 #2
0
            public static void LoadTTSHistory()
            {
                var file = TTSHistoryFileName;

                if (!File.Exists(file))
                {
                    return;
                }

                lock (WaveBuffer)
                {
                    var lines = File.ReadAllLines(file, new UTF8Encoding(false));

                    foreach (var line in lines)
                    {
                        var values = line.Split('\t');
                        if (values.Length < 2)
                        {
                            continue;
                        }

                        var key = values[0];

                        if (!DateTime.TryParse(values[1], out DateTime timestamp))
                        {
                            continue;
                        }

                        var keySplits = key.Split('-');
                        if (keySplits.Length < 2)
                        {
                            continue;
                        }

                        var waveFile = keySplits[0];
                        if (!File.Exists(waveFile))
                        {
                            continue;
                        }

                        WaveBuffer[key] = new WaveDataContainer()
                        {
                            LastAccessTimestamp = timestamp
                        };
                    }
                }
            }
예제 #3
0
            public int BufferWaves(
                IEnumerable <string> files,
                float volume)
            {
                var count = 0;

                lock (WaveBuffer)
                {
                    foreach (var file in files)
                    {
                        var key = GetBufferKey(file, volume);

                        if (WaveBuffer.ContainsKey(key))
                        {
                            var container = WaveBuffer[key];
                            if ((DateTime.Now - container.LastAccessTimestamp) <= CacheToloadScope)
                            {
                                container.Samples = ReadWaveSamples(file, volume);
                                count++;
                                Thread.Yield();
                            }
                        }
                        else
                        {
                            WaveBuffer[key] = new WaveDataContainer(ReadWaveSamples(file, volume))
                            {
                                LastAccessTimestamp = DateTime.MinValue
                            };

                            count++;
                            Thread.Yield();
                        }
                    }
                }

                return(count);
            }
예제 #4
0
            public void Play(
                string file,
                float volume = 1.0f,
                bool sync    = false)
            {
                if (!File.Exists(file))
                {
                    return;
                }

                var buffer = default(BufferedWaveProvider);
                var config = Config.Instance;

                if (!sync)
                {
                    lock (this)
                    {
                        buffer = this.Buffers[this.CurrentPlayerIndex];
                        this.CurrentPlayerIndex++;

                        if (this.CurrentPlayerIndex >= config.WasapiMultiplePlaybackCount)
                        {
                            this.CurrentPlayerIndex = 0;
                        }
                    }
                }
                else
                {
                    buffer = this.Buffers[config.WasapiMultiplePlaybackCount];
                }

                if (buffer == null)
                {
                    return;
                }

                var samples = default(byte[]);
                var key     = GetBufferKey(file, volume);

                lock (WaveBuffer)
                {
                    if (WaveBuffer.ContainsKey(key))
                    {
                        var wave = WaveBuffer[key];

                        if (wave.Samples.Length > 0)
                        {
                            samples = wave.Samples;
                            wave.LastAccessTimestamp = DateTime.Now;
                        }
                    }

                    if (samples == null || samples.Length <= 0)
                    {
                        samples         = ReadWaveSamples(file, volume);
                        WaveBuffer[key] = new WaveDataContainer(ReadWaveSamples(file, volume));
                    }
                }

                buffer.AddSamples(
                    samples,
                    0,
                    samples.Length);

#if DEBUG
                System.Diagnostics.Debug.WriteLine($"WASAPI(Buffered) Play: {file}");
#endif
            }