MediaElement сбой в начале игры - PullRequest
1 голос
/ 10 марта 2019

У меня есть медиа-элемент, который воспроизводит звук.Просто чистый тон.Если я начну с тона, то сначала у него будет сбой.Если я начну с некоторого пробела, 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();
    }
...