Создание плеера на BASS |
Admin | Дата: Понедельник, 21.09.2009, 18:35 | Сообщение # 16 |
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
| Так, интересно, ведь в ListBoxе хранятся пути, а выводятся только теги. Можно поподробнее про то что происходит с программой (ошибка, ничего не изменяется, и т.д.) Кстати, код функции которая воспроизводит файл, не содержит указания на воспроизведение. На склько я помню нужно вызывать функцию которая будет начинать воспроизведение, также есть функция приостанавливающая и останавливающая воспроизведение.
Не оказываю помощь через личные сообщения и ICQ
|
|
| |
|
ZuBy | Дата: Понедельник, 21.09.2009, 20:31 | Сообщение # 17 |
Ранг 5
Группа: Проверенные
Сообщений: 118
Награды: 2
Репутация: 2
Статус: Offline
| с ListBox все сделано правильно! думаю это что то у тебя в коде. при воспроизведении нужно делать: 1. остановка потока. * 2. освобождение потока. * 3. создание потока. * 4. установка громкости. 5. создание эквалайзера. 6. загрузка плагина визуализации. 7. вытаскивания тегов. * 8. воспроизведения потока * и дальше что нужно. * - обязательно! P.S. лично я всегда придерживаюсь такой "структуры" и всё прекрасно работает. Просто уже не раз сталкивался с такими проблемами.
http://www.zubymplayer.com
Сообщение отредактировал ZuBy - Понедельник, 21.09.2009, 20:33 |
|
| |
|
nestby | Дата: Вторник, 22.09.2009, 18:14 | Сообщение # 18 |
Ранг 1
Группа: Проверенные
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
| Quote (Admin) Так, интересно, ведь в ListBoxе хранятся пути, а выводятся только теги. Можно поподробнее про то что происходит с программой (ошибка, ничего не изменяется, и т.д.) При загрузке файлов в плейлисте отображаются уже не узкие полосочки а пошире, ну это отрисовка, понятно. Только при нажатии в плейлисте например, на первый трек ничего не происходит, воспроизведение не начинается. И к стати, с отрисовкой тоже есть некоторые проблемы. 1.Первый трек обведен рамочкой, стоят номера возле каждого трека, а если нажать на следующий трек, то он обводится пунктирной линией, если нажать на следующий, то тоже обводится, но первый все равно остается обведенный. 2.Вотрая проблема - не видно тегов. Оно либо выводит пустой список без тегов, либо какая-то ошибка в отрисовке. Потому что я еще до отрисовки пробовал сделать без нее в обычном списке, все теги каждого файла выводились нормально. А с отрисовкой они исчезли. Вот прицепляю картинку. И к стати они тоже неработали! Как и сейчас. Нажимаешь - а файл не воспроизводится! Добавлено (22.09.2009, 17:55) --------------------------------------------- Quote (ZuBy) с ListBox все сделано правильно! думаю это что то у тебя в коде. при воспроизведении нужно делать: 1. остановка потока. * 2. освобождение потока. * 3. создание потока. * 4. установка громкости. 5. создание эквалайзера. 6. загрузка плагина визуализации. 7. вытаскивания тегов. * 8. воспроизведения потока * и дальше что нужно. * - обязательно! P.S. лично я всегда придерживаюсь такой "структуры" и всё прекрасно работает. Просто уже не раз сталкивался с такими проблемами. Возможно и так, но без отрисовки я так же загружал файлы и они воспроизводились! А сейчас нет Добавлено (22.09.2009, 18:14) --------------------------------------------- ВСЕ, РАЗОБРАЛСЯ!!! Все теперь и файлы воспроизводит и теги показывает, это был мой недочет. Только осталась проблема с отрисовкой: По прежнему выделяет первый трек белой рамкой (как видно на рисунке с верху), а когда я хочу переключить то эта рамка так и остается на первом треке, а на "клацнутом" появляется пунктирная (тоже как на рисунке тр номер 3). И еще как сделать чтобы время каждого файла отображалось всегда с правой стороны, как вот сдесь?
Сообщение отредактировал nestby - Вторник, 22.09.2009, 18:14 |
|
| |
|
nestby | Дата: Вторник, 22.09.2009, 18:15 | Сообщение # 19 |
Ранг 1
Группа: Проверенные
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
|
|
|
| |
|
ZuBy | Дата: Пятница, 25.09.2009, 21:19 | Сообщение # 20 |
Ранг 5
Группа: Проверенные
Сообщений: 118
Награды: 2
Репутация: 2
Статус: Offline
| Quote (nestby) Только осталась проблема с отрисовкой: По прежнему выделяет первый трек белой рамкой (как видно на рисунке с верху), а когда я хочу переключить то эта рамка так и остается на первом треке, а на "клацнутом" появляется пунктирная (тоже как на рисунке тр номер 3). код покажи. Quote (nestby) И еще как сделать чтобы время каждого файла отображалось всегда с правой стороны, как вот сдесь? тут всё просто! если ты используешь ListBox, то вообще cool. при отрисовке TextOut замени Rect.Left на (Rect.Right - длинна текста, можно использовать так Length('01:07') + 5))
http://www.zubymplayer.com
Сообщение отредактировал ZuBy - Пятница, 25.09.2009, 21:23 |
|
| |
|
nestby | Дата: Воскресенье, 27.09.2009, 23:21 | Сообщение # 21 |
Ранг 1
Группа: Проверенные
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
| Вот код: Code procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var IDPlay:integer begin with (control as TListBox).canvas do begin if (State = [odFocused, odSelected]) or (State = [odSelected]) then begin FFileLength:= FormatDateTime('nn:ss', BASS_GetLength / (1000 * 24 * 60 * 60)); Font.Color := clLime; Font.Size := 9; Brush.Style := bsClear; SetBkMode(Handle, TRANSPARENT); TextOut(Rect.Left + 2, Rect.Top, IntToStr(Index + 1) + '. ' +FinderTag(ListBox1.Items[index])+' '+FFileLength ); // FinderTag(ListBox1.Items[index]); // вот пример как правильно выводится TextOut. в нем выводится название файла без расширения. end else if IDPlay = Index then //IDPlay это переменная типа integer в которой находится номер трека который щас играет... begin Font.Color := clWhite; Font.Size := 9; Brush.Style := bsClear; Pen.Color := clBLue; Rectangle(Rect); SetBkMode(Handle, TRANSPARENT); TextOut(Rect.Left + 2, Rect.Top, IntToStr(Index + 1) + '. ' + FinderTag(ListBox1.Items[index])+' '+FFileLength); end else begin Font.Color := clGreen; Brush.Style := bsClear; Font.Size := 9; SetBkMode(Handle, TRANSPARENT); TextOut(Rect.Left + 2, Rect.Top, IntToStr(Index + 1) + '. ' + FinderTag(ListBox1.Items[index])+' '+FFileLength); end; end; Все работает, вырисовывает, только по прежнему лажа с фиксированным и выделенным цветом, вообще не то что-то делает. И можно еще маленькое уточнение: как именно в процедуре TextOut сделать с правой стороны время, если время у меня хранится в переменной FFileLength?Как видно выше в коде. Добавлено (27.09.2009, 23:21) --------------------------------------------- И вот еще один вопросик назрел, как бы сделать функцию drag;n;drop чтоб можно было файлы в листбокс прямо перетаскивать?
Сообщение отредактировал nestby - Воскресенье, 27.09.2009, 23:31 |
|
| |
|
Admin | Дата: Понедельник, 28.09.2009, 00:01 | Сообщение # 22 |
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
| Quote (nestby) И можно еще маленькое уточнение: как именно в процедуре TextOut сделать с правой стороны время, если время у меня хранится в переменной FFileLength?Как видно выше в коде. Вот как раз решил написать статейку, надеюсь не зря - "узнать ширину строки в пикселях". Вобщем ты знаеш ширину твоего ListBox, тебе нужно написать справа. Значит от самой правой точки ListBoxa нужно отнять ширину текста плюс (по желанию) небольшое число в целях красоты (отступ вобщем).
Не оказываю помощь через личные сообщения и ICQ
|
|
| |
|
nestby | Дата: Вторник, 29.09.2009, 20:49 | Сообщение # 23 |
Ранг 1
Группа: Проверенные
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
| Quote (Admin) Вот как раз решил написать статейку, надеюсь не зря - "узнать ширину строки в пикселях". Вобщем ты знаеш ширину твоего ListBox, тебе нужно написать справа. Значит от самой правой точки ListBoxa нужно отнять ширину текста плюс (по желанию) небольшое число в целях красоты (отступ вобщем). да я так как раз и сделал, все отлично, ну и статейку заодно глянул Добавлено (29.09.2009, 20:49) --------------------------------------------- Решил частично вопрос с отрисовкой, мне хватило такого кода: Code with (control as TListBox).canvas do begin
Fillrect(Rect); TextOut(Rect.Left + 2, Rect.Top, IntToStr(Index + 1) + '. ' +FinderTag(ListBox1.Items[index])); TextOut(Rect.Right-40, Rect.Top, '...'+(FFileLength)); Только вот теперь бы хотелось добавить такое: какой именно трек сейчас проигрывается и выделить его в плейлисте белым шрифтом. То есть, как узнать какой трек играет?
|
|
| |
|
Admin | Дата: Среда, 30.09.2009, 16:01 | Сообщение # 24 |
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
| Quote (nestby) То есть, как узнать какой трек играет? Да просто напросто заведи переменную да в ней храни и изменяй когда нужно. Например при воспроизведении записывай. Ну порядковый номер ListBox хранить в переменной думаю не стоит, т.к. при удалении будет смещаться и выделение будет неверным. Лучше хранить наверное путь к файлу, а там уж сравнивать и если совпадает выделять проверяемый item
Не оказываю помощь через личные сообщения и ICQ
|
|
| |
|
ZuBy | Дата: Четверг, 01.10.2009, 00:48 | Сообщение # 25 |
Ранг 5
Группа: Проверенные
Сообщений: 118
Награды: 2
Репутация: 2
Статус: Offline
| Quote (nestby) Только вот теперь бы хотелось добавить такое: какой именно трек сейчас проигрывается и выделить его в плейлисте белым шрифтом. То есть, как узнать какой трек играет? IDPlay - она должна быть глобальная. Quote (nestby) if IDPlay = Index then //IDPlay это переменная типа integer в которой находится номер трека который щас играет... теперь понял почему не вырисовывает? например в коде где идет начало воспроизведения нужно указать IDPlay := ListBox1.ItemIndex;
http://www.zubymplayer.com
|
|
| |
|
nestby | Дата: Четверг, 01.10.2009, 03:09 | Сообщение # 26 |
Ранг 1
Группа: Проверенные
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
| не а, не знаю почему, но не прокатывает. Выделяет первый item а если переключаешь на другой трек, оно все равно остается на первом. В процедуре проигрывания сразу после Bass_ChannelPlay(Channel, false) дописал IDPlay := ListBox1.ItemIndex; а в отрисовке такой код: Code with (control as TListBox).canvas do begin
FillRect(Rect); TextOut(Rect.Left + 2, Rect.Top, IntToStr(Index + 1) + '. ' +FinderTag(ListBox1.Items[index])); TextOut(Rect.Right-40, Rect.Top, '...'+(FFileLength)); if IDPlay = index then Font.Color:=clRed; TextOut(Rect.Left + 2, Rect.Top, IntToStr(Index + 1) + '. ' +FinderTag(ListBox1.Items[index])); TextOut(Rect.Right-40, Rect.Top, '...'+(FFileLength)); но не пашет
|
|
| |
|
ZuBy | Дата: Четверг, 01.10.2009, 03:13 | Сообщение # 27 |
Ранг 5
Группа: Проверенные
Сообщений: 118
Награды: 2
Репутация: 2
Статус: Offline
| Quote (nestby) if IDPlay = index then Font.Color:=clRed; if IDPlay = index then begin - забыл Font.Color:=clRed;
http://www.zubymplayer.com
|
|
| |
|
nestby | Дата: Четверг, 01.10.2009, 03:20 | Сообщение # 28 |
Ранг 1
Группа: Проверенные
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
| Quote (Admin) Да просто напросто заведи переменную да в ней храни и изменяй когда нужно. Например при воспроизведении записывай. Ну порядковый номер ListBox хранить в переменной думаю не стоит, т.к. при удалении будет смещаться и выделение будет неверным. Лучше хранить наверное путь к файлу, а там уж сравнивать и если совпадает выделять проверяемый item Пробовал так сделать с mediaPlayer, проверял if MediaPlayer1.FileName = ListBox1.Items[ListBox1.Itemindex] then и делал выделение, прокатывало, только предыдущий выделенный трек так и оставался выделенным, надо было на него нажать, тогда исчезало. А вот с Bass не могу высунуть путь к файлу из потока, пробовал так: Code var b1:Bass_Channelinfo begin if ListBox1.Items[itemindex] = b1.filename then //и дальше отрисовывал выделение но так не хочет, потому что в Channelinfo filename типа PWideChar а не string, и то это наверное, только название файла а не путь к нему и сравнивать c путем к файлу из листбокс нельзя. А вообще не плохо было бы реализовать это сравнивая пути, только как достать из басса путь файла который играет?Добавлено (01.10.2009, 03:20) ---------------------------------------------
Quote (ZuBy) if IDPlay = index then begin - забыл Font.Color:=clRed; только что попробовал и с begin не получается! Ну как то ж это можно решить!?
|
|
| |
|
ZuBy | Дата: Четверг, 01.10.2009, 03:24 | Сообщение # 29 |
Ранг 5
Группа: Проверенные
Сообщений: 118
Награды: 2
Репутация: 2
Статус: Offline
| при переключении на след./пред. трек отправляй плейлисту ListBox1.Invalidate; - это заставит его перерисоватся. Quote (nestby) Quote (Admin) Да просто напросто заведи переменную да в ней храни и изменяй когда нужно. Например при воспроизведении записывай. Ну порядковый номер ListBox хранить в переменной думаю не стоит, т.к. при удалении будет смещаться и выделение будет неверным. Лучше хранить наверное путь к файлу, а там уж сравнивать и если совпадает выделять проверяемый item Пробовал так сделать с mediaPlayer, проверял if MediaPlayer1.FileName = ListBox1.Items[ListBox1.Itemindex] then и делал выделение, прокатывало, только предыдущий выделенный трек так и оставался выделенным, надо было на него нажать, тогда исчезало. А вот с Bass не могу высунуть путь к файлу из потока, пробовал так: вообще не понимаю зачем ты это делаешь?
http://www.zubymplayer.com
|
|
| |
|
nestby | Дата: Четверг, 01.10.2009, 03:34 | Сообщение # 30 |
Ранг 1
Группа: Проверенные
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
| Quote (ZuBy) вообще не понимаю зачем ты это делаешь? просто попробовал сравнивать не номер трека из листбокса с номером выделения а по пути файла (MediaPlayer.FileNAme - путь к файлу, который сейчас играет, ListBox1.Items[ListBox1.Itemindex] - путь файла в листбокс) если они совпадают, значит тот трек и нужно выделить в листбоксе. А вот узнать путь трека из басс не получается, тогда можно было б так же сравнить, и выделить играющий трек. И все таки с номером трека не работает.
|
|
| |
|