У меня есть медиа-элемент, который воспроизводит звук.Просто чистый тон.Если я начну с тона, то сначала у него будет сбой.Если я начну с некоторого пробела, 80 мс или более, то никакого сбоя не будет.Если я не начинаю с пустого места и постоянно играю чистыми тонами (постоянно нажимая кнопку для запуска одной и той же процедуры), это влияет только на первый.Но если я дам ему немного времени (возможно, несколько секунд), чтобы он остыл, он снова икнет.Я записал байтовый массив в файл и посмотрел на него в Audacity - это приятная на вид синусоида без икоты.Есть ли что-то в моей настройке, что вызывает это?
Может быть, я должен использовать MediaPlayerElement, который является более новым, но я не могу найти, как получить это для воспроизведения массива wav.
В коде я контролирую величину начальной задержки с помощью константы 'delay'.
const double delay = 0;
const double SampleRate = 44100.0;
MediaElement soundPlayer = new MediaElement();
private async Task PlayMyBeep(int frequency, int duration)
{
double DeltaFT = 2f * Math.PI * (double)frequency / (double)SampleRate;
double Sample;
//The total number of samples
double soundSamples = (SampleRate * duration) / 1000.0;
double quietSamples = (SampleRate * (delay/1000.0));
double TotalSamples = soundSamples + quietSamples;
// The WAV header
short NumChannels = 1;
short BitsPerSample = 16;
int ByteRate = (int)((double)(SampleRate * NumChannels * BitsPerSample) / 8.0);
short BlockAlign = (short)((double)(NumChannels * BitsPerSample) / 8.0);
int Bytes = (int)((double)(TotalSamples * NumChannels * BitsPerSample) / 8);
int BlockAlign_BitsPerSample = (BitsPerSample * 0x10000) + BlockAlign; //Shift BlockAlign
int[] Header = { 0x46464952, 36 + Bytes, 0x45564157, 0x20746D66, 16, 0x10001, (int)SampleRate, ByteRate, BlockAlign_BitsPerSample, 0x61746164, Bytes };
MemoryStream memoryStream = new MemoryStream(200 + Bytes);
BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
for (int I = 0; I < Header.Length; I++) // write the header
binaryWriter.Write(Header[I]);
// write no tone for a while
for (double quietNum = 0; quietNum < quietSamples; quietNum++)
{
binaryWriter.Write((short)0);
}
// write the tone
for (double sampleNum = 0; sampleNum < soundSamples; sampleNum++)
{
Sample = (short)((double)short.MaxValue * Math.Sin(DeltaFT * sampleNum));
binaryWriter.Write((short)Sample);
}
binaryWriter.Flush(); // empty out any that is left
//turn this into an array to be played
byte[] byteArray = memoryStream.ToArray();
// write the memory stream to a file - to see what the waveform looks like.
StorageFolder localFolder = ApplicationData.Current.LocalFolder;
StorageFile localFile = await localFolder.CreateFileAsync("Test.wav", CreationCollisionOption.ReplaceExisting);
await FileIO.WriteBytesAsync(localFile, byteArray);
memoryStream.Seek(0, SeekOrigin.Begin);
var soundSource = memoryStream.AsRandomAccessStream();
soundSource.Seek(0);
soundPlayer.SetSource(soundSource, "audio/wav");
soundPlayer.Play();
}