Прошло довольно много времени с момента написания первой статьи «Аудио-плеер на Delphi для Android с применением библиотеки BASS». И теперь я решил написать вторую часть статьи про запуск и использование библиотеки BASS под iOS. В данном конкретном случае, так же? как и в предыдущей статье, целью подключения библиотеки, стало использование функции проигрывания сетевого аудиопотока.
Настройка
Как и в случае с настройкой под Android, для iOS нам потребуются дополнительные библиотеки, без которых скомпилировать проект не получиться. Воспользуемся набором библиотек DPF iOS Native Components. Данные библиотеки нужны для подключения iOS фреймворка работы со звуком.
Скачиваем архив с файлами с официального сайта или с моего сайта.
После того, как мы скачали все необходимые дополнительные файлы, приступаем к установке компонентов.
Я рекомендую (во избежании дополнительных проблем с подключением) распаковать файлы в папку DPF.iOS.Native.Components.v9.6.1.zip в корень диска C.
В каталоге с файлами, имеется файл Install.txt. У кого хорошо с английским, могут сделать всё по инструкции описанной в файле, для тех, кто не совсем понимает, что необходимо делать, я опишу процесс подробно.
Запускаем Codegear RAD Studio. Далее в верхнем меню открываем Tools->Options->Delphi Options->Library.
Затем, в выпадающем списке поочерёдно выбираем следующие пункты платформ:
- 32-bit windows
- iOSSimulator
- iOSDevice32
- iOSDevice64
В каждом из пунктов добавляем в раздел «Library path» путь к нашим компонентам. В нашем случае C:\DPF.iOS.Native.Components.v9.6.1\
Теперь, необходимо в разделе SDK Manager указать, какие фрейворки iOS нам потребуются. Для этого открываем Tools->Options->SDK Manager, пролистываем появившийся список вниз до раздела Frameworks, выбираем в списке один из фремворков, нажимаем на кнопку Add the new path item и добавляем следующие фреймворки:
- /System/Library/Frameworks/EventKit
/System/Library/Frameworks/MessageUI
/System/Library/Frameworks/AudioToolbox
/System/Library/Frameworks/Social
/System/Library/Frameworks/QuickLook
/System/Library/Frameworks/SystemConfiguration
/System/Library/Frameworks/GameKit
/System/Library/Frameworks/CoreBluetooth
/System/Library/Frameworks/Accounts
/System/Library/Frameworks/AdSupport
/System/Library/Frameworks/ExternalAccessory
/System/Library/Frameworks/AddressBookUI (No need in XE8 and later)
/System/Library/Frameworks/AddressBook (No need in XE8 and later)
/System/Library/Frameworks/MobileCoreServices (No need in XE8 and later)
/System/Library/Frameworks/MapKit (No need in XE8 and later)
/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication (iOS 8.0 and later)
В качестве пути на удалённом хосте требуется указывать путь «$(SDKROOT)/System/Library/Frameworks», а качестве имени, название фремворка. Для примера:
Путь: $(SDKROOT)/System/Library/Frameworks
Имя: EventKit
Больше нигде никаких галочек ставить и выбирать не требуется.
Должно получиться так.
В разделе Libs, аналогичным образом необходимо добавить библиотеку /usr/lib/libxml2.dylib. Путь к ней указать, как $(SDKROOT)/usr/lib/
После добавления всех фреймворков в список необходимо обязательно нажать на кнопку Update local File Cache. При этом MAC с запущенным PAServer’ом должен быть настроен и доступен.
Теперь нам потребуется скомпилировать и установить компоненты. Для этого нажимаем File -> Open Project. Открываем проект из папки компонентов, соответствующий вашей среде программирования.
Нажимаем правой кнопкой на проекте в инспекторе проекта и выбираем пункт «Build», начнётся построение проекта.
После завершение построение, опять нажимаем правой кнопкой на проекте в инспекторе и выбираем пункт «Install».
Компоненты готовы к работе. Приступим к созданию проекта.
Проект
И вот, всё почти готово, для использования библиотек Bass на iOS. Осталось задействовать саму библиотеку и добавить некоторый код в проект.
Для работы с библиотекой, нам потребуется файл libbass.a. Его необходимо добавить в корень каталога проекта. Откуда конкретно у меня данный файл, я точно сказать не смогу, я нашёл его где-то на просторах форума un4seen.com. Здесь я выкладываю рабочий файл из своих проектов.
Но, одного файла для работы будет недостаточно. Так же, в проект необходим добавить ещё 2 файла *.pas. Первый будет необходим для работы с функциями libbass, второй послужит для работы с фреймворком iOS для работы с сетевыми потоками.
Необходимо скачать данный архив, распаковать его содержимое в корень проекта и подключить данные файлы к проекту.
В раздел implementation необходимо добавить следующий код:
{$O-}
function BASS_Init(device: LongInt; freq: DWORD; flags: DWORD; win: Pointer; clsid: Pointer) : BOOL; cdecl; external 'libbass.a' name 'BASS_Init';
function BASS_StreamPutData(handle: HSTREAM; buffer: Pointer; length: DWORD): DWORD; cdecl; external 'libbass.a' name 'BASS_StreamPutData';
function BASS_StreamFree(handle: HSTREAM): BOOL; cdecl; external 'libbass.a' name 'BASS_StreamFree';
function BASS_StreamCreate(freq: DWORD; chans: DWORD; flags: DWORD; proc: Pointer; user: Pointer): HSTREAM; cdecl; external 'libbass.a' name 'BASS_StreamCreate';
function BASS_StreamCreateFile(mem: BOOL; f: Pointer; offset, length: QWORD; flags: Cardinal): HSTREAM; cdecl; external 'libbass.a' name 'BASS_StreamCreateFile';
function BASS_StreamCreateURL(url: Pointer; offset: Cardinal; flags: Cardinal; proc: DOWNLOADPROC; user: Pointer):HSTREAM; cdecl; external 'libbass.a' name 'BASS_StreamCreateURL';
function BASS_ChannelPlay(handle: HSTREAM; restart: BOOL): BOOL; cdecl; external 'libbass.a' name 'BASS_ChannelPlay';
function BASS_ChannelStop(handle: DWORD): BOOL; cdecl; external 'libbass.a' name 'BASS_ChannelStop';
{$O+}
Работа с аудиопотоком
Для корректной работы с аудипотоками, требуется подключение аудио-фреймворка iOS. Самый простой способ сделать это, кинуть на форму компонент DPFAVPlayer, что именно я и сделал. Это исключает необходимость выполнения дополнительных манипуляций.
Так же, для нормальной работы программы, я разделал функционал на несколько потоков, чтобы при проигрывании аудио потоков само приложение не тормозило и не останавливалось по неизвестным причинам. Приведу код работы из рабочего проекта.
Глобальные переменные.
uStream:HSTREAM;
chan: HSTREAM = 0;
При нажатии на кнопку Play в приложении запускается поток:
// Запускаем поток вещания
IdThreadComponent1.Start;
«Тело» потока:
try
// Инициализируем libbass
BASS_Init(-1,44100,0,Handle,nil);
// Закрываем предыдущие потоки (не обязательно, взято из примера)
BASS_StreamFree(uStream);
messageText := 'Буферизация...';
IdThreadComponent1.Synchronize(ShowMess);
// Создаём поток данных
uStream:=BASS_StreamCreateURL(Pchar(stantion),0,BASS_STREAM_STATUS or BASS_UNICODE,nil,nil);
if uStream = 0 then
begin
ShowMessage('Ошибка создания потока!');
end
else
begin
if not Bass_ChannelPlay(uStream,true) then
begin
ShowMessage('Не удалось воспроизвести поток!');
end;
messageText := currentLabel;
IdThreadComponent1.Synchronize(ShowMess);
IdThreadComponent1.Synchronize(deactivateIndicator);
end;
except on E: Exception do
begin
{$IFDEF DEBUG}
ShowMessage(e.Message);
{$ELSE}
ShowMessage('Ошибка подключения к выбранной радиостанции.');
{$ENDIF}
end;
end;
IdThreadComponent1.Terminate;
Остановка проигрывания
// Останавливаем плеер
BASS_ChannelStop(uStream);
Как вы могли заметить, во время запуска потока, инициализируется библиотека Bass, очищаются имеющиеся потоки и создаётся новый интернет поток при помощи функции BASS_StreamCreateURL, где stantion строковая переменная, содержащая ссылку на поток.
Данный набор минимальных настроек, позволит вам работать с библиотекой Bass на устройствах под управлением iOS.
Проигрывание в фоне
Чтобы заставить ваше приложение продолжать проигрывание в фоне, необходимо сделать дополнительные настройки проекта. В XE10 наконец-то появился параметр UIBackgroundModes. В настройках проекта устанавливаем значения: audio И remote-notification (в случае использования Push уведомлений).
Окончание
Ну вот в общем и всё, что требуется сделать для создания проекта с использованием libbass на iOS. Возможно, при написании статьи я допустил какие-либо неточности и недочёты, т. к. проекты сделаны давно, а статья написана по следам этих проектов, поэтому я мог упустить нюансы. Обо всех замеченных недочётах и ошибках вы можете писать мне в комментариях, буду рад вашим отзывам.