Skip to content

Commit a5f1e9a

Browse files
author
fiodarsazanavets
committed
Fix some issues with Windows player. Add more detailed error message.
1 parent 219b1f8 commit a5f1e9a

3 files changed

Lines changed: 34 additions & 16 deletions

File tree

DemoHarness/DemoHarness.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>netcoreapp2.1</TargetFramework>
5+
<TargetFramework>netcoreapp2.2</TargetFramework>
66
</PropertyGroup>
77

88
<ItemGroup>

NetCoreAudio/NetCoreAudio.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<RepositoryUrl>https://github.com/mobiletechtracker/NetCoreAudio</RepositoryUrl>
1313
<RepositoryType>GitHub</RepositoryType>
1414
<PackageTags>.NET Core audio</PackageTags>
15-
<Version>1.4.1</Version>
15+
<Version>1.5.0</Version>
1616
<PackageIconUrl>https://avatars3.githubusercontent.com/u/42421108?s=400&amp;u=d456e9d70c60cc963a855285290e7d8428e3a46c&amp;v=4</PackageIconUrl>
1717
</PropertyGroup>
1818

NetCoreAudio/Players/WindowsPlayer.cs

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)