Потокова музика – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

Короткі звукові ефекти легко поміщаються в обмеженій області памяті (купі), яку додатком Android виділяє операційна система Це не стосується більш обємних музичних файлів Тому нам необхідно здійснювати потокову передачу музики на пристрій відтворення (тобто читати в одиницю часу невеликий фрагмент файлу, декодувати його в РСМ-дані і передавати його аудіочіп)

Звучить лякаюче, правда На щастя, у нас є клас Medi a PIayer, робить за нас всю роботу Все, що нам потрібно, – вказати йому на аудіофайл і дати команду його відтворення Ініціалізація класу Medi aPl ауег виконується простіше нікуди:

Далі нам необхідно повідомити Medi aPl ауег, який файл відтворювати Це робиться (як і у випадку зі звуковим ефектом) за допомогою AssetFi1eOescri ptor:

Однак тут трохи більше коду, ніж у випадку з SoundPool Метод Medi aPl ауег setDataSourceO не приймає AssetDescri ptor безпосередньо – йому потрібен FileDescriptor, одержуваний через AssetFileDescriptorgetFileDescriptor Крім того, нам необхідно визначити зрушення і тривалість відтвореного файлу Чому зрушення Справа в тому, що всі ресурси насправді зберігаються в одному файлі Щоб Medi aPl ауег отримав позицію початку нашого файлу, необхідно надати йому величину зсуву всередині файлу ресурси

Перед початком відтворення музичного файлу доведеться викликати ще один метод, подготавливающий Medi aPlауег до відтворення:

Ця дія насправді відкриває файл і перевіряє, чи можна його читати і відтворювати екземпляром Medi aPl ауег Тепер ми можемо відтворювати, призупиняти, зупиняти, зациклювати звуковий файл і змінювати гучність

Для початку відтворення викликається наступний метод:

Зверніть увагу: його можна викликати тільки після успішного виклику MediaPlауег prepare – інакше виникне помилка виконання

Поставити відтворення на паузу можна за допомогою методу pause:

Виклик цього методу також легітимний лише після успішної підготовки класу Medi aPlауег і початку відтворення Для відновлення відтворення ми просто знову викликаємо метод Medi аР1ауег start без якої попередньої підготовки

Для зупинки відтворення використовується метод stop:

Зверніть увагу – щоб запустити зупинений Medi aPlауег, необхідно спочатку знову викликати Medi aPlауег prepare

Ми можемо змусити Medi aPlауег циклічно відтворювати файл, скориставшись таким методом:

Для регулювання гучності відтворення застосовується такий метод:

Гучність встановлюється окремо для лівого і правого каналів У документації не вказуються діапазони для цих значень, але експериментально було встановлено, що вони повинні поміщатися між 0 і 1

Нарешті, нам необхідно знати, закінчилося чи відтворення Це можна зробити двома способами Можна зареєструвати OnCompletionLi stener для Medi а PIауег, щоб він викликався при закінченні відтворення файлу:

Інший метод – отримання стану Medi aPlауег за допомогою ще одного методу:

Зрозуміло, що при установці MediaPlауег в режим циклічного відтворення жоден з цих способів не повідомить, що MediaPlауег зупинив відтворення

Не забудьте – після закінчення роботи з примірником MediaPlауег потрібно звільнити зайняті їм ресурси Робиться це так:

Як вже говорилося, звільняти ресурси при завершенні роботи з обєктом є гарною практикою

Якщо ми не встановили Medi а PIауег в режим циклічного відтворення, можемо перезапустити його викликом методів MediaPlауег prepareO і Medi aPl ауег startO

Більшість цих методів викликаються асинхронно Це означає, що навіть якщо ви викликали Medi aPl ауег stop, значення MediaPlayerisPlayingO може ще деякий час залишатися рівним true Зазвичай це не привід для занепокоєння – у більшості ігор ми встановлюємо Medi а PIауег на відтворення по циклу і зупиняємо його в міру необхідності (наприклад, при переході на інший екран, якому відповідає інша музика)

Напишемо невелику активність, в якій будемо циклічно відтворювати звуковий файл з каталогу assets / Цей звуковий ефект буде припинятися і поновлюватися відповідно з життєвим циклом активності – при її постановці на паузу призупиниться і музика, при продовженні відповідним чином музика продовжиться з місця зупинки Реалізація цієї функціональності показана в лістингу 410

Лістинг 410 MediaPlayerTestJava відтворення звукових потоків package combadogicandroidgames

Основи Android API

Ми зберігаємо посилання на MediaPlауег у вигляді члена нашої активності У методі OnCreateO ми просто створюємо TextView для виведення повідомлень про помилки, як завжди

Перед тим як користуватися Medi АРП ауег, необхідно упевнитися, що кнопки управління гучністю привязані до музичного потоку Після цього ми инициализируем обєкт Medi а PI ауег і отримуємо дескриптор AssetFi 1 eDescri ptor для файлу musi с ogg (що знаходиться в каталозі assets /) з AssetManager, а також встановлюємо його в якості джерела даних для Medi aPl ауег Все, що залишається зробити після цього, – підготувати Medi a Player до відтворення і встановити для нього режим циклічного відтворення Якщо щось піде не так, член Medi aPl ауег встановлюється в nul 1, щоб пізніше ми могли визначити, успішної Чи була завантаження Крім того, ми виводимо повідомлення про помилки в TextView

У методі onResumeO ми стартуємо Medi aPl ауег (якщо його створення здійснилося успішно) OnResumeO – прекрасне для цього місце, оскільки він викликається як після onCreate, так і після onPause У першому випадку ми починаємо відтворення вперше, у другому – відновлюємо поставлений на паузі Medi aPl ауег

Метод onPauseC) призупиняє відтворення Medi aPl ауег Якщо активність призначена до знищення, ми зупиняємо Medi а PI ауег і звільняємо повязані з ним ресурси

При тестуванні різних операцій перевірте також його реакцію на призупинення і відновлення активності, заблокувавши екран або тимчасово переключившись на Ноті (Стартовий екран) При поновленні Medi aPlауег продовжить відтворення з того місця, на якому він зупинився минулого разу

При роботі з потоковим звуком є ​​кілька тонкощів

Методи Medi aPl ауег start, Medi aPl ауег pause nMediaPlayerresumeO можуть викликатися тільки в певних ситуаціях Ніколи не намагайтеся викликати їх, не підготувавши попередньо Medi aPl ауег Викликайте Medi a Player, start тільки після підготовки Medi a Player або при поновленні відтворення після виклику методу Medi aPlауег Pause

Примірники Medi aPlауег досить великовагових Якщо їх багато, вони можуть порядно завантажити систему Завжди необхідно намагатися використовувати тільки один екземпляр цього обєкта для відтворення Звукові ефекти краще реалізовувати за допомогою класу SoundPool

Не забувайте повязувати кнопки управління гучністю з музичним потоком, інакше ваші гравці не зможуть управляти рівнем звуку

Наша глава майже закінчена, але залишилася ще одна велика тема – 20-графіка

Джерело: Mario Zechner / Маріо Цехнер, «Програмування ігор під Android», пров Єгор Сидорович, Євген зазноби, Видавництво «Пітер»

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*