Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.10.2010, 17:22
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию Bass

как в басс по окончании воспроизведения воспроизводить дальше следующие песни из лист бокса
Ответить с цитированием
  #2  
Старый 14.10.2010, 17:35
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Ну по басу есть множество примеров, в том числе и с списком песен...
А вообще можно тупо проверять окончание песни (когда песня закончилась) - воспроизводить следующую песню из лист бакса (ListBox1.Items[ListBox1.ItemIndex+1]), функцией BASS_PLAY (она вроде по другому называется, но это не важно)
__________________
Помогаю за Спасибо
Ответить с цитированием
  #3  
Старый 14.10.2010, 17:42
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Код:
  if BASS.Position < BASS.Length
    then exit;


  if ListBox1.ItemIndex < ListBox1.Count // список не исчерпан
  then begin
        ListBox1.ItemIndex := ListBox1.ItemIndex + 1;
        Play;  // активизировать воспроизведение файла
       end

както так и прявязать это к таймеру только точно никто не подскажет?
Ответить с цитированием
  #4  
Старый 14.10.2010, 17:50
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Ну я думаю можно обойтись и без таймера, но если хотите с таймером, то поставьте таймер (интервал 500), и него вставьте тот код что вы написали...
__________________
Помогаю за Спасибо
Ответить с цитированием
  #5  
Старый 14.10.2010, 18:10
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

а как это интересно вы без таймера думаете проверять?
Ответить с цитированием
  #6  
Старый 14.10.2010, 18:17
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

мой код не работает я написал приблезительно
Ответить с цитированием
  #7  
Старый 14.10.2010, 18:20
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Надо вам почитать документацию баса, там наверняка есть событие, которое происходит после заканчивающийся песни.
Или же можно использовать рекурсию (но НЕ советую), тобишь сделать процедуру, вот пример:

Код:
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  
Старый 14.10.2010, 19:14
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

повторяю код не рабочий мой в басс нету BASS.Position и BASS.Length
Ответить с цитированием
  #9  
Старый 14.10.2010, 20:14
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Так никто не знает?
Ответить с цитированием
  #10  
Старый 14.10.2010, 20:28
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Цитата:
Сообщение от v1s2222
Или же можно использовать рекурсию (но НЕ советую), тобишь сделать процедуру, вот пример:
v1s2222 советую поближе ознакомиться с рекурсиями, для чего они нужны, и в каких случаях их следует использовать. А не давать неправильные ответы пользователям, уводя их от правильных решений. В данном случае рекурсия совершенно не подходит, так как, у рекурсий есть понятие "глубина спуска", от которой и определяется алгоритм решение задачи. Для данной задачи нужен простой бесконечный цикл (это если не использовать события басса).
Если ты хотел блеснуть знаниями, то хочу тебя огорчить, ты облажался.
Так же, посмотри внимательно на свой код, в каком случае рекурсия будет работать? Только в том случае если BASS.Position >= BASS.Length, но если бы даже ты зациклил рекурсию для данной задачи, то получил бы ошибку выполнения, рода out of memory, так как, как я уже говорил ранее, рекурсия не может быть бесконечной и глубина ее спуска ограничена.
Так же, хочу подметить, что подобных неправильных ответов у тебя много, не вникая в суть задачи ты раздаешь ответы, а смысл? Сам опыта не набираешься, и других уводишь от истины. Вот если хочешь давать правильные ответы, то постарайся разбираться в проблеме, а не писать первое что тебе придет на ум.
Ответить с цитированием
  #11  
Старый 14.10.2010, 20:38
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

на основе таймера:
Код:
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;
без таймера-копать в сторону BASS_ChannelSetSync
ну и вам уже сказали читать справку к бассу, там все функции описаны.
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت
Ответить с цитированием
  #12  
Старый 14.10.2010, 20:46
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Цитата:
Сообщение от Asinkrit
v1s2222 советую поближе ознакомиться с рекурсиями, для чего они нужны, и в каких случаях их следует использовать. А не давать неправильные ответы пользователям, уводя их от правильных решений. В данном случае рекурсия совершенно не подходит, так как, у рекурсий есть понятие "глубина спуска", от которой и определяется алгоритм решение задачи. Для данной задачи нужен простой бесконечный цикл (это если не использовать события басса).
Если ты хотел блеснуть знаниями, то хочу тебя огорчить, ты облажался.
Так же, посмотри внимательно на свой код, в каком случае рекурсия будет работать? Только в том случае если BASS.Position >= BASS.Length, но если бы даже ты зациклил рекурсию для данной задачи, то получил бы ошибку выполнения, рода out of memory, так как, как я уже говорил ранее, рекурсия не может быть бесконечной и глубина ее спуска ограничена.
Так же, хочу подметить, что подобных неправильных ответов у тебя много, не вникая в суть задачи ты раздаешь ответы, а смысл? Сам опыта не набираешься, и других уводишь от истины. Вот если хочешь давать правильные ответы, то постарайся разбираться в проблеме, а не писать первое что тебе придет на ум.

Если вы у нас самый умный, то могу вас огорчить, работать тут рекурсия будет, если исправить код (во первых убрать проверку, иначе как вы правильно сказали, процедура просто перестанет выполняться). И, если вы не читали внимательно пост, я писал, что тут рекурсию "использовать НЕ советую"! (но сделать, чтоб она работала вполне возможно)!
__________________
Помогаю за Спасибо
Ответить с цитированием
  #13  
Старый 14.10.2010, 20:49
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Посмотрел я модуль 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;
Есть недостаток использования таймера, советую включать таймер (enabled:=true) при старте пролигрывания первой песни, и отключать при нажатии кнопки стоп или закрытии приложения.

Смотри модуль bass.pas, там есть все что тебе нужно, так же смотри примеры, которые идут с библиотекой.

Последний раз редактировалось Asinkrit, 14.10.2010 в 20:56.
Ответить с цитированием
  #14  
Старый 15.10.2010, 03:18
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Цитата:
Сообщение от v1s2222
И, если вы не читали внимательно пост, я писал, что тут рекурсию "использовать НЕ советую"! (но сделать, чтоб она работала вполне возможно)!
В чем тогда заключался твой пост? Дать совет не делать по совету? А насчет "чтоб она работала", ок, напиши код, исправь что бы зацикливание заработало, и посмотрим тогда..
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:03.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025