Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 678

/ вопрос открыт /

Приветствую, уважаемые эксперты!

Необходимо проиграть подряд 3 файла: 1.mp3, 2.mp3, 3.mp3
В моём коде проигрывает только последний файл 3.mp3
Подскажите решение.
Спасибо

while i <> 3 do
begin

bass_StreamFree(stream);
folder:=n ;
stream:= bass_streamCreateFile(false, pChar(folder+'eng'+inttostr(i)+'.mp3'), 0, 0, 0);
panel1.caption:=folder+'eng'+inttostr(i)+'.mp3';
bass_channelplay(stream, true);
i:=i+1;

end;

Edward Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Edward (статус: Посетитель)
Вопрос отправлен: 10 января 2018, 13:42
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Шичко Игорь

Здравствуйте, Edward!
Предполагаю, что после строки:

bass_channelplay(stream, true);
должна быть какая-то пауза для анализа окончания проигрывания.
У вас идет непрерывный цикл, поэтому проигрывание останавливается только на 3-й композиции.

Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 11 января 2018, 15:48

Ответ #2. Отвечает эксперт: Александр Дубик

Здравствуйте, Edward!

Нужно установить событие на завершение воспроизведения потока.

BASS_ChannelPlay(Stream, True);
BASS_ChannelSetSync(Stream, BASS_SYNC_END, 0, @ChannelSync, nil);
Теперь по окончании воспроизведения библиотека BASS вызовет функцию ChannelSync.
Нам остаётся только описать её
procedure ChannelSync(Handle: HSYNC; Stream, Data: DWORD; User: Pointer); stdcall;
begin
  {
    Здесь, собственно, и выполняем всю грязную работу
  }
end;
В документации к BASS всё подробно расписано

Приложение:
  1. {{code|delphi}}var
  2. CurrentItemNo: Integer;
  3. Stream: DWORD;
  4.  
  5. procedure ChannelSync(Handle: HSYNC; Stream, Data: DWORD; User: Pointer); stdcall;
  6. begin
  7.  
  8. // BASS_StreamFree(Stream);
  9.  
  10. BASS_ChannelRemoveSync(Stream, handle);
  11. PlayNextFile
  12. end;
  13.  
  14. procedure TFormMain.PlayNextFile;
  15. var FileName: TFileName;
  16. begin
  17. Inc(CurrentItemNo);
  18. if CurrentItemNo > 3 then Exit;
  19. FileName := Folder + 'eng' + IntToStr(CurrentItemNo) + '.mp3';
  20. Channel := BASS_StreamCreateFile(FALSE, PChar(FileName), 0, 0,
  21. BASS_STREAM_AUTOFREE {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}
  22. );
  23. if not BASS_ChannelPlay(Stream, True) then
  24. raise Exception.Create(
  25.  
  26. );
  27. BASS_ChannelSetSync(Stream, BASS_SYNC_END, 0, @ChannelSync, nil);
  28. end;
  29.  
  30. procedure TFormMain.btnStartClick(Sender: TObject);
  31. begin
  32. CurrentItemNo := -1;
  33. PlayNextFile
  34. end;{{/code}}


Ответ отправил: Александр Дубик (статус: 1-ый класс)
Время отправки: 11 января 2018, 23:08


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 12 января 2018, 02:41; участников в обсуждении: 4.
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 10 января 2018, 23:33 [#1]:

Предполагаю, что после строки:
"bass_channelplay(stream, true);"
должна быть какая-то пауза для анализа окончания проигрывания.
У вас идет непрерывный цикл, поэтому проигрывание останавливается только на 3-й композиции.
Edward

Edward (статус: Посетитель), 11 января 2018, 09:21 [#2]:

Поставил Sleep (5000). всё работает. Спасибо.
Теперь следующая проблема. На кнопку STOP написал BASS_ChannelStop(stream);
Но пока цикл работает, эта кнопка не срабатывает. Проигрывание не останавливается.
Также не выводится имя файла который в данный момент проигрывается panel1.caption:=folder+'eng'+inttostr(i)+'.mp3';
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 11 января 2018, 09:47 [#3]:

По надписи.
Попробуйте обновлять форму, что-то типа
Form1.Refresh;

Пока цикл не закончится, другие кнопки не действуют.
Либо описывать в цикле обработчик нажатия кнопок.
DNK

DNK (статус: Студент), 11 января 2018, 16:32 [#4]:

Наиболее простое решение в цикл вставить:
Application.ProcessMessages;
И после этой строки проверять флаг, который устанавливается кнопкой STOP.
Но лично я бы спасал "отца русской демократии" через мультипоточность.
"Digital Networked Knight"
Александр Дубик

Александр Дубик (статус: 1-ый класс), 12 января 2018, 02:41 [#5]:

Edward: Я считаю что цикл здесь лишний.
При использовании событий библиотеки BASS, не потребуются костыли вроде Sleep и ProcessMessages.
В приложении к моему ответу продемонстрирована работа с событиями. Код был написан на коленке в блокноте. Так что не факт что он успешно скомпилируется при Copy-Paste.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 июля 2018, 13:32
Выполнено за 0.05 сек.
Рейтинг@Mail.ru