557 / 434 / 21
Регистрация: 16.12.2010
Сообщений: 953
1

Как узнать что воспроизведение завершено?

01.04.2011, 11:41. Показов 7353. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот нашел такой код для проигрывания Mp3
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
   Private Declare Function MSS Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
 
    Public Function PlayFile(ByVal strFileName As String) As Long     ' Воспроизведение внещнего файла
        Call StopPlay()
        Call MSS("OPEN " & strFileName & " ALIAS FIRST", vbNullString, 0&, 0&)
        PlayFile = MSS("PLAY FIRST", vbNullString, 0&, 0&)
    End Function
 
    Public Sub StopPlay()                                       ' Остановка внешнего файла
        Call MSS("STOP FIRST", vbNullString, 0&, 0&)
        Call MSS("CLOSE FIRST", vbNullString, 0&, 0&)
    End Sub
возникло несколько вопросов: как узнать что воспроизведение завершено?
у меня есть listbox с путями к MP3 файлам как сделать так, чтобы проигрывание завершалось, прибавлялось в переменную ind единица и играла следующая музяка?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2011, 11:41
Ответы с готовыми решениями:

Как узнать, что картинка полностью загружена, чтобы узнать её размеры
Здраствуйте ! Делаю галерею. Мне нужно узнать когда картинка загрузица полносттю, чтобы узнать её...

Как завершить дочернее приложение если родительское было завершено?
Ситуация такая. Есть родительское приложение. Оно создаёт дочерний процесс, с которым общается...

Как узнать, что в ком порт что-то записалось?
Народ, подскажите как узнать что в ком порт что-то записалось, точнее пришло от подключенного...

Восстановление не завершено
Всем привет! Вожможно уже была такая тема( я ее не нашел). Проблема такая....при восстановлении...

23
1710 / 1198 / 227
Регистрация: 23.12.2010
Сообщений: 1,527
01.04.2011, 12:37 2
Лучший ответ Сообщение было отмечено как решение

Решение

VB.NET
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
' добавить ссылку на Microsoft.DirectX.AudioVideoPlayback !!!!!
Public Class Form1
 
    Dim WithEvents PLR As Microsoft.DirectX.AudioVideoPlayback.Audio
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' кнопка выбора файлов
        Using FBD As New OpenFileDialog
            With FBD
                .Filter = "Аудио|*.mp3"
                .Multiselect = True
                .InitialDirectory = My.Computer.FileSystem.SpecialDirectories.Desktop
            End With
            If FBD.ShowDialog = Windows.Forms.DialogResult.OK Then
                If MsgBox("Очистить список предварительно?", MsgBoxStyle.OkCancel Or MsgBoxStyle.Question) = MsgBoxResult.Ok Then
                    Me.ListBox1.ClearSelected()
                    Me.ListBox1.Items.AddRange(FBD.FileNames)
                Else
                    Me.ListBox1.Items.AddRange(FBD.FileNames)
                End If
            End If
        End Using
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If PLR Is Nothing = False Then PLR.Stop() ' на случай, если что то уже играло
        PLR = New Microsoft.DirectX.AudioVideoPlayback.Audio(Me.ListBox1.SelectedItem)
        PLR.Play()
        Me.HScrollBar1.Maximum = PLR.Duration
    End Sub
 
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        PLR.Pause()
    End Sub
 
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        PLR.Stop()
    End Sub
Для получения инфы о текущей позиции, громкости и прочему раскуривай это. Если что, вечером допишу, щас уже некогда.
3
557 / 434 / 21
Регистрация: 16.12.2010
Сообщений: 953
01.04.2011, 13:38  [ТС] 3
Библиотека "C:\WINDOWS\assembly\GAC\Microsoft.DirectX\1.0.2902.0__31bf3856ad364e35\Microsof t.DirectX.dll" пытается выполнить управляемый код под блокировкой OS Loader. Запуск управляемого кода в пределах функции DllMain или функции инициализации образа может вызвать зависание приложения.
можно ли убрать это сообщение? оно на работу программы не влияет, а вот на пользователя повлиять может))
0
1710 / 1198 / 227
Регистрация: 23.12.2010
Сообщений: 1,527
01.04.2011, 16:47 4
Цитата Сообщение от Ciberst Посмотреть сообщение
можно ли убрать это сообщение?
оно появляется только при запуске в режиме отладки из-под студии. Если же запустить сам экзешник из папки debug/release, то сообщения не будет.
Это просто студия так настроена (в свойствах проекта), что предупреждает об таких стремах.
2
557 / 434 / 21
Регистрация: 16.12.2010
Сообщений: 953
01.04.2011, 19:16  [ТС] 5
То ли я туплю, то ли действительно, НО после того как проиграет песню и играет следующую, предыдущую песню прочитать нельзя до закрытия программы
VB.NET
1
2
3
4
   If PLR Is Nothing = False Then PLR.Stop() ' на случай, если что то уже играло
                PLR = New Microsoft.DirectX.AudioVideoPlayback.Audio(ListBox1.Items(ind - 1))
                PLR.Play()
                PLR.Volume = volume
значение переменной ind меняется после завершения песни на 1

Добавлено через 7 минут
разобрался, поменял эту строчку
VB.NET
1
 If PLR Is Nothing = False Then PLR.Stop() ' на случай, если что то уже играло
на
VB.NET
1
PLR.Dispose
0
1710 / 1198 / 227
Регистрация: 23.12.2010
Сообщений: 1,527
01.04.2011, 20:39 6
Лучший ответ Сообщение было отмечено как решение

Решение

Вот пример поинтереснее немного в плане набора функций:
- выбор папки, откуда играть и создание списка файлов
- пауза/продолжить
- воспроизведение по двойному клику в списке
- регулировка громкости
- баланс
- отображение длины трека и текущей позиции воспроизведения
- получение списка метатегов файла, если они там есть (в формате ID3v1)
На форму кидаем:
Button - 3шт
ListBox - 2шт
HScrollBar - 3шт
Label - 3шт
Timer - 1шт

Код формы:
VB.NET
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
Public Class Form1
    Dim WithEvents APLR As Microsoft.DirectX.AudioVideoPlayback.Audio
    Dim currentPlayPos As Integer
    Dim CurPos_inTrak As Integer
    
    ''' <summary>
    ''' Функция возвращает набор тегов из файлов *.mp3 (согласно формата ID3v1) в виде массива строк. Если теги отсутствуют - возвращает Nothing
    ''' </summary>
    ''' <param name="path">путь к файлу</param>
    ''' <returns>Список возвращаемых тегов: название, исполнитель, альбом, год, комментарий, номер трека, жанр</returns>
    ''' <remarks></remarks>
    Private Function GetTagSTR(ByVal path As String) As String()
        ReDim GetTagSTR(6) ' задаем длину пустого массива
        Dim Genres() As String = {"Blues ", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", "Other", "Pop", "R&B", "Rap", "Reggae", "Rock", "Techno", "Industrial", "Alternative", "Ska", "Death Metal", "Pranks", "Soundtrack", "Euro-Techno", "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk", "Fusion", "Trance", "Classical", "Instrumental", "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "AlternRock", "Bass", "Soul", "Punk", "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", "Ethnic", "Gothic", "Darkwave", "Techno-Industrial", "Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy", "Cult", "Gangsta", "Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native American", "Cabaret", "New Wave", "Psychadelic", "Rave", "Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk", "Acid Jazz", "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk", "Folk-Rock", "National Folk", "Swing", "Fast Fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass", "Avantgarde", "Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", "Big Band", "Chorus", "Easy Listening", "Acoustic", "Humour", "Speech", "Chanson", "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus", "Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba", "Folklore", "Ballad", "Power Ballad", "Rhythmic Soul", "Freestyle", "Duet", "Punk Rock", "Drum Solo", "A capella", "Euro-House", "Dance Hall"} 'список жанров
        Dim L As Integer
        Dim FS As System.IO.FileStream
        FS = System.IO.File.Open(path, IO.FileMode.Open, IO.FileAccess.Read)
        L = FS.Length
        Dim buff(L - 1) As Byte
        FS.Read(buff, 0, L)
        FS.Close()
        Dim TAG, Ntrak, GenreInd, Genre As String
        TAG = System.Text.Encoding.Default.GetChars(buff, L - 128, 3) 'TAG - заголовок метатега. Если тут иное, то это не набор тегов
        If TAG.Equals("TAG") = False Then Return Nothing
        Ntrak = AscW(System.Text.Encoding.Default.GetChars(buff, L - 128 + 126, 1))
        GenreInd = AscW(System.Text.Encoding.Default.GetChars(buff, L - 128 + 127, 1)) 'Индекс в списке жанров или 255
        If CInt(GenreInd) > 0 And CInt(GenreInd) < 126 Then
            Genre = Genres.GetValue(CInt(GenreInd))
        Else
            Genre = "unknown"
        End If
        'Готовим исходящий массив
        GetTagSTR.SetValue(System.Text.Encoding.Default.GetString(buff, L - 128 + 3, 30), 0) 'название 
        GetTagSTR.SetValue(System.Text.Encoding.Default.GetString(buff, L - 128 + 33, 30), 1) 'исполнитель
        GetTagSTR.SetValue(System.Text.Encoding.Default.GetString(buff, L - 128 + 63, 30), 2) 'альбом
        GetTagSTR.SetValue(System.Text.Encoding.Default.GetString(buff, L - 128 + 93, 4), 3) 'год
        GetTagSTR.SetValue(System.Text.Encoding.Default.GetString(buff, L - 128 + 97, 28), 4) 'комментарий
        GetTagSTR.SetValue(Ntrak, 5) 'номер трека
        GetTagSTR.SetValue(Genre, 6) 'жанр
        Array.Clear(buff, 0, L)
        Return GetTagSTR
    End Function
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.ListBox1.Items.Clear()
        Dim FoldD As New FolderBrowserDialog
        If FoldD.ShowDialog = Windows.Forms.DialogResult.OK Then
            Me.ListBox1.Items.AddRange(System.IO.Directory.GetFiles(FoldD.SelectedPath, "*.mp3"))
        End If
    End Sub
 
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        'получение метатегов
        ListBox2.Items.Clear()
        Try
            Dim ss As String() = GetTagSTR(ListBox1.SelectedItem)
            For Each s As String In ss
                Me.ListBox2.Items.Add(s)
            Next
        Catch ex As Exception
        End Try
 
        Me.currentPlayPos = Me.ListBox1.SelectedIndex
        If APLR Is Nothing = False Then
            APLR.Stop()
            APLR.Dispose()
        End If
        Me.APLR = Audio.FromFile(Me.ListBox1.SelectedItem)
        Me.APLR.Play()
    End Sub
 
    Private Sub AudioPlayer_Ending(ByVal sender As Object, ByVal e As System.EventArgs) Handles APLR.Ending
        If APLR Is Nothing = False Then
            APLR.Stop()
            Me.APLR.Dispose()
        End If
        Me.currentPlayPos = Me.currentPlayPos + 1
        If Me.currentPlayPos = Me.ListBox1.Items.Count Or Me.currentPlayPos > Me.ListBox1.Items.Count Then
            If APLR Is Nothing = False Then APLR.Stop()
            Exit Sub
        End If
        If APLR Is Nothing = False Then APLR.Stop()
        Me.ListBox1.SelectedIndex = Me.currentPlayPos
        'получение метатегов
        ListBox2.Items.Clear()
        Try
            Dim ss As String() = GetTagSTR(ListBox1.SelectedItem)
            For Each s As String In ss
                Me.ListBox2.Items.Add(s)
            Next
        Catch ex As Exception
        End Try
        Me.APLR = Audio.FromFile(Me.ListBox1.Items(Me.currentPlayPos))
        Me.APLR.Play()
    End Sub
 
    Private Sub HScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar1.Scroll
        If APLR Is Nothing = False Then
            Me.APLR.Volume = HScrollBar1.Value
        End If
        Me.Label1.Text = Math.Round(HScrollBar1.Value / (HScrollBar1.Maximum - HScrollBar1.Minimum) * 100 + 100, 1)
    End Sub
 
    Private Sub HScrollBar2_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar2.Scroll
        If APLR Is Nothing = False Then
            Me.APLR.Balance = HScrollBar2.Value
        End If
        Me.Label2.Text = Math.Round(HScrollBar2.Value / (HScrollBar2.Maximum - HScrollBar2.Minimum) * 100, 1)
    End Sub
 
    Private Sub HScrollBar3_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar3.Scroll
        If APLR Is Nothing = False Then
            Me.APLR.CurrentPosition = Me.HScrollBar3.Value
        End If
    End Sub
 
    Private Sub ListBox1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.DoubleClick
        Me.currentPlayPos = Me.ListBox1.SelectedIndex
        If APLR Is Nothing = False Then
            Me.APLR.Stop()
            Me.APLR.Dispose()
        End If
        'получение метатегов
        ListBox2.Items.Clear()
        Try
            Dim ss As String() = GetTagSTR(ListBox1.SelectedItem)
            For Each s As String In ss
                Me.ListBox2.Items.Add(s)
            Next
        Catch ex As Exception
        End Try
 
        Me.APLR = Audio.FromFile(Me.ListBox1.Items(Me.currentPlayPos))
        Me.APLR.Play()
        Me.Timer1.Start()
        Me.ListBox1.SelectedIndex = Me.currentPlayPos
    End Sub
 
    Private Sub AP_Starting(ByVal sender As Object, ByVal e As System.EventArgs) Handles APLR.Starting
        Me.Timer1.Start()
        Me.Button2.Text = "Пауза"
        Me.HScrollBar3.Maximum = APLR.Duration
        Me.HScrollBar3.Value = APLR.CurrentPosition
        Me.CurPos_inTrak = APLR.CurrentPosition
        Me.APLR.Balance = Me.HScrollBar2.Value
        Me.APLR.Volume = Me.HScrollBar1.Value
    End Sub
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If Me.APLR.CurrentPosition <> Me.CurPos_inTrak Then
            Me.HScrollBar3.Value = Me.APLR.CurrentPosition
        End If
    End Sub
 
    Private Sub HScrollBar3_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles HScrollBar3.ValueChanged
        If APLR Is Nothing = False Then
            Me.Label3.Text = CInt(APLR.CurrentPosition) & "/" & CInt(Me.APLR.Duration)
        End If
    End Sub
 
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.Label2.Text = Me.HScrollBar2.Value
        Me.Label1.Text = Me.HScrollBar1.Value
        Me.Label3.Text = Me.HScrollBar3.Value
        Me.Button1.Text = "Выбрать файлы"
        Me.Button2.Text = "Пауза/Продолжить"
        Me.Button3.Text = "Воспроизведение"
        Me.Button2.Enabled = True
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If APLR Is Nothing = False Then
            If APLR.Paused = False Then
                APLR.Pause()
                Me.Button2.Text = "Продолжить"
            ElseIf APLR.Paused = True Then
                APLR.Play()
                Me.Button2.Text = "Пауза"
            End If
        End If
    End Sub
End Class
3
557 / 434 / 21
Регистрация: 16.12.2010
Сообщений: 953
01.04.2011, 22:21  [ТС] 7
С тегами разобрался уже, но все же спасибо
0
557 / 434 / 21
Регистрация: 16.12.2010
Сообщений: 953
09.04.2011, 12:39  [ТС] 8
Возник еще один подвопрос, как изменять скорость воспроизведения?
0
1710 / 1198 / 227
Регистрация: 23.12.2010
Сообщений: 1,527
09.04.2011, 13:52 9
Без понятия. Класс Microsoft.DirectX.AudioVideoPlayback.Audio вроде как таких инструментов не предоставляет...
0
0 / 0 / 0
Регистрация: 19.04.2011
Сообщений: 15
19.04.2011, 23:22 10
Добавлено через 3 минуты
Цитата Сообщение от Ciberst Посмотреть сообщение
Возник еще один подвопрос, как изменять скорость воспроизведения?
Попробуй использовать TrackBar

VB.NET
1
2
3
Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
RateOfSpeech = TrackBar1.Value
End Sub
0
1710 / 1198 / 227
Регистрация: 23.12.2010
Сообщений: 1,527
31.01.2012, 23:59 11
Лучший ответ Сообщение было отмечено как решение

Решение

Заметил, что тема продолжает интересовать народ (сегодня ее смотрели и мне кинули спасибки за код). В приведенном ранее коде была одна критическая неисправность: проигранные треки так и оставались занятыми (я там перемудрил несколько), а потребление памяти росло. Поскольку сие мне покоя не давало, недавно вернулся к вопросу и исправил:

Полный листинг кода
VB.NET
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
Imports Microsoft.DirectX.AudioVideoPlayback
Imports Microsoft.DirectX.PrivateImplementationDetails
Public Class Form1
    Dim WithEvents APLR As Microsoft.DirectX.AudioVideoPlayback.Audio
    Dim currentPlayPos As Integer
    Dim CurPos_inTrak As Integer
    
    ''' <summary>
    ''' Функция возвращает набор тегов из файлов *.mp3 (согласно формата ID3v1) в виде массива строк. Если теги отсутствуют - возвращает Nothing
    ''' </summary>
    ''' <param name="path">путь к файлу</param>
    ''' <returns>Список возвращаемых тегов: название, исполнитель, альбом, год, комментарий, номер трека, жанр</returns>
    ''' <remarks></remarks>
    Private Function GetTagSTR(ByVal path As String) As String()
        ReDim GetTagSTR(6) ' задаем длину пустого массива
        Dim Genres() As String = {"Blues ", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", "Other", "Pop", "R&B", "Rap", "Reggae", "Rock", "Techno", "Industrial", "Alternative", "Ska", "Death Metal", "Pranks", "Soundtrack", "Euro-Techno", "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk", "Fusion", "Trance", "Classical", "Instrumental", "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "AlternRock", "Bass", "Soul", "Punk", "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", "Ethnic", "Gothic", "Darkwave", "Techno-Industrial", "Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy", "Cult", "Gangsta", "Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native American", "Cabaret", "New Wave", "Psychadelic", "Rave", "Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk", "Acid Jazz", "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk", "Folk-Rock", "National Folk", "Swing", "Fast Fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass", "Avantgarde", "Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", "Big Band", "Chorus", "Easy Listening", "Acoustic", "Humour", "Speech", "Chanson", "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus", "Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba", "Folklore", "Ballad", "Power Ballad", "Rhythmic Soul", "Freestyle", "Duet", "Punk Rock", "Drum Solo", "A capella", "Euro-House", "Dance Hall"} 'список жанров
        Dim L As Integer
        Dim FS As System.IO.FileStream
        FS = System.IO.File.Open(path, IO.FileMode.Open, IO.FileAccess.Read)
        L = FS.Length
        Dim buff(L - 1) As Byte
        FS.Read(buff, 0, L)
        FS.Close()
        Dim TAG, Ntrak, GenreInd, Genre As String
        TAG = System.Text.Encoding.Default.GetChars(buff, L - 128, 3) 'TAG - заголовок метатега. Если тут иное, то это не набор тегов
        If TAG.Equals("TAG") = False Then Return Nothing
        Ntrak = AscW(System.Text.Encoding.Default.GetChars(buff, L - 128 + 126, 1))
        GenreInd = AscW(System.Text.Encoding.Default.GetChars(buff, L - 128 + 127, 1)) 'Индекс в списке жанров или 255
        If CInt(GenreInd) > 0 And CInt(GenreInd) < 126 Then
            Genre = Genres.GetValue(CInt(GenreInd))
        Else
            Genre = "unknown"
        End If
        'Готовим исходящий массив
        GetTagSTR.SetValue(System.Text.Encoding.Default.GetString(buff, L - 128 + 3, 30), 0) 'название 
        GetTagSTR.SetValue(System.Text.Encoding.Default.GetString(buff, L - 128 + 33, 30), 1) 'исполнитель
        GetTagSTR.SetValue(System.Text.Encoding.Default.GetString(buff, L - 128 + 63, 30), 2) 'альбом
        GetTagSTR.SetValue(System.Text.Encoding.Default.GetString(buff, L - 128 + 93, 4), 3) 'год
        GetTagSTR.SetValue(System.Text.Encoding.Default.GetString(buff, L - 128 + 97, 28), 4) 'комментарий
        GetTagSTR.SetValue(Ntrak, 5) 'номер трека
        GetTagSTR.SetValue(Genre, 6) 'жанр
        Array.Clear(buff, 0, L)
        Return GetTagSTR
    End Function
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.ListBox1.Items.Clear()
        Dim FoldD As New FolderBrowserDialog
        If FoldD.ShowDialog = Windows.Forms.DialogResult.OK Then
            Me.ListBox1.Items.AddRange(System.IO.Directory.GetFiles(FoldD.SelectedPath, "*"))
        End If
    End Sub
 
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        If Me.ListBox1.SelectedItem Is Nothing Then Exit Sub
        'получение метатегов
        ListBox2.Items.Clear()
        Try
            Dim ss As String() = GetTagSTR(ListBox1.SelectedItem)
            For Each s As String In ss
                Me.ListBox2.Items.Add(s)
            Next
        Catch ex As Exception
        End Try
        Me.currentPlayPos = Me.ListBox1.SelectedIndex
        If APLR Is Nothing = False Then
            Me.APLR.Open(Me.ListBox1.SelectedItem, False)
        Else
            Me.APLR = Audio.FromFile(Me.ListBox1.SelectedItem, False)
        End If
        Me.APLR.Play()
    End Sub
 
    Private Sub AudioPlayer_Ending(ByVal sender As Object, ByVal e As System.EventArgs) Handles APLR.Ending
        If Me.ListBox1.SelectedIndex = Me.ListBox1.Items.Count - 1 Then
            Exit Sub ' весь список проигран
        Else
            Me.currentPlayPos = Me.ListBox1.SelectedIndex + 1
            Me.ListBox1.SelectedIndex = Me.currentPlayPos
        End If
        ListBox2.Items.Clear()
        Try
            Dim ss As String() = GetTagSTR(ListBox1.SelectedItem)
            For Each s As String In ss
                Me.ListBox2.Items.Add(s)
            Next
        Catch ex As Exception
        End Try
        Me.APLR.Open(Me.ListBox1.Items(Me.currentPlayPos), False)
        Me.APLR.Play()
        If Me.Timer1.Enabled = False Then Me.Timer1.Start()
    End Sub
 
    Private Sub HScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar1.Scroll
        If APLR Is Nothing = False Then
            Me.APLR.Volume = HScrollBar1.Value
        End If
        Me.Label1.Text = Math.Round(HScrollBar1.Value / (HScrollBar1.Maximum - HScrollBar1.Minimum) * 100 + 100, 1)
    End Sub
 
    Private Sub HScrollBar2_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar2.Scroll
        If APLR Is Nothing = False Then
            Me.APLR.Balance = HScrollBar2.Value
        End If
        Me.Label2.Text = Math.Round(HScrollBar2.Value / (HScrollBar2.Maximum - HScrollBar2.Minimum) * 100, 1)
    End Sub
 
    Private Sub HScrollBar3_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar3.Scroll
        If APLR Is Nothing = False Then
            Me.APLR.CurrentPosition = Me.HScrollBar3.Value
        End If
    End Sub
 
    Private Sub ListBox1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.DoubleClick
        Me.currentPlayPos = Me.ListBox1.SelectedIndex
        If APLR Is Nothing = False Then
            Me.APLR.Stop()
        End If
        'получение метатегов
        ListBox2.Items.Clear()
        Try
            Dim ss As String() = GetTagSTR(ListBox1.SelectedItem)
            For Each s As String In ss
                Me.ListBox2.Items.Add(s)
            Next
        Catch ex As Exception
        End Try
        If Me.APLR Is Nothing = False Then
            Me.APLR.Open(Me.ListBox1.Items(Me.currentPlayPos), False)
        Else
            Me.APLR = Audio.FromFile(Me.ListBox1.Items(Me.currentPlayPos), False)
        End If
        Me.APLR.Play()
        If Me.Timer1.Enabled = False Then Me.Timer1.Start()
        Me.ListBox1.SelectedIndex = Me.currentPlayPos
    End Sub
 
    Private Sub AP_Starting(ByVal sender As Object, ByVal e As System.EventArgs) Handles APLR.Starting
        If Me.Timer1.Enabled = False Then Me.Timer1.Start()
        Me.Button2.Text = "Пауза"
        Me.HScrollBar3.Maximum = APLR.Duration
        Me.HScrollBar3.Value = APLR.CurrentPosition
        Me.CurPos_inTrak = APLR.CurrentPosition
        Me.APLR.Balance = Me.HScrollBar2.Value
        Me.APLR.Volume = Me.HScrollBar1.Value
    End Sub
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If Me.APLR.CurrentPosition <> Me.CurPos_inTrak Then
            Me.HScrollBar3.Value = Me.APLR.CurrentPosition
        End If
    End Sub
 
    Private Sub HScrollBar3_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles HScrollBar3.ValueChanged
        If APLR Is Nothing = False Then
            Me.Label3.Text = CInt(APLR.CurrentPosition) & "/" & CInt(Me.APLR.Duration)
        End If
    End Sub
 
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.Label1.Text = Math.Round(HScrollBar1.Value / (HScrollBar1.Maximum - HScrollBar1.Minimum) * 100 + 100, 1)
        Me.Label2.Text = Me.HScrollBar2.Value
        Me.Label3.Text = Me.HScrollBar3.Value
        Me.Button1.Text = "Выбрать файлы"
        Me.Button2.Text = "Пауза/Продолжить"
        Me.Button3.Text = "Воспроизведение"
        Me.Button2.Enabled = True
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If APLR Is Nothing = False Then
            If APLR.Paused = False Then
                APLR.Pause()
                Me.Button2.Text = "Продолжить"
            ElseIf APLR.Paused = True Then
                APLR.Play()
                Me.Button2.Text = "Пауза"
            End If
        End If
    End Sub
 
    Private Sub ListBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox1.DragDrop
        For Each oneFile As String In e.Data.GetData(DataFormats.FileDrop)
            If oneFile.EndsWith(".mp3", StringComparison.InvariantCultureIgnoreCase) Then
                Me.ListBox1.Items.Add(oneFile)
            End If
        Next
    End Sub
 
    Private Sub ListBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox1.DragEnter
        If e.Data.GetDataPresent(DataFormats.FileDrop) = True Then
            e.Effect = DragDropEffects.Copy
        End If
    End Sub
End Class

Набор элементов управления на форме:
Button - 3шт
ListBox - 2шт
HScrollBar - 3шт
Label - 3шт
Timer - 1шт
8
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
01.02.2012, 00:23 12
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
так и оставались занятыми (я там перемудрил несколько), а потребление памяти росло
да знакомая проблема, я с ней столкнулся. когда делал видеоплейер с помощью DirectX
0
20 / 20 / 1
Регистрация: 17.08.2012
Сообщений: 180
Записей в блоге: 1
15.03.2013, 11:19 13
Юпатов Дмитрий, А как сделать в перемотке чтобы при клике ползунок перемещался именно в позицию под мышкой, а не через интервал? (использовал трекбол)
0
1710 / 1198 / 227
Регистрация: 23.12.2010
Сообщений: 1,527
15.03.2013, 12:00 14
та там мудрить надо с кодом. Т.к. ползунок с другой стороны управляется самой программой - положение его синхронизировано с текущим временем трека. Надо вспоминать, щас не скажу. Опять же - проект дома.
0
20 / 20 / 1
Регистрация: 17.08.2012
Сообщений: 180
Записей в блоге: 1
15.03.2013, 12:03 15
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
та там мудрить надо с кодом. Т.к. ползунок с другой стороны управляется самой программой - положение его синхронизировано с текущим временем трека. Надо вспоминать, щас не скажу. Опять же - проект дома.
Я игрался с ним, но ничего путевого пока не нашел. Перетягивание помогает, а вот клик...
0
1710 / 1198 / 227
Регистрация: 23.12.2010
Сообщений: 1,527
15.03.2013, 12:19 16
А... наверное понял. Это у него есть свойство LargeChange, которое и определяет величину интервала смещения ползунка при клике мышью на скроллбаре.
Но нам надо получить координату курсора в точке щелчка. А события MouseClick нету, чтоб из него получать. Есть, правда, MouseWheel - срабатывает при установленном на скроллбаре курсоре и вращении колеса. Там из параметра e вытащить interval и прибавить к текущему положению ползунка. Ну а дальше - см. существующий код в событии Scroll у скроллбара.
0
2 / 2 / 0
Регистрация: 11.03.2013
Сообщений: 30
15.03.2013, 19:00 17
Ошибки появились:

Warning 1 Namespace or type specified in the Imports 'Microsoft.DirectX.AudioVideoPlayback' doesn't contain any public member or cannot be found. Make sure the namespace or the type is defined and contains at least one public member. Make sure the imported element name doesn't use any aliases.

Warning 2 Namespace or type specified in the Imports 'Microsoft.DirectX.PrivateImplementationDetails' doesn't contain any public member or cannot be found. Make sure the namespace or the type is defined and contains at least one public member. Make sure the imported element name doesn't use any aliases.

Error 3 Type 'Microsoft.DirectX.AudioVideoPlayback.Audio' is not defined. 4 28 Mp3Player
Error 4 Name 'Audio' is not declared. 69 23 Mp3Player
Error 5 Name 'Audio' is not declared. 131 23 Mp3Player
0
1710 / 1198 / 227
Регистрация: 23.12.2010
Сообщений: 1,527
15.03.2013, 23:34 18
Microsoft.DirectX.AudioVideoPlayback нужно добавить в ссылках к проекту. И ворнинги исчезнут. Ошибки тоже.
1
20 / 20 / 1
Регистрация: 17.08.2012
Сообщений: 180
Записей в блоге: 1
16.03.2013, 02:17 19
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Сделал на основе этого кода небольшой плеер. Примитивный, но удобный
спрашивайте, подскажу
Миниатюры
Как узнать что воспроизведение завершено?  
Вложения
Тип файла: 7z Бабёр.7z (95.7 Кб, 45 просмотров)
2
20 / 20 / 1
Регистрация: 17.08.2012
Сообщений: 180
Записей в блоге: 1
17.03.2013, 01:29 20
А вообще, посмотрите в сторону libZPlay
http://libzplay.sourceforge.net/
Пользуюсь, очень удобная библиотека. Не будет зависимости от директХ
0
17.03.2013, 01:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2013, 01:29
Помогаю со студенческими работами здесь

Как узнать что открыл?
Привет. У меня на форме TButton,TEdit,TOpenDialog. При нажатии кнопки срабатывает OpenDialog и при...

как узнать что выполнять?
Вообщем пишу одну софтину для вк. И там надо выполнять разные действия, например рассказать друзьям...

Как узнать что добавил?
Здравствуйте. Задача: имеем MySQL. В нем базу и таблицу. В этой таблице есть поле id со...

как узнать что Value Is Integer
сабж


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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