ANDROID AUDIO, ANDROIDSOUND І ANDROID MUSIC – ВСЕ про звук

&nbsp

Sound дозволяє програвати звукові ефекти, повністю зберігаються вопс-ративной памяті, Music відтворює великі за розміром звукові файли, що зберігаються на диску Почнемо з реалізації AndroidAudio так, як це показано і лістингу 5,2

Лістинг 52 AndroidAudio, Javd реалізація аудіоінтерфейсу package combad ogiс: androidqamps framework impl:

Реалізація Androi dAudi про містить AssetManager та примірник SoundPool Нам потрібен AssetManager для того, щоб ми могли завантажити звуковий ефект з файлів ресурсів (assets) в SoundPool при зверненні до Androi dAud i о newSound У свою чергу, для управління SoundPool використовується екземпляр класу Androi dAudiо

У конструкторі ми передаємо Activity нашої гри, це робиться з двох причин: так ми можемо встановити регулятор звуку медіанотока (а нам це в будь-якому випадку знадобиться), а також отримуємо AssetManager, який ми зберігаємо у відповідному члені класу SoundPool створений таким чином, що він здатний програвати одночасно до 20 звукових ефектів Цього більш ніж достатньо для вирішення що стоїть перед нами завдання

Метод newMusicO створює новий екземпляр класу AndroidMusic Конструктор даного класу використовує AssetFi leDescriptor, з якого Внутрішньосистемний створюється Medi aPl ауег (пізніше ми розглянемо це питання докладніше) Метод AssetManager openFd викличе виключення IOException, якщо щось піде не так Ми приймемо це виняток і повторно віддам його як RuntimeException Ви запитаєте, чому б не залишити 10 xception для того, щоб повідомити про помилку викликає стороні Перш за все, так працюючий код стане набагато більш заплутаним, так що краще використовуємо Runt imeL xcept ion, яке не потрібно спеціально перехоплювати Ми завантажуємо музику з файлу assets Єдиний випадок, коли може виникнути збій, якщо ми забудемо додати музичний файл в папку assets / або якщо всередині нашого файлу будуть міститися фіктивні байти У такій ситуації можуть виникати невиправні помилки, оскільки нам потрібен екземпляр класу Music, щоб паша гра правильно функціонувала Щоб не потрапляти в такі ситуації, ми використовуємо стратегію заміни перевіряються винятків на Runt imeExcept ion ще в декількох точках ігрового фреймворка

У підсумку метод newSouncK) завантажує звуковий ефект з assets в SoundPool і повертає екземпляр класу AndroidSound Конструктор даного екземпляра класу приймає SoundPool та ID звукового ефекту цей ідентифікатор йому присвоїв SoundPool Ми знову замінюємо перехоплені винятку на Runtimel xception

ПРИМІТКА

Ми не звільняємо SoundPool ні в одному з методів Причина цього полягає в тому, що у нас в будь-якому випадку буде екземпляр класу Game, що містить один екземпляр класу Audio, який, у свою чергу, включає в себе один екземпляр класу SoundPool SoundPool буде існувати до тих пір, поки існує гра Він автоматично віддалиться, як тільки активність закінчить роботу

Далі обговоримо клас AndroidSound, який реалізує інтерфейс Sound (лістинг 53)

Лістинг 53 AndroidSoundjava: Реалізація інтерфейсу Sound package combadlogiсandroidgamesframeworkimp I:

Нічого надприродного Ми просто зберегли SoundPool та ID завантажених звукових ефектів для їх подальшого відтворення та утилізації за допомогою методів р 1 ау і disposeO Простіше не буває Все це завдяки зручності самого API Android

І нарешті, нам необхідно реалізувати клас AndroidMusic, що повертається AndroidAudionewMusic

У лістингу 54 приведений код для цього класу Він виглядає трохи більш складним, ніж попередні приклади Це пояснюється застосуванням машини станів, яку використовує MediaPlауег Вона згенерує купу винятків, якщо ми будемо викликати методи в тих станах, коли цього робити не слід

Лістинг 54 AndroidMusicjava: реалізація ішерфейса Music-package com, badlogicandroidgamesframework impl:

Клас AndroidMusic зберігає екземпляр класу MedwiPlayer разом з булевим значенням isPrepared Зверніть увагу, ми можемо використовувати MediaPlayer start ) / Stop () / pause, тільки коли MediaPlayer готовий (Prepared) Цей член дозволяє відстежувати стан MediaP1ауег

Клас AndroidMusic реалізує не тільки інтерфейс Music, але також інтерфейс OnComplet ionL istener

Співали це трапиться, слід заново підготувати MediaPlayer, так як до цього ми не можемо викликати жодних методів Метод OnCompl eti onLi stener onCompl eti on може бути використаний в іншому потоці, і, оскільки ми встановлюємо член i sPrepared в даному методі, необхідно переконатися, що до нього не будуть застосовуватися суперечать один одному зміни

У конструкторі створюємо і готуємо MediaPlауег з AssetFileDescriptor, встановлюємо прапор i sPrepared, а також реєструємо екземпляр класу Androi dMusi з в якості слухача (приймача) OnCompl eti onLi stener в Medi aPl ауег Якщо щось піде не так, буде згенеровано непроверяемую виняток RuntimeException

Метод di spose спочатку перевіряє, як і раніше чи працює Medi aPlауег, і, якщо відтворення продовжується, зупиняє його В іншому випадку звернення KMediaPlayerreleaseO викличе виключення часу виконання

Методи isLoopingO, isPlayingO і isStoppedO досить прості Перші два використовують методи, надані Medi aPlауег останній застосовує прапор 3 sPrepared, який показує, що Medi аР1ауег зупинений Наприклад, Medi aPl ауег isPlayingO не може надати нам точну інформацію з цього питання, так як він не розрізняє, зупинений Medi аРlayer або ж просто поставлений на паузу

Тепер до роботи підключається метод piау Якщо відтворення вже йде, то просто виконуємо повернення з функції Далі використовуємо універсальний блок try .. catch, який спочатку перевіряє, чи готовий Medi aPlауег (це можна дізнатися за значенням прапора), і готує його, якщо це потрібно Якщо помилок немає, звертаємося до методу MediaPlауегstart, який відтворює музику Все це робиться в синхронізованому блоці, оскільки ми використовуємо прапор sPrepared, який завдяки інтерфейсу OnCompl eti onLi stener може бути встановлений в окремому потоці Якщо виникнуть якісь проблеми, знову-таки буде згенеровано непроверяемую виняток RuntimeException

Методи setLoopi ng і setVolume можуть бути використані при будь-якому стані Medi aPl ауег Вони просто служать делегатами відповідних методів Medi aPlауег

Метод stop зупиняє MediaPlayer і знову встановлює прапор isPrepared в синхронізованому блоці

І останній метод у реалізації Androi dMusi с – OnCompl eti onLi stener onCompl et ion Він просто встановлює прапор isPrepared в синхронізованому блоці, щоб інші методи не видавали непотрібні винятки

Тепер перейдемо до класів, обслуговуючим введення інформації

Джерело: 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>

*

*