|
Вопрос # 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 (статус: Посетитель)
Вопрос отправлен: 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 всё подробно расписано
Приложение: Переключить в обычный режим- {{code|delphi}}var
- CurrentItemNo: Integer;
- Stream: DWORD;
-
- procedure ChannelSync(Handle: HSYNC; Stream, Data: DWORD; User: Pointer); stdcall;
- begin
-
- // BASS_StreamFree(Stream);
-
- BASS_ChannelRemoveSync(Stream, handle);
- PlayNextFile
- end;
-
- procedure TFormMain.PlayNextFile;
- var FileName: TFileName;
- begin
- Inc(CurrentItemNo);
- if CurrentItemNo > 3 then Exit;
- FileName := Folder + 'eng' + IntToStr(CurrentItemNo) + '.mp3';
- Channel := BASS_StreamCreateFile(FALSE, PChar(FileName), 0, 0,
- BASS_STREAM_AUTOFREE {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}
- );
- if not BASS_ChannelPlay(Stream, True) then
- raise Exception.Create(
-
- );
- BASS_ChannelSetSync(Stream, BASS_SYNC_END, 0, @ChannelSync, nil);
- end;
-
- procedure TFormMain.btnStartClick(Sender: TObject);
- begin
- CurrentItemNo := -1;
- PlayNextFile
- 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 (статус: Посетитель), 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 (статус: Студент), 11 января 2018, 16:32 [#4]:
Наиболее простое решение в цикл вставить:
Application.ProcessMessages;
И после этой строки проверять флаг, который устанавливается кнопкой STOP.
Но лично я бы спасал "отца русской демократии" через мультипоточность.
"Digital Networked Knight"
|
|
Александр Дубик (статус: 1-ый класс), 12 января 2018, 02:41 [#5]:
Edward: Я считаю что цикл здесь лишний.
При использовании событий библиотеки BASS, не потребуются костыли вроде Sleep и ProcessMessages.
В приложении к моему ответу продемонстрирована работа с событиями. Код был написан на коленке в блокноте. Так что не факт что он успешно скомпилируется при Copy-Paste.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|