@@ -11,25 +11,30 @@ namespace NetCoreAudio.Players
1111 internal class WindowsPlayer : IPlayer
1212 {
1313 [ DllImport ( "winmm.dll" ) ]
14- private static extern long mciSendString ( string command , StringBuilder stringReturn , int returnLength , IntPtr hwndCallback ) ;
14+ private static extern int mciSendString ( string command , StringBuilder stringReturn , int returnLength , IntPtr hwndCallback ) ;
1515
16- private Timer _playbackTimer ;
16+ [ DllImport ( "winmm.dll" ) ]
17+ private static extern int mciGetErrorString ( int errorCode , StringBuilder errorText , int errorTextSize ) ;
18+
19+ private Timer _playbackTimer ;
1720 private Stopwatch _playStopwatch ;
1821
22+ private string _fileName ;
23+
1924 public event EventHandler PlaybackFinished ;
2025
2126 public bool Playing { get ; private set ; }
2227 public bool Paused { get ; private set ; }
2328
2429 public Task Play ( string fileName )
2530 {
26- _playbackTimer = new Timer ( ) ;
31+ _fileName = fileName ;
32+ _playbackTimer = new Timer ( ) ;
2733 _playbackTimer . AutoReset = false ;
2834 _playStopwatch = new Stopwatch ( ) ;
2935 ExecuteMsiCommand ( "Close All" ) ;
30- ExecuteMsiCommand ( $ "Open \" { fileName } \" Type MPEGVideo Alias myDevice") ;
31- ExecuteMsiCommand ( "Status myDevice Length" ) ;
32- ExecuteMsiCommand ( "Play myDevice" ) ;
36+ ExecuteMsiCommand ( $ "Status { _fileName } Length") ;
37+ ExecuteMsiCommand ( $ "Play { _fileName } ") ;
3338 Paused = false ;
3439 Playing = true ;
3540 _playbackTimer . Elapsed += HandlePlaybackFinished ;
@@ -43,7 +48,7 @@ public Task Pause()
4348 {
4449 if ( Playing && ! Paused )
4550 {
46- ExecuteMsiCommand ( "Pause myDevice " ) ;
51+ ExecuteMsiCommand ( $ "Pause { _fileName } ") ;
4752 Paused = true ;
4853 _playbackTimer . Stop ( ) ;
4954 _playStopwatch . Stop ( ) ;
@@ -57,7 +62,7 @@ public Task Resume()
5762 {
5863 if ( Playing && Paused )
5964 {
60- ExecuteMsiCommand ( "Resume myDevice " ) ;
65+ ExecuteMsiCommand ( $ "Resume { _fileName } ") ;
6166 Paused = false ;
6267 _playbackTimer . Start ( ) ;
6368 _playStopwatch . Reset ( ) ;
@@ -70,16 +75,23 @@ public Task Stop()
7075 {
7176 if ( Playing )
7277 {
73- ExecuteMsiCommand ( "Close myDevice ") ;
74- Playing = false ;
78+ ExecuteMsiCommand ( $ "Stop { _fileName } ") ;
79+ Playing = false ;
7580 Paused = false ;
7681 _playbackTimer . Stop ( ) ;
7782 _playStopwatch . Stop ( ) ;
7883 }
7984 return Task . CompletedTask ;
8085 }
8186
82- private void HandlePlaybackFinished ( object sender , ElapsedEventArgs e )
87+ private void MarkPlaybackAsStopped ( )
88+ {
89+ Playing = false ;
90+ _playbackTimer . Stop ( ) ;
91+ _playbackTimer . Elapsed -= HandlePlaybackFinished ;
92+ }
93+
94+ private void HandlePlaybackFinished ( object sender , ElapsedEventArgs e )
8395 {
8496 Playing = false ;
8597 PlaybackFinished ? . Invoke ( this , e ) ;
@@ -95,13 +107,19 @@ private Task ExecuteMsiCommand(string commandString)
95107
96108 if ( result != 0 )
97109 {
98- throw new Exception ( $ "Error executing MCI command. Error code: { result } ") ;
110+ var errorSb = new StringBuilder ( $ "Error executing MCI command '{ commandString } '. Error code: { result } .") ;
111+ var sb2 = new StringBuilder ( 128 ) ;
112+
113+ mciGetErrorString ( result , sb2 , 128 ) ;
114+ errorSb . Append ( $ " Message: { sb2 . ToString ( ) } ") ;
115+
116+ throw new Exception ( errorSb . ToString ( ) ) ;
99117 }
100118
101119 if ( commandString . ToLower ( ) . StartsWith ( "status" ) && int . TryParse ( sb . ToString ( ) , out var length ) )
102120 _playbackTimer . Interval = length ;
103121
104122 return Task . CompletedTask ;
105123 }
106- }
124+ }
107125}
0 commit comments