public PcmWrapper(PcmWrapper source) { EncodeHeader(source.GetHeader()); Payload = new byte[source.Payload.Length]; Buffer.BlockCopy(source.Payload, 0, Payload, 0, source.Payload.Length); }
public void Combine(PcmWrapper source) { lock (_lock) { byte[] payload = new byte[Payload.Length + source.Payload.Length]; Buffer.BlockCopy(Payload, 0, payload, 0, Payload.Length); Buffer.BlockCopy(source.Payload, 0, payload, Payload.Length, source.Payload.Length); Payload = payload; SubChunk2Size = payload.Length; ChunkSize = 36 + payload.Length; } }
public static void SaveFile(PcmWrapper data, string saveName) { byte[] save = data.Encode(); FileInfo info = new FileInfo(saveName); if (!info.Directory.Exists) info.Directory.Create(); using (BinaryWriter writer = new BinaryWriter(new FileStream(saveName, FileMode.Create))) { writer.Write(save); } }
public static int? GetFirstSilence(PcmWrapper pcm, float startSecond, float endSecond, float minPauseLength, float maxPauseLength, int noiseLevel) { int lowFrequency = -noiseLevel; int highFrequency = noiseLevel; int startSearch = (int)(startSecond * pcm.ByteRate); if (startSearch < 0) startSearch = 0; startSearch += startSearch % 2; int endSearch = (int)(endSecond * pcm.ByteRate); int minSilenceThreshold = (int)(minPauseLength * pcm.ByteRate); int maxSilenceThreshold = (int)(maxPauseLength * pcm.ByteRate); byte[] payload = pcm.GetPayload(); if (minPauseLength == 0) { int ret = startSearch; ret -= (ret % 2); return ret; } int silenceStart = 0; int silenceCount = 0; float maxSilence = 0f; List<short> shorts = new List<short>(); for (int j = startSearch; j < endSearch && j < payload.Length - 1; j += 2) { short snd = ComplementToSigned(j, payload); if (silenceCount >= maxSilenceThreshold) { int ret = silenceStart + (silenceCount / 2); ret -= (ret % 2); return ret; } else if (snd > lowFrequency && snd < highFrequency) { if (silenceCount == 0) { silenceStart = j; } silenceCount += 2; } else if (silenceCount >= minSilenceThreshold) { int ret = silenceStart + (silenceCount / 2); ret -= (ret % 2); return ret; } else { maxSilence = Math.Max(silenceCount, maxSilence); silenceCount = 0; } shorts.Add(snd); } return null; }
private void HandleInputAudio(int index, TywiAudioStream stream, DeviceProfile device) { byte[] content = stream.ReadAudio(); if (content != null && content.Length > 0) { PcmWrapper wrapper = new PcmWrapper(content, 16000, 1, 16); _service.PostAudio(wrapper.Encode(), device); } }