Windows IoT Raspberry Pi 3 c#在不同页面中播放音频
问题描述:
我在Raspi Pi 3上制作了一个应用程序,可以在“播放页面”上触发一个按钮,以在页面中使用MediaPlayer激活音频播放。一旦我切换到另一个页面,音频将继续在后台播放,但是一旦我回到“播放页面”,音频仍在播放,但由于我的mediaPlayer = new MediaPlayer(),我失去了对MediaPlayer的控制。线。如果它在重复模式我不能停止播放&如果我触发另一条消息,两个新的&现有的消息将同时播放。Windows IoT Raspberry Pi 3 c#在不同页面中播放音频
即使在页面之间切换时,如何确保一次只能播放一个MediaPlayer。 请帮忙。谢谢。
编辑的代码:
public sealed partial class MessagePage : Page
{
private object syncObj = new object();
public MessagePage()
{
this.InitializeComponent();
startclock();
this.Home.Click += Home_Click;
this.Message.Click += Message_Click;
//mediaPlayer = new MediaPlayer();
mediaPlayer = this.GetInstance();
//mediaPlayer.MediaEnded += MediaPlayer_MediaEnded;
//mediaPlayer.MediaOpened += MediaPlayer_MediaOpened;
}
public MediaPlayer GetInstance()
{
lock (syncObj)
{
if (mediaPlayer == null)
{
mediaPlayer = new MediaPlayer();
mediaPlayer.MediaEnded += MediaPlayer_MediaEnded;
mediaPlayer.MediaOpened += MediaPlayer_MediaOpened;
}
}
return mediaPlayer;
}
}
旧代码:
public MessagePage()
{
this.InitializeComponent();
startclock();
this.Home.Click += Home_Click;
this.Message.Click += Message_Click;
mediaPlayer = new MediaPlayer();
mediaPlayer.MediaEnded += MediaPlayer_MediaEnded;
}
private async void Btn_Click(object sender, RoutedEventArgs e)
{
StorageFolder externalDevices = KnownFolders.RemovableDevices;
IReadOnlyList<StorageFolder> externalDrives = await externalDevices.GetFoldersAsync();
StorageFolder usbStorage = externalDrives[0];
if (usbStorage != null)
{
StorageFolder storageFolder = KnownFolders.RemovableDevices;
StorageFile audioFile = await usbStorage.GetFileAsync("message1.mp3");
mediaPlayer.Source = Windows.Media.Core.MediaSource.CreateFromStorageFile(audioFile);
mediaPlayer.Play();
TextBlock.Text = "Playing Message 1...";
}
else
{
TextBlock.Text = "No USB Storage Detected...";
};
}
答
您需要使用singleton pattern更换预定Singleton模式是限制类的实例化一个对象的设计模式。当需要确切的一个对象来协调系统中的操作时,这非常有用。
private static readonly object syncObj = new object();
public MediaPlayer GetInstance()
{
lock (syncObj)
{
if (mediaPlayer == null)
{
mediaPlayer = new MediaPlayer();
mediaPlayer.MediaEnded += MediaPlayer_MediaEnded;
}
}
return mediaPlayer;
}
public MessagePage() { this.InitializeComponent(); startclock(); this.Home.Click += Home_Click; this.Message.Click += Message_Click; //mediaPlayer = new MediaPlayer(); mediaPlayer = this.GetInstance(); }
感谢。我会试试看。我很好奇,使用数据透视表给出的结果几乎与mediaplayer声明不会像我的情况一样会导致代价冲突。 – mylim
嗨我跑的代码&当我点击按钮到页面,它会遇到“异常用户未处理”其中锁定(syncobj) - 值不能为空。我不明白。 – mylim
嗨mylim,syncObj应该是新的一个对象。 –