Russian English
   Basic.net
Суббота, 20.04.2024, 12:11
Меню сайта
Категории раздела
Basic [28]
У нас вы можете бесплатно скачать QBasic, VisualBasic, FreeBasic, GW-Basic.
QBasic [4]
Visual Basic [4]
GW-Basic [0]
Игры [1]
FreeBasic [1]
PowerBasic [1]
Облако тегов
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Форма входа
Главная » Файлы » Basic

Делаем свой музыкальный плеер. Часть 2.
Share |
25.06.2013, 15:06
В этой части будет рассмотрен процесс создания программы по работе с плейлистами формата M3U. Плейлист представляет собой обычный текстовой файл, в котором в определенном порядке записаны пути аудиофайлов для воспроизведения.

Шаг 6: разработка формы.
Начнем с того, что создадим ещё одну форму, где пользователь мог бы создавать свои плейлисты самостоятельно и удобно, чтобы потом их прослушивать. Свойство Name = frmPlaylist.
Теперь разместим на форме 4 кнопки с подписями Open (открыть), Save (сохранить), Delete (удалить), Add (добавить). Какие действия каждая должна выполнять и так понятно. Кроме их, размещаем объекты ComboBox (Name = Combo1) и CommondDialog (Name = CommonDialog1), и 2 Label для вывода вспомогательный информации: в одном текущее количество треков в плейлисте, а в другом общее время. И объявим в разделе деклараций следующие переменные:

Код Visual Basic
1 
2
3
Dim Pesnj() As String, n As Integer 
Dim FilTime As String
Dim FileMp3 As String, PlayList As String

Шаг 7: процедура открытия плейлиста.
Прежде всего сделаем процедуру открытия уже готового плейлиста.

Код Visual Basic
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
' если ошибка при открытии, то перейти к метке err 
On Error GoTo err
' локальные переменные
Dim FileM3U As String, Disk As String
intFn = FreeFile
' открытие плейлиста компонентом CommondDialog
CommonDialog1.ShowOpen
FileM3U = CommonDialog1.FileName
' добавляем в КомбоБокс его путь
Combo1.AddItem FileM3U
' на каком диске находится - 3 символа слева, например C:/
Disk = Left(FileM3U, 3)
' открываем файл
Open FileM3U For Input As intFn
' выполнять, пока не дошли до конца файла
Do Until EOF(intFn)
    ' вывод строки
   Line Input #intFn, FileMp3
    ' здесь выделяется имя записи
   If Left(FileMp3, 1) <> "#" And Left(FileMp3, 1) <> " " Then
        If Mid(FileMp3, 2, 2) <> ":\" Then FileMp3 = Disk & FileMp3
    ' добавить имя записи
   Combo1.AddItem FileMp3
    ' вызов процедуры по подсчету времени
   Player.Url = FileMp3
    Call AllTime
    End If
    Loop
    Close #intFn ' закрыть файл
   Combo1.Text = Combo1.List(0) ' FileMp3
   lblTrackCount.Caption = Combo1.ListCount ' выводим в Label число треков в плейлисте
Exit Sub
 ' если ошибка (метка)
err:
 MsgBox "Error: Can not read playlist!", vbCritical

В будущем мы будем обходится без подробного описания алгоритма предложенного кода, поскольку он полностью закомментирован и читателю не составит особого труда изучить его самостоятельно, кроме отдельных моментов, на которые хотелось бы обратить внимание. 
Здесь обратите внимание на использование знакомого объекта Player, в который загружается текущий трек. Сделано это для последующего использования в процедуре AllTime его свойства currentMedia.durationString:

Код Visual Basic
1 
2
3
4
Private Sub AllTime() 
FilTime = Player.currentMedia.durationString
lblTotalTime.Caption = CDate(lblTotalTime.Caption) + CDate(FilTime)
End Sub

Поскольку свойство Caption у объекта Label, а также переменная FilTime имеют тип String (строковой), то при их сложении произойдёт склеивание. С помощью CDate мы даем компилятору понять, что это даты (формат ЧЧ:ММ:СС) и сложить их нужно соответствующим образом: часы с часами и т.д.

Шаг 8: процедура добавления пути файла в плейлист.
Это уже код к командной кнопке Add, которая добавляет файл в плейлист:

Код Visual Basic
1 
2
3
4
5
6
7
8
CommonDialog1.ShowOpen ' открываем окно выбора файла 
If FileMp3 = CommonDialog1.FileName Then Exit Sub ' нельзя добавить один файл два раза подряд
FileMp3 = CommonDialog1.FileName
Combo1.Text = FileMp3 ' текущий текст в КомбоБоксе - последний добавленный файл
Combo1.AddItem FileMp3 ' добавить строку в КомбоБокс
lblTrackCount.Caption = Combo1.ListCount ' считаем количество треков в плейлисте
AllTime ' считаем общее время плейлиста
If FileMp3 <> " " Then cmdOpen_Click ' если был открыт файл M3U

Здесь всё просто - в КомбоБокс добавляется путь файла, выбранного пользователем в CommonDialog, а также увеличивается число треков. Идём дальше.

Шаг 9: процедура удаления содержимого ComboBox.
Комментировать и объяснять, пожалуй, нечего:

Код Visual Basic
1 
2
3
Combo1.Clear 
lblTrackCount.Caption = "0"
lblTotalTime.Caption = "00:00:00"

Шаг 10: процедура сохранения плейлиста.
Эта процедура сохраняет созданный пользователем плейлист в файл:

Код Visual Basic
1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Static num As Integer ' вспомогательная переменная 
num = num + 1
' ввод имение плейлиста
PlayList = InputBox("Please write here name of your playlist. It will be save in the folder with last track", "Save", "Playlist" & num)
n = Combo1.ListCount ' количество треков
ReDim Pesnj(n) ' объявляем строковой массив путей файлов
' заполняем массив циклом
For i = 0 To n
Pesnj(i) = Combo1.List(i)
Next i
PlayList = PlayList + ".m3u" ' формат нашего плейлиста - M3U
intFH = FreeFile()
    ' записать в файл
   Open PlayList For Output As intFH
    For i = 0 To n
    Print #intFH, Pesnj(i)
    Next i
    Close #intFH
    Combo1.Clear ' отчистить плейлист

Шаг 11: воспроизведение плейлиста.
Теперь самый важный шаг - нужно реализовать возможность созданные нами плейлисты воспроизвести! Делается это уже в основной форме. Для этого нужно объявить ещё одну переменную - fromfile типа Boolean, значение True будет означать, что мы открываем файл, а False - плейлист. В этом случае внесем изменения в код нашей кнопки Open основной формы:

Код Visual Basic
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
If fromfile = True Then ' если из файла 
  CDlg1.ShowOpen
   Player.url = CDlg1.FileName
' если плейлист
ElseIf fromfile = False Then
   ' откроем форму для работы с плейлистами, но не будем её показывать
  frmPlaylist.Show
   frmPlaylist.Visible = False
  ' а это немного измененный фрагмент кнопки Open формы frmPlaylist
 ' здесь стоит frmPlaylist перед именами объектов
 ' это показывает, что объект на другой, не текущей форме
 On Error Resume Next
  Dim FileM3U As String, Disk As String, intFn
  intFn = FreeFile
  frmPlaylist.CommonDialog1.ShowOpen
  FileM3U = frmPlaylist.CommonDialog1.FileName
  frmPlaylist.Combo1.AddItem FileM3U
  Disk = Left(FileM3U, 3)
  Open FileM3U For Input As intFn
  Do Until EOF(intFn)
      Line Input #intFn, FileMp3
      If Left(FileMp3, 1) <> "#" And Left(FileMp3, 1) <> " " Then
          If Mid(FileMp3, 2, 2) <> ":\" Then FileMp3 = Disk & FileMp3
      frmPlaylist.Combo1.AddItem FileMp3
      End If
      Loop
      Close #intFn
      frmPlaylist.Combo1.Text = frmPlaylist.Combo1.List(0) ' FileMp3
     frmPlaylist.TrackCount.Caption = frmPlaylist.Combo1.ListCount
  Player.url = frmPlaylist.Combo1
' вызов функции, которая получает путь трека из плейлиста
' нужно объявить переменную tracknumber (тип Integer) как глобальную
 tracknumber = 1
  Call GetTrackFromPlaylist
End If

Зачем мы не поместили ту процедуру открытия плейлиста в модуль? Дело в том, что модули используются для разных программ и использовать имена объектов там нельзя, а значит нам бы пришлось делать более сложную процедуру с большим количеством входящих переменных - не будем усложнять себе этим жизнь, к тому же мы не гонимся за оптимизацией кода. 

Зачем мы оставили строки заполнения КомбоБокса другой формы, которая всё равно не видна? Когда пользователь откроет форму создания плейлиста, перед ним уже будет открыт его плейлист. 

Одна проблема - вызвать процедуру AllTime другой формы мы не можем (да и на главной форме есть процедура с таким именем!), чтобы посчитать общее время. Это легко решить, объявляем там глобальную переменную типа Boolean под именем NewPlaylist; True, если плейлист открывается там кнопкой Open, False, если он был открыт из основной формы при открытии плейлиста. С помощью конструкции if...elseif делаем следующим образом: если переменная имеет значение True, то выполняется тот код, что был у нас там до этого, если False, то уже часть кода кнопки Open (открытие и чтение файла, включая цикл do until...loop), но убираем всё лишнее (заполнение КомбоБокса, например), заменяем вызов процедуру AllTime на ту часть кода, что у нас под True (иначе будет рекурсия). Другими словами, нужно просмотреть каждую строчку файла, загрузить путь каждого файла в Player, суммировать их и Label. Для этого вполне можно использовать уже имеющийся код.

Вышеописанное изменение процедуры AllTime формы frmPlaylist нужно, чтобы предотвратить возникающий баг. Однако не забудьте изменить процедуру AllTime основной формы, ведь теперь её нужно тоже приспособить для плейлистов:

lblTotalTime.Caption = CDate(lblTotalTime.Caption) + CDate(Player.currentMedia.durationString)

Ну и чтобы не было ошибки в случае открытии обычного файла (значение Label будет равно "ничему", и его нельзя сложить!), в Form_Load главной формы добавим:

lblTotalTime.Caption = "00:00:00"

А теперь процедура GetTrackFromPlaylist (не забудьте объявить tracknumber (Integer) и track (String) как глобальные переменные!):

Код Visual Basic
1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub GetTrackFromPlaylist () 
Dim FileNum As Byte ' файл
Dim intCount As Integer ' счетчик
FileNum = FreeFile
' открыть файл
Open Player.url For Input As FileNum
' начнем с первой строки
intCount = 1
' просмотреть все строки
Do While Not EOF(FileNum)
    ' загружаем нужную строку в переменную
   Line Input #FileNum, track
    If intCount = tracknumber Then Exit Sub
    ' переходим к следующей строке
   intCount = intCount + 1
Loop
Close FileNum
End Sub

Открывается файл для вывода, идет поиск нужной строки и загрузка её пути в переменную.
А используется эта процедура вот где ещё. Создадим две кнопки Next и Pervious, которыми будем переключаться между треками плейлиста, и пропишем к ним такой код:

Код Visual Basic
1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub cmdNext_Click() 
Player.Controls.Next
If fromfile = False Then
   tracknumber = tracknumber + 1
   Call GetTrackFromPlaylist
End If
End Sub
 
Private Sub cmdPervious_Click()
Player.Controls.previous
If fromfile = False Then
   If tracknumber = 1 Then Exit Sub
   tracknumber = tracknumber - 1
   Call GetTrackFromPlaylist
End If
End Sub

Инструкции Player.Controls.Next и Player.Controls.previous переключают текущий трек в плейлисте, а конструкция if..endif здесь используется для получения пути текущего файла в переменную track, которую мы ещё будем использовать в следующей части для чтения тегов файла.


На этом вторая часть статьи подходит к концу. Приведенные исходные коды отчасти универсальны, так как могут использоваться без компонента WMP в других программах с небольшим изменением.

Категория: Basic | Добавил: Admin
Просмотров: 2923 | Загрузок: 0 | Рейтинг: 5.0/2
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск
Наш опрос
Какую версию Basic вы предпочитаете?
Всего ответов: 2140

© Basic.ucoz.net, 2024