<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>В наушниках по жизни: заметки с тегом Seattle</title>
<link>https://alexbirukov.ru/?go=tags/seattle/</link>
<description>Здесь я пишу свои идеи, мысли, описываю события своей жизни и просто делаю личные и рабочие заметки. «А Вы что, собираетесь жить вечно?»</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.3 (v4134)</generator>

<itunes:subtitle>Здесь я пишу свои идеи, мысли, описываю события своей жизни и просто делаю личные и рабочие заметки. «А Вы что, собираетесь жить вечно?»</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Аудио-плеер на Delphi для iOS с применением библиотеки BASS.</title>
<guid isPermaLink="false">329</guid>
<link>https://alexbirukov.ru/?go=all/udio-pleer-na-delphi-dlya-ios-s-primeneniem-biblioteki-bass/</link>
<pubDate>Mon, 04 Jan 2016 02:00:24 +0500</pubDate>
<author></author>
<comments>https://alexbirukov.ru/?go=all/udio-pleer-na-delphi-dlya-ios-s-primeneniem-biblioteki-bass/</comments>
<description>
&lt;p&gt;Прошло довольно много времени с момента написания первой статьи «&lt;a href="http://alexbirukov.ru/?go=all/udio-pleer-na-delphi-dlya-android-code-gear-rad-studio-xe7/"&gt;Аудио-плеер на Delphi для Android с применением библиотеки BASS&lt;/a&gt;». И теперь я решил написать вторую часть статьи про запуск и использование библиотеки BASS под iOS. В данном конкретном случае, так же? как и в предыдущей статье, целью подключения библиотеки, стало использование функции проигрывания сетевого аудиопотока.&lt;/p&gt;
&lt;h2&gt;Настройка&lt;/h2&gt;
&lt;p&gt;Как и в случае с настройкой под Android, для iOS нам потребуются дополнительные библиотеки, без которых скомпилировать проект не получиться. Воспользуемся набором библиотек &lt;a href="http://sourceforge.net/projects/dpfdelphiios/"&gt;DPF iOS Native Components&lt;/a&gt;. Данные библиотеки нужны для подключения iOS фреймворка работы со звуком.&lt;/p&gt;
&lt;p&gt;Скачиваем архив с файлами с &lt;a href="http://sourceforge.net/projects/dpfdelphiios/"&gt;официального сайта&lt;/a&gt; или с &lt;a href="http://alexbirukov.ru/files/radio-ios/DPF.iOS.Native.Components.v9.6.1.zip"&gt;моего сайта&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;После того, как мы скачали все необходимые дополнительные файлы, приступаем к установке компонентов.&lt;/p&gt;
&lt;p&gt;Я рекомендую (во избежании дополнительных проблем с подключением) распаковать файлы в папку DPF.iOS.Native.Components.v9.6.1.zip в корень диска C.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://alexbirukov.ru/pictures/Windows-7-x64-XE10-2016-01-04-00-54-41.png" width="1280" height="1024" alt="Распаковываем файлы фреймворка" /&gt;
&lt;/div&gt;
&lt;p&gt;В каталоге с файлами, имеется файл Install.txt. У кого хорошо с английским, могут сделать всё по инструкции описанной в файле, для тех, кто не совсем понимает, что необходимо делать, я опишу процесс подробно.&lt;/p&gt;
&lt;p&gt;Запускаем Codegear RAD Studio. Далее в верхнем меню открываем Tools-&gt;Options-&gt;Delphi Options-&gt;Library.&lt;/p&gt;
&lt;p&gt;Затем, в выпадающем списке поочерёдно выбираем следующие пункты платформ:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;32-bit windows&lt;/li&gt;
&lt;li&gt;iOSSimulator&lt;/li&gt;
&lt;li&gt;iOSDevice32&lt;/li&gt;
&lt;li&gt;iOSDevice64&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;В каждом из пунктов добавляем в раздел «Library path» путь к нашим компонентам. В нашем случае &lt;b&gt;C:\DPF.iOS.Native.Components.v9.6.1\&lt;/b&gt;&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="1280" data-ratio="1.25"&gt;
&lt;img src="https://alexbirukov.ru/pictures/Windows-7-x64-XE10-2016-01-04-00-56-43.png" width="1280" height="1024" alt="Добавление фреймворка" /&gt;
&lt;img src="https://alexbirukov.ru/pictures/Windows-7-x64-XE10-2016-01-04-00-57-19.png" width="1280" height="1024" alt="Добавление фреймворка" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Теперь, необходимо в разделе SDK Manager указать, какие фрейворки iOS нам потребуются. Для этого открываем Tools-&gt;Options-&gt;SDK Manager, пролистываем появившийся список вниз до раздела &lt;b&gt;Frameworks&lt;/b&gt;, выбираем в списке один из фремворков, нажимаем на кнопку &lt;b&gt;Add the new path item&lt;/b&gt; и добавляем следующие фреймворки:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/System/Library/Frameworks/EventKit&lt;br /&gt;
/System/Library/Frameworks/MessageUI&lt;br /&gt;
/System/Library/Frameworks/AudioToolbox&lt;br /&gt;
/System/Library/Frameworks/Social&lt;br /&gt;
/System/Library/Frameworks/QuickLook&lt;br /&gt;
/System/Library/Frameworks/SystemConfiguration&lt;br /&gt;
/System/Library/Frameworks/GameKit&lt;br /&gt;
/System/Library/Frameworks/CoreBluetooth&lt;br /&gt;
/System/Library/Frameworks/Accounts&lt;br /&gt;
/System/Library/Frameworks/AdSupport&lt;br /&gt;
/System/Library/Frameworks/ExternalAccessory&lt;br /&gt;
/System/Library/Frameworks/AddressBookUI (No need in XE8 and later)&lt;br /&gt;
/System/Library/Frameworks/AddressBook (No need in XE8 and later)&lt;br /&gt;
/System/Library/Frameworks/MobileCoreServices (No need in XE8 and later)&lt;br /&gt;
/System/Library/Frameworks/MapKit (No need in XE8 and later)&lt;br /&gt;
/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication (iOS 8.0 and later)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://alexbirukov.ru/pictures/Add.png" width="1280" height="1024" alt="добавление фрейворков" /&gt;
&lt;/div&gt;
&lt;p&gt;В качестве пути на удалённом хосте требуется указывать путь «&lt;b&gt;$(SDKROOT)/System/Library/Frameworks&lt;/b&gt;», а качестве имени, название фремворка. Для примера:&lt;br /&gt;
&lt;b&gt;Путь:&lt;/b&gt; $(SDKROOT)/System/Library/Frameworks&lt;br /&gt;
&lt;b&gt;Имя:&lt;/b&gt; EventKit&lt;br /&gt;
Больше нигде никаких галочек ставить и выбирать не требуется.&lt;/p&gt;
&lt;p&gt;Должно получиться так.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="1280" data-ratio="1.25"&gt;
&lt;img src="https://alexbirukov.ru/pictures/Windows-7-x64-XE10-2016-01-04-01-07-03.png" width="1280" height="1024" alt="Добавление фреймворков" /&gt;
&lt;img src="https://alexbirukov.ru/pictures/Frameworks.png" width="1199" height="733" alt="Список фремворков" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;В разделе &lt;b&gt;Libs&lt;/b&gt;, аналогичным образом необходимо добавить библиотеку &lt;b&gt;/usr/lib/libxml2.dylib&lt;/b&gt;. Путь к ней указать, как &lt;b&gt;$(SDKROOT)/usr/lib/&lt;/b&gt;&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://alexbirukov.ru/pictures/Windows-7-x64-XE10-2016-01-04-01-10-12.png" width="1280" height="1024" alt="Библиотека libxml2.dylib" /&gt;
&lt;/div&gt;
&lt;p&gt;После добавления всех фреймворков в список необходимо обязательно нажать на кнопку &lt;b&gt;Update local File Cache&lt;/b&gt;. При этом MAC с запущенным PAServer’ом должен быть настроен и доступен.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;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" /&gt;
&lt;/div&gt;
&lt;p&gt;Теперь нам потребуется скомпилировать и установить компоненты. Для этого нажимаем File -&gt; Open Project. Открываем проект из папки компонентов, соответствующий вашей среде программирования.&lt;/p&gt;
&lt;p&gt;Нажимаем правой кнопкой на проекте в инспекторе проекта и выбираем пункт &lt;b&gt;«Build»&lt;/b&gt;, начнётся построение проекта.&lt;/p&gt;
&lt;p&gt;После завершение построение, опять нажимаем правой кнопкой на проекте в инспекторе и выбираем пункт &lt;b&gt;«Install»&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Компоненты готовы к работе. Приступим к созданию проекта.&lt;/p&gt;
&lt;h2&gt;Проект&lt;/h2&gt;
&lt;p&gt;И вот, всё почти готово, для использования библиотек Bass на iOS. Осталось задействовать саму библиотеку и добавить некоторый код в проект.&lt;/p&gt;
&lt;p&gt;Для работы с библиотекой, нам потребуется файл &lt;b&gt;libbass.a&lt;/b&gt;. Его необходимо добавить в корень каталога проекта. Откуда конкретно у меня данный файл, я точно сказать не смогу, я нашёл его где-то на просторах форума &lt;a href="http://www.un4seen.com/"&gt;un4seen.com&lt;/a&gt;. Здесь я выкладываю &lt;a href="http://alexbirukov.ru/files/radio-ios/libbass.a"&gt;рабочий файл&lt;/a&gt; из своих проектов.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://alexbirukov.ru/pictures/Windows-7-x64-XE10-2016-01-04-01-28-45.png" width="1280" height="1024" alt="Файл libbass.a" /&gt;
&lt;/div&gt;
&lt;p&gt;Но, одного файла для работы будет недостаточно. Так же, в проект необходим добавить ещё 2 файла *.pas. Первый будет необходим для работы с функциями libbass, второй послужит для работы с фреймворком iOS для работы с сетевыми потоками.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://alexbirukov.ru/pictures/Windows-7-x64-XE10-2016-01-04-01-34-36.png" width="1280" height="1024" alt="Файлы проекта" /&gt;
&lt;/div&gt;
&lt;p&gt;Необходимо скачать данный архив, распаковать его содержимое в корень проекта и подключить &lt;a href="http://alexbirukov.ru/files/radio-ios/adv-libbass.7z"&gt;данные файлы&lt;/a&gt; к проекту.&lt;/p&gt;
&lt;p&gt;В раздел &lt;b&gt;implementation&lt;/b&gt; необходимо добавить следующий код:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;{$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+}&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Работа с аудиопотоком&lt;/h2&gt;
&lt;p&gt;Для корректной работы с аудипотоками, требуется подключение аудио-фреймворка iOS.  Самый простой способ сделать это, кинуть на форму компонент DPFAVPlayer, что именно я и сделал. Это исключает необходимость выполнения дополнительных манипуляций.&lt;/p&gt;
&lt;p&gt;Так же, для нормальной работы программы, я разделал функционал на несколько потоков, чтобы при проигрывании аудио потоков само приложение не тормозило и не останавливалось по неизвестным причинам. Приведу код работы из рабочего проекта.&lt;/p&gt;
&lt;p&gt;Глобальные переменные.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;uStream:HSTREAM;
chan: HSTREAM = 0;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;При нажатии на кнопку Play в приложении запускается поток:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;// Запускаем поток вещания
IdThreadComponent1.Start;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;«Тело» потока:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;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;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Остановка проигрывания&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;// Останавливаем плеер
BASS_ChannelStop(uStream);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Как вы могли заметить, во время запуска потока, инициализируется библиотека Bass, очищаются имеющиеся потоки и создаётся новый интернет поток при помощи функции &lt;b&gt;BASS_StreamCreateURL&lt;/b&gt;, где &lt;b&gt;stantion&lt;/b&gt; строковая переменная, содержащая ссылку на поток.&lt;/p&gt;
&lt;p&gt;Данный набор минимальных настроек, позволит вам работать с библиотекой Bass на устройствах под управлением iOS.&lt;/p&gt;
&lt;h2&gt;Проигрывание в фоне&lt;/h2&gt;
&lt;p&gt;Чтобы заставить ваше приложение продолжать проигрывание в фоне, необходимо сделать дополнительные настройки проекта. В XE10 наконец-то появился параметр &lt;b&gt;UIBackgroundModes&lt;/b&gt;. В настройках проекта устанавливаем значения: &lt;b&gt;audio&lt;/b&gt; И &lt;b&gt;remote-notification&lt;/b&gt; (в случае использования Push уведомлений).&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://alexbirukov.ru/pictures/Windows-7-x64-XE10-2016-01-04-01-52-53.png" width="1280" height="1024" alt="" /&gt;
&lt;/div&gt;
&lt;h2&gt;Окончание&lt;/h2&gt;
&lt;p&gt;Ну вот в общем и всё, что требуется сделать для создания проекта с использованием libbass на iOS. Возможно, при написании статьи я допустил какие-либо неточности и недочёты, т. к. проекты сделаны давно, а статья написана по следам этих проектов, поэтому я мог упустить нюансы. Обо всех замеченных недочётах и ошибках вы можете писать мне в комментариях, буду рад вашим отзывам.&lt;/p&gt;
</description>
</item>

<item>
<title>Ошибки и косяки Delphi XE10 Seattle и xCode 7</title>
<guid isPermaLink="false">325</guid>
<link>https://alexbirukov.ru/?go=all/oshibki-i-kosyaki-xe10-seattle-i-xcode-7/</link>
<pubDate>Mon, 21 Sep 2015 16:55:06 +0500</pubDate>
<author></author>
<comments>https://alexbirukov.ru/?go=all/oshibki-i-kosyaki-xe10-seattle-i-xcode-7/</comments>
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://alexbirukov.ru/pictures/maxresdefault.jpg" width="1280" height="720" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;И так, пока русскоязычная и англоязычная части интернета молчат по поводу работы в новой Delphi XE10 Seattle в связке с xCode 7, а компании представители описывают, какое замечательное вышло обновление, пользователи столкнулись с проблемой, что приложения, сделанные на XE10 Seattle, xCode 7 + SDK9, не запускаются на предыдущих платформах.&lt;/p&gt;
&lt;p&gt;Не совсем понятно, почему в упомянутых сегментах интернета нет совершенно никакой информации по данному поводу. Опять впереди планеты все &lt;a href="http://www.cnblogs.com/onechen/p/4821280.html"&gt;Китай&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Пользователь блога подробно описывает конфигурацию, на которой он тестировал запуск приложения и описание проблемы. Несколько реальных устройств на разных прошивках, разные версии ПО и пр.&lt;/p&gt;
&lt;p&gt;Коротко о главном. Если вы хотите, как можно скорей перейти на новую Delphi XE10 Seattle с целью писать свежие приложения\обновления для iOS, спешу вас разочаровать. Ваши программы перестанут работать на предыдущих версиях iOS. Статистика испытаний такова, что приложения собранные на XE10 Seattle, xCode 7 + SDK9 будут работать только на устройствах под управлением iOS9.&lt;/p&gt;
&lt;p&gt;Вторая проблема, состоит в том, что недавнего времени AppStore при проверке приложений стала проверять их именно на iOS 9, а приложения собранные на XE8.1 такую проверку не проходят, так как зависают на стартовой заставке приложения и как следствие их отклоняют. Вот так то. Прошла уже целая неделя, а интернет по данному поводу ничего сказать нам особо не может.&lt;/p&gt;
&lt;p&gt;На днях появилась &lt;a href="http://community.embarcadero.com/blogs/entry/workaround-steps-for-building-ios-32-bit-applications-for-ios-9-with-xe7-and-xe8"&gt;статья от Сарины Дю Понт&lt;/a&gt;, о том, как всё же запустить приложение сделанные в XE8.1 на iOS9.&lt;/p&gt;
&lt;p&gt;В результате изысканий Китайских друзей, получаем на данный момент такую картину:&lt;/p&gt;
&lt;p&gt;XE8 + iOS 6 = полёт нормальный&lt;br /&gt;
XE8 + iOS 7 = полёт нормальный&lt;br /&gt;
XE8 + iOS 8 = полёт нормальный&lt;br /&gt;
XE8 + iOS 9 = зависание на экране заставки (если не воспользоваться советом Сарины)&lt;/p&gt;
&lt;p&gt;XE10 + iOS 6 = приложение вылетает&lt;br /&gt;
XE10 + iOS 7 = приложение вылетает&lt;br /&gt;
XE10 + iOS 8 = приложение вылетает&lt;br /&gt;
XE10 + iOS 9 = полёт нормальный&lt;/p&gt;
&lt;p&gt;Таким образом в XE10 Seattle и xCode 7 можно получить на данный момент только приложение, работающее на iOS9.&lt;/p&gt;
&lt;p&gt;Ждём Delphi XE10 Seattle Update 1.&lt;/p&gt;
&lt;p&gt;P.S. А в на Android в Delphi XE10 Seattle приложение с компонентами для отправки Push не запускается в режиме Release — Application Store. Что тоже, очень и очень печально.&lt;/p&gt;
</description>
</item>


</channel>
</rss>