Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 20.10.2010
Сообщений: 32
1

NAudio: Отображение длительности воспроизведения

31.05.2012, 13:05. Показов 2359. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите найти ошибку.
Пытаюсь отобразить на форме текущее время воспроизведения.
У меня есть кнопка, при нажатии на которую начинается воспроизведение. После этого эта же кнопка служит для остановки воспроизведения. Время воспроизведения я вывожу 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 раза быстрее и т.д. Точнее даже, не равномерно быстрее, а каждая секунда скачет в это количество раз. Т.е. если например нажать "Проиграть" в третий раз, то счет примерно такой "раз, пауза, два, три, четыре, пауза, пять, шесть, семь, пауза, восемь...". И между паузами время примерно секунда
Никак не могу понять, в чем ошибка.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.05.2012, 13:05
Ответы с готовыми решениями:

Автоматическое отображение длительности
Здравствуйте, MS Project начал использовать недавно (сегодня), поэтому не ругайтесь если что)...

Неправильное отображение длительности смены
Добрый день! Подскажите что не так сделал. В приложенном примере поле отображающее длительность не...

Формулы длительности
Добрый день! Считаю общую длительность занятий по формуле: Sum(Hour(!))+Sum(Minute(!))\60 & ":"...

Настройка длительности сессии
интересую такие вопросы как длительность сессии ( сейчас меня например если не активен то через пол...

0
31.05.2012, 13:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2012, 13:05
Помогаю со студенческими работами здесь

Конвертация длительности из Numbers
Всем привет. Имеется таблица в Numbers, которую нужно преобразовать в Excel. Таблица...

Ограничитель длительности импульса
Может у кого имеются наработки ограничения длительности импульса с выхода МК на силовые ключи?...

Вывод длительности песни
Всем привет! Такая задача: нужно чтобы выводилась длительность песни и сколько осталось до конца....

Измерение длительности операции
Доброго времени суток! Есть программка для измерения длительности цикла с определенным количеством...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru