UWP Metronome应用程序 - MediaPlayerElement传输控件和性能

时间:2016-12-12 01:24:25

标签: c# performance audio uwp

我决定创建一个节拍器应用程序。所以,我是一个初学者"我创建这个项目的目的是为了更多地了解OOP和其他事情。 我的应用程序工作得很好,但是,我仍然有一些问题(小问题)。

我使用MediaPlayerElement播放声音标记。我不希望在执行期间出现媒体传输控件,为此,我写了

mediaPlayer.MediaPlayer.SystemMediaTransportControls.IsEnabled = false;

但仍启用了媒体传输控件。

另一个问题是该应用程序在PC中运行良好(可能具有更多处理能力),但在智能手机中,啊,不能正常工作!当BPM较高(大于190或200)时,应用程序无法正确播放声音,几乎一直滞后。代码如下:

球员来源

class Player
{
    MediaPlayerElement mediaPlayer = new MediaPlayerElement();

    public void Init()
    {
        try
        {
            Uri src = new Uri("ms-appx:///Assets/beep.wav");
            mediaPlayer.Source = MediaSource.CreateFromUri(src);
            mediaPlayer.MediaPlayer.SystemMediaTransportControls.IsEnabled = false;
        }
        catch (Exception e)
        {
            System.Diagnostics.Debug.WriteLine("Error!" + e);
        }
    }

    public void Play()
    {
        mediaPlayer.MediaPlayer.Play();
    }

    public Player()
    {
        Init();
    }
}

METRONOME SOURCE

class Metronome
{
    private Player player = new Player();


    private DispatcherTimer dispTimer = new DispatcherTimer();
    private double interval;

    public int Tempo { get; set; }  
    public bool IsActive { get; set; }  //returns the state

    private void Init()
    {
        interval = (double)60 / Tempo - 0.02;
        dispTimer.Tick += DispTimer_Tick;
        dispTimer.Interval = TimeSpan.FromSeconds(interval);
    }

    private void DispTimer_Tick(object sender, object e)
    {
        player.Play();
    }

    public void Start()
    {
        Init();
        dispTimer.Start();
        IsActive = true;
    }

    public void Stop()
    {
        dispTimer.Stop();
        IsActive = false;
    }
}

我有一个与Tempo属性相关联的滑块,当用户按下开始按钮时,metronomo会播放声音。 这就像一个计时器,当达到指定值时,它会播放声音。

在计算机(Core I3)中,此应用程序使用1.0%CPU的最大值,我不知道智能手机中的CPU使用率(Lumia 535)。

**我的CPU支持VT-X,但我的芯片组没有,所以,我尽我所能! :P

感谢您的帮助! :)

1 个答案:

答案 0 :(得分:1)

您可以使用BackgroundMediaPlayer代替MediaPlayer。

Uri src = new Uri("ms-appx:///Assets/beep.wav");
BackgroundMediaPlayer.Current.SetUriSource(src);

另外......每当你使用Init()节拍器时,你都会添加一个额外的事件处理程序。我假设您每次都没有创建新的节拍器这意味着当您单击开始,然后停止,然后再次开始 - 每个节拍都调用player.Play()两次。这也是获取内存泄漏的好方法。我会取消订阅Stop()上的活动。有关here(MSDN)的更多信息。

dispTimer.Tick -= DispTimer_Tick;

祝你学习顺利。