UWP节拍器应用程序 - MediaPlayerelement Transport Controls and Perf



我已决定创建一个节拍器应用程序。因此,我是一个"初学者",我制作了这个项目,目的是更多地了解OOP和其他内容。我的应用程序效果很好,但是我仍然有一些问题(小问题)。

我已经使用MediaPlayerlement播放声音。我不想在执行过程中出现媒体运输控件,为此,我写了

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();
    }
}

节拍器源

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属性关联的滑块,当用户按下启动按钮时,元素播放声音。这就像计时器一样工作,当击中指定的值时,它会播放声音。

在计算机(核心i3)中,此应用程序使用CPU的1.0%的最大值,我不知道智能手机中的CPU使用情况(Lumia 535)。

**我的CPU支持VT-X,但我的芯片组却不支持,所以,我可以做到!:p

感谢您的帮助!:)

而不是媒体播放器,您可以使用backendmedmediaplayer。

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

也...每次您init()节拍器时,您都会添加一个其他事件处理程序。我假设您每次都不会创建新的节拍器,这意味着当您单击"启动",然后停止,然后重新开始 - 每个tick呼叫player.play.play()两次。这也是获取内存泄漏的好方法。我会在stop()上取消订阅活动。此处的更多信息(MSDN)。

dispTimer.Tick -= DispTimer_Tick;

祝您学习好运。

最新更新