![]() |
|
|
#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
|
|||
|
|||
|
Цитата:
|