![]() |
|
#1
|
||||
|
||||
![]() как в басс по окончании воспроизведения воспроизводить дальше следующие песни из лист бокса
|
#2
|
||||
|
||||
![]() Ну по басу есть множество примеров, в том числе и с списком песен...
А вообще можно тупо проверять окончание песни (когда песня закончилась) - воспроизводить следующую песню из лист бакса (ListBox1.Items[ListBox1.ItemIndex+1]), функцией BASS_PLAY (она вроде по другому называется, но это не важно) Помогаю за Спасибо ![]() |
#3
|
||||
|
||||
![]() Код:
if BASS.Position < BASS.Length then exit; if ListBox1.ItemIndex < ListBox1.Count // список не исчерпан then begin ListBox1.ItemIndex := ListBox1.ItemIndex + 1; Play; // активизировать воспроизведение файла end както так и прявязать это к таймеру только точно никто не подскажет? |
#4
|
||||
|
||||
![]() Ну я думаю можно обойтись и без таймера, но если хотите с таймером, то поставьте таймер (интервал 500), и него вставьте тот код что вы написали...
Помогаю за Спасибо ![]() |
#5
|
||||
|
||||
![]() а как это интересно вы без таймера думаете проверять?
|
#6
|
||||
|
||||
![]() мой код не работает я написал приблезительно
|
#7
|
||||
|
||||
![]() Надо вам почитать документацию баса, там наверняка есть событие, которое происходит после заканчивающийся песни.
Или же можно использовать рекурсию (но НЕ советую), тобишь сделать процедуру, вот пример: Код:
procedure SetNext; begin if BASS.Position < BASS.Length then exit; if ListBox1.ItemIndex < ListBox1.Count // список не исчерпан then begin ListBox1.ItemIndex := ListBox1.ItemIndex + 1; Play; // активизировать воспроизведение файла end; SetNext; end; ЗЫ код полностью ваш, поэтому если он не работает, я вам подсказать не чем не могу... ЗЫЫ на первый взгляд код нормальный, выложите процедуру "Play", может что-то в ней... Помогаю за Спасибо ![]() Последний раз редактировалось v1s2222, 14.10.2010 в 18:23. |
#8
|
||||
|
||||
![]() повторяю код не рабочий мой в басс нету BASS.Position и BASS.Length
|
#9
|
||||
|
||||
![]() Так никто не знает?
|
#10
|
|||
|
|||
![]() Цитата:
Если ты хотел блеснуть знаниями, то хочу тебя огорчить, ты облажался. Так же, посмотри внимательно на свой код, в каком случае рекурсия будет работать? Только в том случае если BASS.Position >= BASS.Length, но если бы даже ты зациклил рекурсию для данной задачи, то получил бы ошибку выполнения, рода out of memory, так как, как я уже говорил ранее, рекурсия не может быть бесконечной и глубина ее спуска ограничена. Так же, хочу подметить, что подобных неправильных ответов у тебя много, не вникая в суть задачи ты раздаешь ответы, а смысл? Сам опыта не набираешься, и других уводишь от истины. Вот если хочешь давать правильные ответы, то постарайся разбираться в проблеме, а не писать первое что тебе придет на ум. |
#11
|
||||
|
||||
![]() на основе таймера:
Код:
procedure TForm1.Timer1Timer(Sender: TObject); begin //MusicStream - переменная, куда записывается результат BASS_StreamCreateFile из процедуры Play; if BASS_ChannelGetPosition(MusicStream, BASS_POS_BYTE) < BASS_ChannelGetLength(MusicStream, BASS_POS_BYTE) then Exit; if ListBox1.ItemIndex<ListBox1.Count-1 then ListBox1.ItemIndex:=ListBox1.ItemIndex+1; else //зацикливание плейлиста ListBox1.ItemIndex:=0; Play; end; ну и вам уже сказали читать справку к бассу, там все функции описаны. РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت |
#12
|
||||
|
||||
![]() Цитата:
Если вы у нас самый умный, то могу вас огорчить, работать тут рекурсия будет, если исправить код (во первых убрать проверку, иначе как вы правильно сказали, процедура просто перестанет выполняться). И, если вы не читали внимательно пост, я писал, что тут рекурсию "использовать НЕ советую"! (но сделать, чтоб она работала вполне возможно)! Помогаю за Спасибо ![]() |
#13
|
|||
|
|||
![]() Посмотрел я модуль Bass, и вот что я там нашел:
Код:
// BASS_ChannelIsActive return values BASS_ACTIVE_STOPPED = 0; BASS_ACTIVE_PLAYING = 1; BASS_ACTIVE_STALLED = 2; BASS_ACTIVE_PAUSED = 3; ... function BASS_ChannelIsActive(handle: DWORD): DWORD; stdcall;external bassdll; Код:
procedure TForm1.Timer1Timer(Sender: TObject); begin if BASS_ChannelIsActive(MusicStream) in [BASS_ACTIVE_STALLED, BASS_ACTIVE_STALLED] then begin //думаю что именно BASS_ACTIVE_STALLED говорит о том что закончилась играть предыдущая песня., но не уверен. //if BASS_ChannelIsActive(MusicStream) = BASS_ACTIVE_PLAYING then Exit; //в таком случае, будет пытаться воспроитзводить всегда, даже когда пользователь не захочет этого, если конечно timer.enabled = true if ListBox1.ItemIndex<ListBox1.Count-1 then ListBox1.ItemIndex:=ListBox1.ItemIndex+1; else //зацикливание плейлиста ListBox1.ItemIndex:=0; Play; end; end; Смотри модуль bass.pas, там есть все что тебе нужно, так же смотри примеры, которые идут с библиотекой. Последний раз редактировалось Asinkrit, 14.10.2010 в 20:56. |
#14
|
|||
|
|||
![]() Цитата:
|