{"id":42,"date":"2025-06-16T16:07:44","date_gmt":"2025-06-16T08:07:44","guid":{"rendered":"https:\/\/www.bandifee.com\/?p=42"},"modified":"2025-06-16T16:08:06","modified_gmt":"2025-06-16T08:08:06","slug":"windows-%e9%9f%b3%e4%b9%90%e6%8e%a7%e5%88%b6%e5%99%a8%e8%ae%be%e8%ae%a1","status":"publish","type":"post","link":"https:\/\/blog.bandifee.com\/index.php\/2025\/06\/16\/windows-%e9%9f%b3%e4%b9%90%e6%8e%a7%e5%88%b6%e5%99%a8%e8%ae%be%e8%ae%a1\/","title":{"rendered":"Windows \u97f3\u4e50\u63a7\u5236\u5668\u8bbe\u8ba1"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Windows \u64ad\u653e\u97f3\u4e50API<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u4f7f\u7528C#\u7684NAudio\u5e93\u8fdb\u884c\u5c01\u88c5 (\u53ea\u652f\u6301Windows)<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<h2 class=\"wp-block-heading\">MusicPlayer\u7c7b<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e00\u4e2aPlayer\u63a7\u5236\u4e00\u4e2a\u6b4c\u66f2\u64ad\u653e \u4ee5\u4e0b\u4e3aC#\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>namespace Web_Music_Controller_Base;\nusing System.Timers;\nusing System.Threading.Tasks;\nusing NAudio.Wave;\npublic class MusicPlayer : IDisposable\n{\n    private AudioFileReader? _audioFile;\n    private WaveOutEvent? _outputDevice;\n    private TaskCompletionSource&lt;bool>? _playbackFinished;\n    private PlayStatus _playStatus = PlayStatus.BeforeInit;\n    private String? _filePath;\n\n    public String GetFilePath()\n    {\n        return _filePath;\n    }\n\n    public PlayStatus GetPlaySataus()\n    {\n        return _playStatus;\n    }\n\n    public int GetCurrentSec()\n    {\n        if (_playStatus == PlayStatus.BeforeInit) throw new Exception(\"GetCurrentSec(Error) _audioFile\u5b9e\u4f8b\u672a\u521d\u59cb\u5316\");\n        return (int)_audioFile.CurrentTime.TotalSeconds;\n    }\n    \n    public int GetTotalSec()\n    {\n        if (_playStatus == PlayStatus.BeforeInit) throw new Exception(\"GetTotalSec(Error) _audioFile\u5b9e\u4f8b\u672a\u521d\u59cb\u5316\");\n        return (int)_audioFile.TotalTime.TotalSeconds;\n    }\n    \n    public MusicPlayer(string filePath)\n    {\n        _playStatus = PlayStatus.Stop;\n        _audioFile = new AudioFileReader(filePath);\n        _filePath = filePath;\n    }\n    \n    \n\n    public async Task Play()\n    {\n        Stop();\n        _outputDevice = new WaveOutEvent();\n        _outputDevice.Init(_audioFile);\n        _playbackFinished = new TaskCompletionSource&lt;bool>();\n        _outputDevice.PlaybackStopped += (s, e) =>\n        {\n            _playStatus = PlayStatus.Stop;\n            _playbackFinished.TrySetResult(true);\n        };\n        _outputDevice.Play();\n        _playStatus = PlayStatus.Playing;\n        await _playbackFinished.Task;\n    }\n\n    public void Pause()\n    {\n        if (_outputDevice != null &amp;&amp; _outputDevice.PlaybackState == PlaybackState.Playing)\n        {\n            _outputDevice.Pause();\n            _playStatus = PlayStatus.Pause;\n        }\n    }\n\n    public void Resume()\n    {\n        if (_outputDevice != null &amp;&amp; _outputDevice.PlaybackState == PlaybackState.Paused)\n        {\n            _outputDevice.Play();\n            _playStatus = PlayStatus.Playing;\n        }\n    }\n\n    public void Stop()\n    {\n        _playStatus = PlayStatus.Stop;\n        _outputDevice?.Stop();\n        _audioFile.CurrentTime = TimeSpan.Zero;\n    }\n    \n    public void setCurrentSec(int sec)\n    {\n        if (_playStatus == PlayStatus.BeforeInit) throw new Exception(\"Seek(Error) _audioFile\u5b9e\u4f8b\u672a\u521d\u59cb\u5316\");\n        _audioFile.CurrentTime = TimeSpan.FromSeconds(sec);\n    }\n\n    public void Dispose()\n    {\n        Stop();\n        _audioFile?.Dispose();\n        _outputDevice?.Dispose();\n        _audioFile = null;\n        _outputDevice = null;\n        _playStatus = PlayStatus.BeforeInit;\n    }\n}<\/code><\/pre>\n<\/blockquote>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">MusicController\u7c7b<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7528\u4e8e\u7ba1\u7406\u6240\u6709\u7684MusicController\u5e76\u63d0\u4f9b\u63a7\u5236\u65b9\u6cd5(\u4ee5\u4e0b\u4ee3\u7801\u793a\u4f8b)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using System.Collections;\n\nnamespace Web_Music_Controller_Base;\n\npublic class MusicController : IEnumerable&lt;KeyValuePair&lt;string, MusicPlayer>>\n{\n    private Dictionary&lt;string, MusicPlayer> musicPlayers = new ();\n\n    public MusicPlayer this&#91;string musicName]\n    {\n        get => GetMusicPlayer(musicName);\n    }\n    \n    public int GetCount()\n    {\n        return musicPlayers.Count;\n    }\n\n    public void RemoveMusicPlayer(String musicName)\n    {\n        musicPlayers.Remove(musicName);\n    }\n    \n    public MusicController()\n    {\n        \n    }\n\n    public bool exist(String musicName)\n    {\n        return musicPlayers.ContainsKey(musicName);\n    }\n    \n    public void AddMusicPlayer(string musicName, MusicPlayer musicPlayer)\n    {\n        if (musicPlayers.ContainsKey(musicName))\n        {\n            throw new Exception(\"\u97f3\u4e50\u5df2\u5b58\u5728\");\n        }\n        musicPlayers.Add(musicName, musicPlayer);\n    }\n    \n    public MusicPlayer GetMusicPlayer(string musicName)\n    {\n        if (!musicPlayers.ContainsKey(musicName))\n        {\n            throw new Exception(\"\u97f3\u4e50\u4e0d\u5b58\u5728\");\n        }\n        return musicPlayers&#91;musicName];\n    }\n    \n    public IEnumerator&lt;KeyValuePair&lt;string, MusicPlayer>> GetEnumerator()\n    {\n        return musicPlayers.GetEnumerator();\n    }\n\n    IEnumerator IEnumerable.GetEnumerator()\n    {\n        return GetEnumerator();\n    }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Windows \u64ad\u653e\u97f3\u4e50API MusicController\u7c7b \u7528\u4e8e\u7ba1\u7406\u6240\u6709\u7684MusicController\u5e76\u63d0\u4f9b\u63a7\u5236\u65b9\u6cd5(\u4ee5\u4e0b &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"emotion":"","emotion_color":"","title_style":"","license":"","footnotes":""},"categories":[6],"tags":[8,11],"class_list":["post-42","post","type-post","status-publish","format-standard","hentry","category-6","tag-c","tag-11"],"_links":{"self":[{"href":"https:\/\/blog.bandifee.com\/index.php\/wp-json\/wp\/v2\/posts\/42","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.bandifee.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.bandifee.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.bandifee.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.bandifee.com\/index.php\/wp-json\/wp\/v2\/comments?post=42"}],"version-history":[{"count":2,"href":"https:\/\/blog.bandifee.com\/index.php\/wp-json\/wp\/v2\/posts\/42\/revisions"}],"predecessor-version":[{"id":44,"href":"https:\/\/blog.bandifee.com\/index.php\/wp-json\/wp\/v2\/posts\/42\/revisions\/44"}],"wp:attachment":[{"href":"https:\/\/blog.bandifee.com\/index.php\/wp-json\/wp\/v2\/media?parent=42"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.bandifee.com\/index.php\/wp-json\/wp\/v2\/categories?post=42"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.bandifee.com\/index.php\/wp-json\/wp\/v2\/tags?post=42"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}