Здесь я пишу свои идеи, мысли, описываю события своей жизни и просто делаю личные и рабочие заметки. «А Вы что, собираетесь жить вечно?»

Аудио-плеер на Delphi для iOS с применением библиотеки BASS.

Прошло довольно много времени с момента написания первой статьи «Аудио-плеер на 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.

Затем, в выпадающем списке поочерёдно выбираем следующие пункты платформ:

  1. 32-bit windows
  2. iOSSimulator
  3. iOSDevice32
  4. 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/

Библиотека libxml2.dylib

После добавления всех фреймворков в список необходимо обязательно нажать на кнопку Update local File Cache. При этом MAC с запущенным PAServer’ом должен быть настроен и доступен.

Update local File Cache

Теперь нам потребуется скомпилировать и установить компоненты. Для этого нажимаем File -> Open Project. Открываем проект из папки компонентов, соответствующий вашей среде программирования.

Нажимаем правой кнопкой на проекте в инспекторе проекта и выбираем пункт «Build», начнётся построение проекта.

После завершение построение, опять нажимаем правой кнопкой на проекте в инспекторе и выбираем пункт «Install».

Компоненты готовы к работе. Приступим к созданию проекта.

Проект

И вот, всё почти готово, для использования библиотек Bass на iOS. Осталось задействовать саму библиотеку и добавить некоторый код в проект.

Для работы с библиотекой, нам потребуется файл libbass.a. Его необходимо добавить в корень каталога проекта. Откуда конкретно у меня данный файл, я точно сказать не смогу, я нашёл его где-то на просторах форума un4seen.com. Здесь я выкладываю рабочий файл из своих проектов.

Файл libbass.a

Но, одного файла для работы будет недостаточно. Так же, в проект необходим добавить ещё 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. Возможно, при написании статьи я допустил какие-либо неточности и недочёты, т. к. проекты сделаны давно, а статья написана по следам этих проектов, поэтому я мог упустить нюансы. Обо всех замеченных недочётах и ошибках вы можете писать мне в комментариях, буду рад вашим отзывам.

Отправить
Поделиться
Запинить
5 комментариев
Giuseppe Pinjo 2018

Hi , i’m trying bass on IOS but still have some errors, Your example is very interesting.
Please tell me where i can download Delphi source of Intervolna
best regards.
Giuseppe

Бирюков Александр 2018

Hi. I send source code of Intervolna no your e-mail maes***@lib*.it

keven 2018

hi, Finding a problem, in ios, bass can play the url’s mp3, but cannot play the local mp3 file.
I tried it for a long time and couldn’t find the reason.
Could you send source code of Intervolna to me?

Daniele Mac 2019

Hello,
we have tried to replicate your tutorial.
We encountered a problem when we send the program to IOS Simulator, it seems not to do the Load Dll of the ’libbas.a’ dll in the bass.pas file and the app closes on the simulator
  could you give us support to solve this problem?
Cheers
Daniele

Бирюков Александр 2019

Hello. When I wrote the project, I also could not run on the simulator. It is necessary to check the project on a real device. In the simulator for some reason to run and failed.

გია ქველაძე 2020

Здравствуйте
я попробовал сделать ваш пример но библиотека не грузится и вылетает апликация можете выслать мне рабочий исходный код? заранее спасибо

Бирюков Александр 2020

Добрый день. Попробую найти, но боюсь, что статья могла уже немного устареть. Напишите мне свою почту, если найду исходник, скину на почту.

გია ქველაძე 2020

GioQveladze@yahoo.com Заранее спасибо

Бирюков Александр 2020

Отправил на почту.