Програмування звуку в android - soundpool і mediaplayer

Android управління звуком

Як програти звук через SoundPool

Напишемо програму, яку буде програвати звук при торканні екрану. Створимо новий проект з ім'ям CrazySong, пакет назвемо






ru.mobilab.crazysong, в якості головної Activity вкажемо CrazySongActivity.

Наведемо main.xml до виду


Давайте розглянемо послідовність дій, яку необхідно виконати для того, щоб відтворити звуковий файл. Перш за все ми повинні створити об'єкт soundPool. Його конструктор має кілька параметрів. Перший параметр задає максимальне число одночасно програються файлів. Другий параметр задає тип аудиопотока. У більшості випадків тут підійде значення soundPool STREAM_MUSIC, хоча можливе використання й інших аудіопотоків. Їх призначення досить очевидно. (STREAM_ALARM, STREAM_DTMF, STREAM_NOTIFICATION, STREAM_RING, STREAM_SYSTEM, STREAM_VOICE_CALL). Третій параметр задає sample-rate. В даний час він ні на що не впливає, тому тут встановлюємо 0.

Після того, як ми створили об'єкт для SoundPool, за допомогою setOnLoadCompleteListener додамо до нього OnLoadCompleteListener, який буде відслідковувати завершення завантаження файлів. Як параметри метод onLoadComplete приймає об'єкт SoundPool, номер завантаженого семпли і статус завершення операції. У разі, якщо все пройшло успішно, статус дорівнює нулю.

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

  • soundID змінна з номером семпли. Цей номер повертається в результаті виконання методу load.
  • leftVolume значення гучності лівого каналу (від 0.0 до 1.0)
  • rightVolume значення гучності правого каналу (від 0.0 до 1.0)
  • priority пріоритет потоку (0 - найнижчий пріоритет)
  • loop скільки разів потрібно повторити семпл (0 не повторювати, -1 - зациклити)
  • rate швидкість відтворення (може змінюватися від 0.5 до 2.0, 1 - нормальна швидкість)







В результаті виконання методу play повертається номер streamID (або 0 в разі помилки), який можна використовувати для управління відтворенням. Наприклад це значення використовується при виклику методів pause і resume, stop, setVolume, setLoop. Якщо число максимально файлів, перевищено, то виклик чергового методу play призведе до завершення відтворення одного з програються в даний момент семплів.

Код нашого класу наведено нижче
package ru.mobilab.crazysong;

SoundPool і витік пам'яті

На форумах зустрічаються повідомлення про те, що використання SoundPool викликає проблему витоку пам'яті. Якоїсь виразної і перевіреної інформації з цього приводу знайти не вдалося. Якщо ви не збираєтеся більше програвати звуки, рекомендується виконати код

Відтворення фонової музики в Android за допомогою MediaPlayer

У разі, якщо Ви збираєтеся довантажувати файл з інтернету, послідовність дій буде трохи інша. Метод create використовувати не потрібно. Джерело аудіо задається за допомогою методу setDataSource, після якого потрібно викликати метод prepare (), який блокує виконання потоку до тих пір, поки медіаплеєр не буде готовий до відтворення музики. Метод prepareAsync () виконує ті ж дії в асинхронному режимі, тобто не блокує викликав його потік. У разі використання prepareAsync потрібно використовувати OnPreparedListener для визначення моменту, коли MediaPlayer готовий до програвання файлу. Зауважимо, що при використанні методу create метод prepare викликати не потрібно, оскільки він викликається всередині create.

Залишився ще одне актуальне питання: як визначити, що відтворення файлу закінчилося? Для цієї мети служить функція зворотного виклику onCompletion. Щоб прив'язати її до нашого медіаплеєра потрібно виконати наступний код:

Ось власне і все. Відтворення звуку не така вже й складна тема. Архів з проектом можетескачать тут.