{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "В наушниках по жизни: заметки с тегом XE10",
    "_rss_description": "Здесь я пишу свои идеи, мысли, описываю события своей жизни и просто делаю личные и рабочие заметки. «А Вы что, собираетесь жить вечно?»",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/alexbirukov.ru\/?go=tags\/xe10\/",
    "feed_url": "https:\/\/alexbirukov.ru\/?go=tags%2Fxe10%2Fjson%2F",
    "icon": "https:\/\/alexbirukov.ru\/pictures\/userpic\/userpic@2x.jpg?1683051473",
    "authors": [
        {
            "name": "Бирюков Александр",
            "url": "https:\/\/alexbirukov.ru\/",
            "avatar": "https:\/\/alexbirukov.ru\/pictures\/userpic\/userpic@2x.jpg?1683051473"
        }
    ],
    "items": [
        {
            "id": "329",
            "url": "https:\/\/alexbirukov.ru\/?go=all\/udio-pleer-na-delphi-dlya-ios-s-primeneniem-biblioteki-bass\/",
            "title": "Аудио-плеер на Delphi для iOS с применением библиотеки BASS.",
            "content_html": "<p>Прошло довольно много времени с момента написания первой статьи «<a href=\"http:\/\/alexbirukov.ru\/?go=all\/udio-pleer-na-delphi-dlya-android-code-gear-rad-studio-xe7\/\">Аудио-плеер на Delphi для Android с применением библиотеки BASS<\/a>». И теперь я решил написать вторую часть статьи про запуск и использование библиотеки BASS под iOS. В данном конкретном случае, так же? как и в предыдущей статье, целью подключения библиотеки, стало использование функции проигрывания сетевого аудиопотока.<\/p>\n<h2>Настройка<\/h2>\n<p>Как и в случае с настройкой под Android, для iOS нам потребуются дополнительные библиотеки, без которых скомпилировать проект не получиться. Воспользуемся набором библиотек <a href=\"http:\/\/sourceforge.net\/projects\/dpfdelphiios\/\">DPF iOS Native Components<\/a>. Данные библиотеки нужны для подключения iOS фреймворка работы со звуком.<\/p>\n<p>Скачиваем архив с файлами с <a href=\"http:\/\/sourceforge.net\/projects\/dpfdelphiios\/\">официального сайта<\/a> или с <a href=\"http:\/\/alexbirukov.ru\/files\/radio-ios\/DPF.iOS.Native.Components.v9.6.1.zip\">моего сайта<\/a>.<\/p>\n<p>После того, как мы скачали все необходимые дополнительные файлы, приступаем к установке компонентов.<\/p>\n<p>Я рекомендую (во избежании дополнительных проблем с подключением) распаковать файлы в папку DPF.iOS.Native.Components.v9.6.1.zip в корень диска C.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-00-54-41.png\" width=\"1280\" height=\"1024\" alt=\"Распаковываем файлы фреймворка\" \/>\n<\/div>\n<p>В каталоге с файлами, имеется файл Install.txt. У кого хорошо с английским, могут сделать всё по инструкции описанной в файле, для тех, кто не совсем понимает, что необходимо делать, я опишу процесс подробно.<\/p>\n<p>Запускаем Codegear RAD Studio. Далее в верхнем меню открываем Tools->Options->Delphi Options->Library.<\/p>\n<p>Затем, в выпадающем списке поочерёдно выбираем следующие пункты платформ:<\/p>\n<ol start=\"1\">\n<li>32-bit windows<\/li>\n<li>iOSSimulator<\/li>\n<li>iOSDevice32<\/li>\n<li>iOSDevice64<\/li>\n<\/ol>\n<p>В каждом из пунктов добавляем в раздел «Library path» путь к нашим компонентам. В нашем случае <b>C:\\DPF.iOS.Native.Components.v9.6.1\\<\/b><\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"1280\" data-ratio=\"1.25\">\n<img src=\"https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-00-56-43.png\" width=\"1280\" height=\"1024\" alt=\"Добавление фреймворка\" \/>\n<img src=\"https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-00-57-19.png\" width=\"1280\" height=\"1024\" alt=\"Добавление фреймворка\" \/>\n<\/div>\n<\/div>\n<p>Теперь, необходимо в разделе SDK Manager указать, какие фрейворки iOS нам потребуются. Для этого открываем Tools->Options->SDK Manager, пролистываем появившийся список вниз до раздела <b>Frameworks<\/b>, выбираем в списке один из фремворков, нажимаем на кнопку <b>Add the new path item<\/b> и добавляем следующие фреймворки:<\/p>\n<ul>\n<li>\/System\/Library\/Frameworks\/EventKit<br \/>\n\/System\/Library\/Frameworks\/MessageUI<br \/>\n\/System\/Library\/Frameworks\/AudioToolbox<br \/>\n\/System\/Library\/Frameworks\/Social<br \/>\n\/System\/Library\/Frameworks\/QuickLook<br \/>\n\/System\/Library\/Frameworks\/SystemConfiguration<br \/>\n\/System\/Library\/Frameworks\/GameKit<br \/>\n\/System\/Library\/Frameworks\/CoreBluetooth<br \/>\n\/System\/Library\/Frameworks\/Accounts<br \/>\n\/System\/Library\/Frameworks\/AdSupport<br \/>\n\/System\/Library\/Frameworks\/ExternalAccessory<br \/>\n\/System\/Library\/Frameworks\/AddressBookUI (No need in XE8 and later)<br \/>\n\/System\/Library\/Frameworks\/AddressBook (No need in XE8 and later)<br \/>\n\/System\/Library\/Frameworks\/MobileCoreServices (No need in XE8 and later)<br \/>\n\/System\/Library\/Frameworks\/MapKit (No need in XE8 and later)<br \/>\n\/System\/Library\/Frameworks\/LocalAuthentication.framework\/LocalAuthentication (iOS 8.0 and later)<\/li>\n<\/ul>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/alexbirukov.ru\/pictures\/Add.png\" width=\"1280\" height=\"1024\" alt=\"добавление фрейворков\" \/>\n<\/div>\n<p>В качестве пути на удалённом хосте требуется указывать путь «<b>$(SDKROOT)\/System\/Library\/Frameworks<\/b>», а качестве имени, название фремворка. Для примера:<br \/>\n<b>Путь:<\/b> $(SDKROOT)\/System\/Library\/Frameworks<br \/>\n<b>Имя:<\/b> EventKit<br \/>\nБольше нигде никаких галочек ставить и выбирать не требуется.<\/p>\n<p>Должно получиться так.<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"1280\" data-ratio=\"1.25\">\n<img src=\"https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-01-07-03.png\" width=\"1280\" height=\"1024\" alt=\"Добавление фреймворков\" \/>\n<img src=\"https:\/\/alexbirukov.ru\/pictures\/Frameworks.png\" width=\"1199\" height=\"733\" alt=\"Список фремворков\" \/>\n<\/div>\n<\/div>\n<p>В разделе <b>Libs<\/b>, аналогичным образом необходимо добавить библиотеку <b>\/usr\/lib\/libxml2.dylib<\/b>. Путь к ней указать, как <b>$(SDKROOT)\/usr\/lib\/<\/b><\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-01-10-12.png\" width=\"1280\" height=\"1024\" alt=\"Библиотека libxml2.dylib\" \/>\n<\/div>\n<p>После добавления всех фреймворков в список необходимо обязательно нажать на кнопку <b>Update local File Cache<\/b>. При этом MAC с запущенным PAServer’ом должен быть настроен и доступен.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-01-18-15.png\" width=\"1280\" height=\"1024\" alt=\"Update local File Cache\" \/>\n<\/div>\n<p>Теперь нам потребуется скомпилировать и установить компоненты. Для этого нажимаем File -> Open Project. Открываем проект из папки компонентов, соответствующий вашей среде программирования.<\/p>\n<p>Нажимаем правой кнопкой на проекте в инспекторе проекта и выбираем пункт <b>«Build»<\/b>, начнётся построение проекта.<\/p>\n<p>После завершение построение, опять нажимаем правой кнопкой на проекте в инспекторе и выбираем пункт <b>«Install»<\/b>.<\/p>\n<p>Компоненты готовы к работе. Приступим к созданию проекта.<\/p>\n<h2>Проект<\/h2>\n<p>И вот, всё почти готово, для использования библиотек Bass на iOS. Осталось задействовать саму библиотеку и добавить некоторый код в проект.<\/p>\n<p>Для работы с библиотекой, нам потребуется файл <b>libbass.a<\/b>. Его необходимо добавить в корень каталога проекта. Откуда конкретно у меня данный файл, я точно сказать не смогу, я нашёл его где-то на просторах форума <a href=\"http:\/\/www.un4seen.com\/\">un4seen.com<\/a>. Здесь я выкладываю <a href=\"http:\/\/alexbirukov.ru\/files\/radio-ios\/libbass.a\">рабочий файл<\/a> из своих проектов.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-01-28-45.png\" width=\"1280\" height=\"1024\" alt=\"Файл libbass.a\" \/>\n<\/div>\n<p>Но, одного файла для работы будет недостаточно. Так же, в проект необходим добавить ещё 2 файла *.pas. Первый будет необходим для работы с функциями libbass, второй послужит для работы с фреймворком iOS для работы с сетевыми потоками.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-01-34-36.png\" width=\"1280\" height=\"1024\" alt=\"Файлы проекта\" \/>\n<\/div>\n<p>Необходимо скачать данный архив, распаковать его содержимое в корень проекта и подключить <a href=\"http:\/\/alexbirukov.ru\/files\/radio-ios\/adv-libbass.7z\">данные файлы<\/a> к проекту.<\/p>\n<p>В раздел <b>implementation<\/b> необходимо добавить следующий код:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">{$O-}\n  function BASS_Init(device: LongInt; freq: DWORD; flags: DWORD; win: Pointer; clsid: Pointer) : BOOL; cdecl; external 'libbass.a' name 'BASS_Init';\n  function BASS_StreamPutData(handle: HSTREAM; buffer: Pointer; length: DWORD): DWORD; cdecl; external 'libbass.a' name 'BASS_StreamPutData';\n  function BASS_StreamFree(handle: HSTREAM): BOOL; cdecl;  external 'libbass.a' name 'BASS_StreamFree';\n  function BASS_StreamCreate(freq: DWORD; chans: DWORD; flags: DWORD; proc: Pointer; user: Pointer): HSTREAM;  cdecl;  external 'libbass.a' name 'BASS_StreamCreate';\n  function BASS_StreamCreateFile(mem: BOOL; f: Pointer; offset, length: QWORD; flags: Cardinal): HSTREAM; cdecl; external 'libbass.a' name 'BASS_StreamCreateFile';\n  function BASS_StreamCreateURL(url: Pointer; offset: Cardinal; flags: Cardinal; proc: DOWNLOADPROC; user: Pointer):HSTREAM; cdecl; external 'libbass.a' name 'BASS_StreamCreateURL';\n  function BASS_ChannelPlay(handle: HSTREAM; restart: BOOL): BOOL; cdecl;  external 'libbass.a' name 'BASS_ChannelPlay';\n  function BASS_ChannelStop(handle: DWORD): BOOL; cdecl; external 'libbass.a' name 'BASS_ChannelStop';\n{$O+}<\/code><\/pre><h2>Работа с аудиопотоком<\/h2>\n<p>Для корректной работы с аудипотоками, требуется подключение аудио-фреймворка iOS.  Самый простой способ сделать это, кинуть на форму компонент DPFAVPlayer, что именно я и сделал. Это исключает необходимость выполнения дополнительных манипуляций.<\/p>\n<p>Так же, для нормальной работы программы, я разделал функционал на несколько потоков, чтобы при проигрывании аудио потоков само приложение не тормозило и не останавливалось по неизвестным причинам. Приведу код работы из рабочего проекта.<\/p>\n<p>Глобальные переменные.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">uStream:HSTREAM;\nchan: HSTREAM = 0;<\/code><\/pre><p>При нажатии на кнопку Play в приложении запускается поток:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">\/\/ Запускаем поток вещания\nIdThreadComponent1.Start;<\/code><\/pre><p>«Тело» потока:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">try\n\n    \/\/ Инициализируем libbass\n    BASS_Init(-1,44100,0,Handle,nil);\n\n    \/\/ Закрываем предыдущие потоки (не обязательно, взято из примера)\n    BASS_StreamFree(uStream);\n\n    messageText := 'Буферизация...';\n    IdThreadComponent1.Synchronize(ShowMess);\n    \/\/ Создаём поток данных\n    uStream:=BASS_StreamCreateURL(Pchar(stantion),0,BASS_STREAM_STATUS or BASS_UNICODE,nil,nil);\n\n    if uStream = 0 then\n    begin\n      ShowMessage('Ошибка создания потока!');\n    end\n    else\n    begin\n\n      if not Bass_ChannelPlay(uStream,true) then\n      begin\n        ShowMessage('Не удалось воспроизвести поток!');\n      end;\n\n      messageText := currentLabel;\n      IdThreadComponent1.Synchronize(ShowMess);\n      IdThreadComponent1.Synchronize(deactivateIndicator);\n    end;\n\n  except on E: Exception do\n    begin\n      {$IFDEF DEBUG}\n        ShowMessage(e.Message);\n      {$ELSE}\n        ShowMessage('Ошибка подключения к выбранной радиостанции.');\n      {$ENDIF}\n    end;\n  end;\n\n  IdThreadComponent1.Terminate;<\/code><\/pre><p>Остановка проигрывания<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">\/\/ Останавливаем плеер\nBASS_ChannelStop(uStream);<\/code><\/pre><p>Как вы могли заметить, во время запуска потока, инициализируется библиотека Bass, очищаются имеющиеся потоки и создаётся новый интернет поток при помощи функции <b>BASS_StreamCreateURL<\/b>, где <b>stantion<\/b> строковая переменная, содержащая ссылку на поток.<\/p>\n<p>Данный набор минимальных настроек, позволит вам работать с библиотекой Bass на устройствах под управлением iOS.<\/p>\n<h2>Проигрывание в фоне<\/h2>\n<p>Чтобы заставить ваше приложение продолжать проигрывание в фоне, необходимо сделать дополнительные настройки проекта. В XE10 наконец-то появился параметр <b>UIBackgroundModes<\/b>. В настройках проекта устанавливаем значения: <b>audio<\/b> И <b>remote-notification<\/b> (в случае использования Push уведомлений).<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-01-52-53.png\" width=\"1280\" height=\"1024\" alt=\"\" \/>\n<\/div>\n<h2>Окончание<\/h2>\n<p>Ну вот в общем и всё, что требуется сделать для создания проекта с использованием libbass на iOS. Возможно, при написании статьи я допустил какие-либо неточности и недочёты, т. к. проекты сделаны давно, а статья написана по следам этих проектов, поэтому я мог упустить нюансы. Обо всех замеченных недочётах и ошибках вы можете писать мне в комментариях, буду рад вашим отзывам.<\/p>\n",
            "date_published": "2016-01-04T02:00:24+05:00",
            "date_modified": "2021-01-30T20:39:54+05:00",
            "tags": [
                "BASS",
                "Delphi",
                "iOS",
                "libbass",
                "Seattle",
                "XE10",
                "программирование"
            ],
            "image": "https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-00-54-41.png",
            "_date_published_rfc2822": "Mon, 04 Jan 2016 02:00:24 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "329",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js",
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-00-54-41.png",
                    "https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-00-56-43.png",
                    "https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-00-57-19.png",
                    "https:\/\/alexbirukov.ru\/pictures\/Add.png",
                    "https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-01-07-03.png",
                    "https:\/\/alexbirukov.ru\/pictures\/Frameworks.png",
                    "https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-01-10-12.png",
                    "https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-01-18-15.png",
                    "https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-01-28-45.png",
                    "https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-01-34-36.png",
                    "https:\/\/alexbirukov.ru\/pictures\/Windows-7-x64-XE10-2016-01-04-01-52-53.png"
                ]
            }
        },
        {
            "id": "325",
            "url": "https:\/\/alexbirukov.ru\/?go=all\/oshibki-i-kosyaki-xe10-seattle-i-xcode-7\/",
            "title": "Ошибки и косяки Delphi XE10 Seattle и xCode 7",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/alexbirukov.ru\/pictures\/maxresdefault.jpg\" width=\"1280\" height=\"720\" alt=\"\" \/>\n<\/div>\n<p>И так, пока русскоязычная и англоязычная части интернета молчат по поводу работы в новой Delphi XE10 Seattle в связке с xCode 7, а компании представители описывают, какое замечательное вышло обновление, пользователи столкнулись с проблемой, что приложения, сделанные на XE10 Seattle, xCode 7 + SDK9, не запускаются на предыдущих платформах.<\/p>\n<p>Не совсем понятно, почему в упомянутых сегментах интернета нет совершенно никакой информации по данному поводу. Опять впереди планеты все <a href=\"http:\/\/www.cnblogs.com\/onechen\/p\/4821280.html\">Китай<\/a>.<\/p>\n<p>Пользователь блога подробно описывает конфигурацию, на которой он тестировал запуск приложения и описание проблемы. Несколько реальных устройств на разных прошивках, разные версии ПО и пр.<\/p>\n<p>Коротко о главном. Если вы хотите, как можно скорей перейти на новую Delphi XE10 Seattle с целью писать свежие приложения\\обновления для iOS, спешу вас разочаровать. Ваши программы перестанут работать на предыдущих версиях iOS. Статистика испытаний такова, что приложения собранные на XE10 Seattle, xCode 7 + SDK9 будут работать только на устройствах под управлением iOS9.<\/p>\n<p>Вторая проблема, состоит в том, что недавнего времени AppStore при проверке приложений стала проверять их именно на iOS 9, а приложения собранные на XE8.1 такую проверку не проходят, так как зависают на стартовой заставке приложения и как следствие их отклоняют. Вот так то. Прошла уже целая неделя, а интернет по данному поводу ничего сказать нам особо не может.<\/p>\n<p>На днях появилась <a href=\"http:\/\/community.embarcadero.com\/blogs\/entry\/workaround-steps-for-building-ios-32-bit-applications-for-ios-9-with-xe7-and-xe8\">статья от Сарины Дю Понт<\/a>, о том, как всё же запустить приложение сделанные в XE8.1 на iOS9.<\/p>\n<p>В результате изысканий Китайских друзей, получаем на данный момент такую картину:<\/p>\n<p>XE8 + iOS 6 = полёт нормальный<br \/>\nXE8 + iOS 7 = полёт нормальный<br \/>\nXE8 + iOS 8 = полёт нормальный<br \/>\nXE8 + iOS 9 = зависание на экране заставки (если не воспользоваться советом Сарины)<\/p>\n<p>XE10 + iOS 6 = приложение вылетает<br \/>\nXE10 + iOS 7 = приложение вылетает<br \/>\nXE10 + iOS 8 = приложение вылетает<br \/>\nXE10 + iOS 9 = полёт нормальный<\/p>\n<p>Таким образом в XE10 Seattle и xCode 7 можно получить на данный момент только приложение, работающее на iOS9.<\/p>\n<p>Ждём Delphi XE10 Seattle Update 1.<\/p>\n<p>P.S. А в на Android в Delphi XE10 Seattle приложение с компонентами для отправки Push не запускается в режиме Release — Application Store. Что тоже, очень и очень печально.<\/p>\n",
            "date_published": "2015-09-21T16:55:06+05:00",
            "date_modified": "2021-01-30T20:42:19+05:00",
            "tags": [
                "Delphi",
                "iOS",
                "Seattle",
                "xCode",
                "XE10",
                "программирование",
                "программы"
            ],
            "image": "https:\/\/alexbirukov.ru\/pictures\/maxresdefault.jpg",
            "_date_published_rfc2822": "Mon, 21 Sep 2015 16:55:06 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "325",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/alexbirukov.ru\/pictures\/maxresdefault.jpg"
                ]
            }
        }
    ],
    "_e2_version": 4134,
    "_e2_ua_string": "Aegea 11.3 (v4134)"
}