使用Terminal.gui用C#开发CLI音乐播放器(第一部分)

2020-10-26 12:55:11

下一步是实现顶级菜单,幸运的是,使用Terminal.Gui很容易做到这一点。就在top.add(Win)之上,我创建了以下代码:

//创建菜单栏。Var Menu=new menubar(new MenuBarItem[]{new MenuBarItem(";_File";,new MenuItem[]{new MenuItem(";_Open";,";,)=&>;应用程序。RequestStop()),新的MenuItem(";_Open Stream";,";,";打开流";,()=>;应用程序。RequestStop()),新建MenuItem(";_Quit&34;,";退出MusicSharp";,()=>;应用程序。RequestStop(),}),新建MenuBarItem(";_Help";,new MenuItem[]{new MenuItem(";_About";,String。空,()=>;{MessageBox。Query(";Music Sharp 0.2.0";,";,";\nMusic Sharp是用C#编写的轻量级CLI\n音乐播放器。\n\n由Mark-James McDougall\n开发,并按照GPL v3授权。\n";,";Close";);}),});

在这里,我做了几件事。首先,我创建了一个新的菜单栏,它将包含菜单栏项目。接下来,我创建了每个菜单项(File和Help),并用我们的UI中需要的方便的子项填充它们。这些子级以名称、可选描述符和方法作为参数,目前我对它们中的每一个调用Application.RequestStop()以退出应用程序(稍后我将在编写这些方法后将它们替换为实际的方法)。此外,我还创建了一个简单的About对话框,作为熟悉Terminal.Gui的一种方式。到目前为止,编译我们的代码会产生以下菜单:

虽然我仍然需要添加一些额外的菜单项(如保存/加载播放列表功能),但这为下一部分提供了一个很好的起点,让基本的音频功能正常工作!

现在已经创建了一个非常简单的UI,我的下一个任务是测试NAudio,看看如何播放MP3文件作为简单的概念证明。为此,我创建了一个名为Player.cs的新文件来存放音频播放相关功能。我对Player类使用了单例模式,因为大多数音频处理都是在循环中进行的,我们不需要同时播放多个音频流。

在Player类内部,我创建了一个PlayAudioFile()方法,该方法从我的PC上的静态位置读取MP3文件,然后使用NAudio播放它。代码如下所示:

/<;Summary>;/Player类处理音频播放。/<;/Summary>;公共静态类播放器{/<;Summary>;/实现从文件播放音频的方法。/<;/Summary>;public static void PlayAudioFile(){string file=@";C:\MusicSharp\zhund-Dusty.mp3";;//加载音频文件并选择输出设备。Using var AudioFile=new AudioFileReader(File);using var outputDevice=new WaveOutEvent();outputDevice。Init(AudioFile);outputDevice。Play();//睡眠到播放结束。While(outputDevice.。PlaybackState==PlaybackState。播放){线程。睡眠(1000);}。

最后一个任务是将PlayAudioFile()方法连接到UI,为此,我将Gui.cs中的Open菜单代码行替换为以下内容:

在编译并打开播放器后,我现在听到了甜美的音乐声!虽然这么早听到音乐是令人兴奋的,但还是有相当多的收获。这些措施包括:

尽管缺少这些功能,但每当我能够在项目中取得切实进展时,我仍然觉得非常令人兴奋,它提供了一些动力来完成一些更乏味的部分。

在本指南的第一部分中,我们了解了如何使用Terminal.GUI实现简单的UI,然后使用它通过NAudio播放音频文件。我本来想让MusicSharp成为跨平台的,但不幸的是,NAudio严重依赖于Windows库,并且与其他操作系统不兼容。出于好奇,我在我的Macbook Pro(运行Catalina)上测试了MusicSharp,程序运行了,但当我试图打开MP3时,它崩溃了:

在这些早期测试阶段,MusicSharp当前在调试模式下运行时消耗了15MB内存和微不足道的CPU使用量,随着播放器功能的进一步充实,看看这个数字的结果会很有趣。请务必关注本指南的第二部分,因为我们将继续研究UI和Player元素!