Главная Главная страница форума Регистрация Вход
Новые сообщения Участники форума Правила форума Поиск
Страница 2 из 3«123»
Модератор форума: Ekz 
Форум » Все о Delphi » Мультимедиа » Создание плеера на BASS (Трекбар, битрейт)
Создание плеера на 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. лично я всегда придерживаюсь такой "структуры" и всё прекрасно работает. Просто уже не раз сталкивался с такими проблемами.

Возможно и так, но без отрисовки я так же загружал файлы и они воспроизводились! А сейчас нет sad

Добавлено (22.09.2009, 18:14)
---------------------------------------------
ВСЕ, РАЗОБРАЛСЯ!!! Все теперь и файлы воспроизводит и теги показывает, это был мой недочет.

Только осталась проблема с отрисовкой: По прежнему выделяет первый трек белой рамкой (как видно на рисунке с верху), а когда я хочу переключить то эта рамка так и остается на первом треке, а на "клацнутом" появляется пунктирная (тоже как на рисунке тр номер 3).

И еще как сделать чтобы время каждого файла отображалось всегда с правой стороны,
как вот сдесь?

Прикрепления: 2565815.jpg(13Kb)


Сообщение отредактировал nestby - Вторник, 22.09.2009, 18:14
 
nestbyДата: Вторник, 22.09.2009, 18:15 | Сообщение # 19
Ранг 1
Группа: Проверенные
Сообщений: 14
Награды: 0
Репутация: 0
Статус: Offline
Прикрепления: 4696137.jpg(6Kb)
 
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
Quote (ZuBy)
код покажи.

Вот код:

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 нужно отнять ширину текста плюс (по желанию) небольшое число в целях красоты (отступ вобщем).

да я так как раз и сделал, все отлично, ну и статейку заодно глянул smile

Добавлено (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));

но не пашет dry
 
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] - путь файла в листбокс) если они совпадают, значит тот трек и нужно выделить в листбоксе. А вот узнать путь трека из басс не получается, тогда можно было б так же сравнить, и выделить играющий трек.

И все таки с номером трека не работает. sad

 
Форум » Все о Delphi » Мультимедиа » Создание плеера на BASS (Трекбар, битрейт)
Страница 2 из 3«123»
Поиск:

Copyright DelphiDevelop.ru © 2008-2018
Хостинг от uCoz