Помогите найти ошибку.
Пытаюсь отобразить на форме текущее время воспроизведения.
У меня есть кнопка, при нажатии на которую начинается воспроизведение. После этого эта же кнопка служит для остановки воспроизведения. Время воспроизведения я вывожу label.
Код следующий
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
| using System;
using System.IO;
using System.Windows.Forms;
using NAudio.Wave;
public partial class Form1 : Form
{
public string filePath;
public int play_time, play_hour, play_min, play_sec;
IWavePlayer waveOutDevice;
WaveStream mainOutputStream;
public Form1()
{
InitializeComponent();
}
private WaveStream CreateInputStream(string fileName)
{
{
if (fileName == null)
{
throw new FileNotFoundException("Не указан путь к файлу");
}
WaveChannel32 inputStream;
if (fileName.EndsWith(".wav"))
{
WaveStream readerStream = new WaveFileReader(fileName);
if (readerStream.WaveFormat.Encoding != WaveFormatEncoding.Pcm)
{
readerStream = WaveFormatConversionStream.CreatePcmStream(readerStream);
readerStream = new BlockAlignReductionStream(readerStream);
}
if (readerStream.WaveFormat.BitsPerSample != 16)
{
var format = new WaveFormat(readerStream.WaveFormat.SampleRate, 16, readerStream.WaveFormat.Channels);
readerStream = new WaveFormatConversionStream(format, readerStream);
}
inputStream = new WaveChannel32(readerStream);
}
else
{
throw new InvalidOperationException("Неизвестное расширение");
}
return inputStream;
}
}
private void button4_Click(object sender, EventArgs e)
{
label_time.Visible = false;
if (button4.Text == "Проиграть")
{
try
{
if (textBox_path.Text != "")
{
filePath = textBox_path.Text;
}
mainOutputStream = CreateInputStream(filePath);
waveOutDevice = new WaveOut();
}
catch (FileNotFoundException)
{
MessageBox.Show("Не указан путь к файлу");
return;
}
catch (Exception driverCreateExeption)
{
MessageBox.Show(String.Format("{0}", driverCreateExeption.Message));
return;
}
try
{
waveOutDevice.Init(mainOutputStream);
}
catch (Exception initExeption)
{
MessageBox.Show(String.Format("{0}", initExeption.Message), "Ошибка открытия файла");
return;
}
if (trackBar_Vol.Value == 1000)
{ waveOutDevice.Volume = 1.0f; }
waveOutDevice.Play();
Timer timer2 = new Timer();
timer2.Interval = 1000;
timer2.Tick += new EventHandler(timer2_Tick);
timer2.Start();
button4.Text = "Остановить";
return;
}
if (button4.Text == "Остановить")
{
try
{
waveOutDevice.Stop();
waveOutDevice.Dispose();
button4.Text = "Проиграть";
return;
}
catch (NullReferenceException)
{
MessageBox.Show("Воспроизведение не осуществляется");
return;
}
}
}
private void timer2_Tick(object sender, EventArgs e)
{
if (waveOutDevice.PlaybackState == PlaybackState.Stopped)
{
timer2.Dispose();
play_time = 0;
}
else
{
play_time++;
play_hour = play_time / 3600;
play_min = (play_time - (play_hour * 3600)) / 60;
play_sec = play_time - (play_hour * 3600 + play_min * 60);
label3.Text = String.Format("{0:D2}:{1:D2}:{2:D2}", play_hour, play_min, play_sec);
timer2.Stop();
}
} |
|
Проблема следующая:
Если я нажимаю кнопку "Проиграть", все отображается нормально. Затем нажимаю кнопку "Остановить" . Все останавливается. Но когда я во второй раз нажимаю эту же кнопку для воспроизведения, время в label начинает бежать в 2 раза быстрее
, если воспроизвожу в третий раз - в 3 раза быстрее и т.д. Точнее даже, не равномерно быстрее, а каждая секунда скачет в это количество раз. Т.е. если например нажать "Проиграть" в третий раз, то счет примерно такой "раз, пауза, два, три, четыре, пауза, пять, шесть, семь, пауза, восемь...". И между паузами время примерно секунда
Никак не могу понять, в чем ошибка.