Android studio soundpool stop

Класс SoundPool

Основное отличие класса SoundPool от класса MediaPlayer — поддержка одновременного проигрывания нескольких аудиопотоков, что широко используется в играх.

Обычно SoundPool используют для проигрывания маленьких аудиоклипов. SoundPool может играть несколько звуков одновременно. Звуки также можно повторять (зациклить). В этом случае для остановки проигрывания нужно явно вызывать метод остановки. Размер файла, который может проиграть SoundPool не должен превышать 1 мегабайт.

Поддерживаются файлы практически всех популярных форматов: mp3, ogg, wav, aac, 3gp, flac. После загрузки файлы перекодируются (в 16-bit PCM моно или стерео) для упрощения воспроизведения.

Можно управлять скоростью воспроизведения аудио файла. Скорость 1,0 означает воспроизведение звука в исходном виде, 2,0 — воспроизведение в два раза быстрее, а 0,5 в два раза медленнее. Диапазон скорости воспроизведения составляет от 0,5 до 2,0.

Можно программно задать количество аудио потоков, проигрываемых одновременно. Если максимальное число потоков будет превышено, автоматически остановится поток с самым низкий приоритетом. При наличии нескольких потоков с тем же низким приоритетом, будет выбран старейший из них. В случае, если приоритет нового потока ниже, чем все активные потоки, новый звук не будет проигран. Ограничение максимального числа потоков помогает снизить загрузку процессора.

Конструктор класса SoundPool

  • maxStreams — максимальное количество потоков, который могут воспроизводится одновременно
  • streamType — тип аудиопотока, это константа из класса AudioManager. Здесь чаще всего используется AudioManager.STREAM_MUSIC.
  • srcQuality — качество кодирования. Сейчас этот параметр не используется, поэтому всегда будем передавать 0.

В API 21 конструктор считается устаревшим. Смотри ниже.

Методы

Загрузить аудио файлы в SoundPool можно с помощью четырёх методов:

Загрузка из папки assets. Нужно знать путь к файлу. AssetManager — класс, предоставляющий доступ к файлам в директории assets. Получить экземпляр класса для данного приложения можно методом getAssets(). AssetFileDescriptor — файловый дескриптор для файла из директории assets.

Загрузка файла по идентификатору ресурса. Звуковые файлы могут находиться в каталоге res/raw, и соответственно идентификатор будет R.raw.sound.

Загрузка файла из указанного пути.

Загрузка файла из файловой системы устройства. Этот вариант полезен, если вы храните несколько звуков в одном двоичном файле. Параметр offset определяет смещение от начала файла, а length определяет длину звука.

В каждом методе мы передаём priority — приоритет файла. Методы возвращают идентификатор загруженного звука, который позже используется для воспроизведения.

Загрузка файлов происходит асинхронно, то есть после вызова метода load() файл не сразу будет доступен для воспроизведения, так как необходимо время для его загрузки и перекодирования. Для того чтобы отследить окончание загрузки нужно обработать событие OnLoadCompleteListener. Для этого устанавливаем обработчик события с помощью метода void setOnLoadCompleteListener(SoundPool.OnLoadCompleteListener listener), где SoundPool.OnLoadCompleteListener — это интерфейс с единственным методом void onLoadComplete(SoundPool soundPool, int sampleId, int status), который вызывается когда файл загружен. Здесь sampleId — идентификатор загруженного файла (то есть то, что вернул метод load()), а status — статус загрузки (значение 0 обозначает успешную загрузку).

Метод для проигрывания звука

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

Метод возвращает целое число int, которое используется в других методах в качестве параметра streamID.

Возобновить приостановленный поток (если поток был не на паузе, то метод не даст никакого результата)

Установка количество повторов для потока

Установка приоритета для потока

Установка скорости для потока

Установка громкости для потока

Приостановить все активные потоки

Возобновить все потоки

Удаляет звук из SoundPool. Метод возвращает true, если операция прошла успешно, и false, если такого SoundID не существует

Удаляет все загруженные звуки из SoundPool и освобождает память. После вызова этого метода экземпляр класса SoundPool уже нельзя использовать. Метод используется при выходе из программы, чтобы освободить ресурсы.

Читайте также:  Checking if gps is enabled android

Пример

Добавим на форму две кнопки, а также звуковой файл в папку ресурсов res/raw. Образцы бесплатных звуков можно взять в разделе Звуки.

Кнопку управления громкостью телефона можно настроить для управления громкости звуков:

SoundPool.Builder (API 21)

В Android 5.0 (API 21) вызов конструктора считается устаревшим. На смену ему пришёл класс SoundPool.Builder. Ниже приводится код из одного проекта.

Пример использования старого и нового способа показан в примере Кто сказал Мяу? — работаем со звуками Му, Мяу, Гав

Источник

Как остановить все звуки в SoundPool?

Я использую SoundPool для воспроизведения звуков sfx в игре на Android. В большинстве случаев он отлично работает, за исключением того, что иногда мне приходится останавливать все звуки одновременно, не останавливаясь (неважно, настроены ли они на петлю или нет). Я не могу понять, как остановить звук от игры, не зная StreamID этого звука. Что я знаю:

  • soundpool.load( … некоторый звук … ) возвращает soundID
  • soundpool.play( soundID ) воспроизводит звук и возвращает streamID
  • soundpool.stop( streamID ) останавливает звук

Мой вопрос в том, как я могу остановить звук, не зная streamID ? Я попытался отслеживать все streamID в списке, но иногда бывает так много коротких потоков, что они не будут работать. И я не могу найти какой-либо метод в SoundPool для получения активных streamID. Кто-нибудь знает, как остановить все звуки? Любой намек ценится! благодаря

Как насчет использования .release() ? Удовлетворение документации:

Отпустите ресурсы SoundPool. Отпустите всю память и собственные ресурсы, используемые объектом SoundPool. SoundPool больше нельзя использовать, и ссылка должна быть установлена ​​в значение null.

Я думаю, что это также останавливает все. (На самом деле это вызывало ошибку в одном из моих приложений, вот почему я это говорю)

Однако я считаю, что если вы хотите воспроизвести какие-либо звуки позже, вам, возможно, придется загрузить их снова .

Я бы рекомендовал использовать autoPause () и autoResume () для приостановки и перезапуска звука. Эта функция является частью soundpool:

Источник

Android SoundPool Example

Posted by: Chryssa Aliferi in Android May 7th, 2014 0 Views

When we want to create an Android application that has an Android Activity inside of which we are planning to play a sound sample, we should consider in the first place Android SoundPool class.The SoundPool class manages and plays audio resources for applications.

The SoundPool helps developers to make a collection of samples, to load them into memory, not only from a resource of the application APK, but also from a folder in the file system. In a closer look, the SoundPool class uses the MediaPlayer service to decode the audio into a raw 16-bit PCM mono or stereo stream and play the sound with very low latency, thus helping the CPU not suffer from the load of decompress effort.

Additionally, SoundPool class can help us manage the number of audio streams being rendered at once. SoundPool loads the sound asynchronously but till Android API level 8, we could not be sure whether the sound had been loaded correctly. This is why we should check if the sample is loaded in the OnLoadCompleteListener .

So, in this example we are going to create an application which plays, plays in a loop, stops, and pauses a beeping sound using the Android SoundPool.class .

For this tutorial, we will use the following tools in a Windows 64-bit platform:

  • JDK 1.7
  • Eclipse 4.2 Juno
  • Android SDK 4.4

Let’s take a closer look:

1. Create a New Android Application Project

Open Eclipse IDE and go to File → New → Project → Android Application Project.

Specify the name of the application, the project and the package and then click Next.

In the next window, the “Create Activity” option should be checked. The new created activity will be the main activity of your project. Then press Next button.

In “Configure Launcher Icon” window you should choose the icon you want to have in your app. We will use the default icon of android, so click Next.


Select the “Blank Activity” option and press Next.

Читайте также:  What is the best android antivirus

You have to specify a name for the new Activity and a name for the layout description of your app. The .xml file for the layout will automatically be created in the res/layout folder. It will also be created a fragment layout xml, that we are not going to use in this project and you can remove it if you want. Then press Finish.

You can see the structure of the project:

2. Creating the layout of the main Activity

We are going to make a simple layout xml, that will have four buttons, each one for each action of the AndroidSoundPool example. These buttons, as well as the TextView title “Press:” will be inside a LinearLayout , so that all these components can align vertically and match their parent size in width.

Open res/layout/activity_main.xml , go to the respective xml tab and paste the following:

You can notice that we will use the smart android:onClick attribute from the xml, in order to avoid setting onTouch listeners in the main Android Java Code. The onClick attribute describes which method is going to “catch” this event.

Also, do not forget to insert a sound clip in the res/raw folder of the project. We have dragged and dropped the beep.mp3 file.

3. Creating the source code of the main Activity

From the xml code above we can see that each button has an onClick attribute. In this code we are going to give functionality to each method that is called when we press the buttons created in the xml.

Open src/com.javacodegeeks.android.soundpoolexample/AndroidSoundPoolExample.java file and paste the code below.

Let’s see in detail the code above.

We set the activity_main.xml layout in our Android Activity AndroidSoundPoolExample Activity, by:

We set the AudioManager audio settings for adjusting the volume, as well as the hardware adjust audio buttons:

Also, before Android API level 8, there was not a standard way of checking if a sound had been loaded before using it, because SoundPool loads the sounds asynchronously. So, we are going to use an OnLoadCompleteListener method in order to check whether the loading has been completed successfully:

Imagine, that Android SoundPool.class , works as a pool of sounds (justifying the name of the class!). So, in order to know exactly which one of the sound clips of the pool is played in every play or playLoop method execution, we have used a counter that holds the soundID, so that we can easily stop or pause the right sound clip.

We instantiate the counter in the OnCreate() method of our Activity:

Before we play the next sound clip of the pool, we check if it is already loaded or already playing, and we hold the id of the sound in a counter:

And we stop the active sound clip by:

4. Build, compile and run

When we build, compile and run our project, the main Activity should look like this:

You should click and play, play with loop, pause and stop the sound, by clicking on the right button each time.

Источник

Программирование звука в Android — SoundPool и MediaPlayer

Перед любым разработчиком, занимающимся созданием красивых интерактивных приложений, рано или поздно встает вопрос об использовании мультимедийных возможностей телефона. Для работы со звуком в Android программисты активно используют две библиотеки. Первая из них предоставляет класс SoundPool, вторая — MediaPlayer.

Класс SoundPool удобно использовать для проигрывания коротких аудиоклипов. С его помощью можно проигрывать несколько звуков одновременно, при этом размер звукового файла не должен превышать 1 Mb. Класс MediaPlayer лучше подходит для воспроизведения долгих аудио и видеороликов.

Android управление звуком

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.

Читайте также:  Беспроводное подключение андроид авто шкода октавия а7

После того, как мы создали объект для SoundPool, с помощью setOnLoadCompleteListener добавим к нему OnLoadCompleteListener, который будет отслеживать завершение загрузки файлов. В качестве параметров метод onLoadComplete принимает объект SoundPool, номер загруженного сэмпла и статус завершения операции. В случае, если все прошло успешно, статус равен нулю.

Прежде чем проигрывать звуковые файлы их необходимо загрузить в SoundPool. Сделать это можно с помощью метода load. Метод имеет несколько реализаций, различающихся набором параметров и источником, поставляющим звуковые файлы. Можно загружать файлы из папки asset, можно из APK ресурсов, можно из файла, указав к нему путь, можно из FileDescriptor. Мы будем рассматривать ситуацию, когда звуковые сэмплы входят в состав APK пакета, то есть лежат в папке res/raw вашего проекта. Для загрузки нам понадобятся три параметра: ссылка на контекст из которого мы получаем доступ к ресурсам программы (в большинстве случаев подойдет this), ссылка на ресурс, полученная через объект R, и приоритет, который пока ни на что не влияет, и в документации рекомендуется устанавливать значение 1. Загруженные ресурсы можно выгрузить с помощью методов unload, если требуется удалить один сэмпл, и release — если нужно полностью очистить 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 2.1. Если Вы располагаете информацией об этой проблеме и ее решении, просьба отписаться в комментариях.

Воспроизведение фоновой музыки в Android с помощью MediaPlayer

SoundPool отлично подходит для озвучивания различных игровых событий: выстрелов, взрывов, реплик. Однако для проигрывания фоновой музыки нужно использовать класс MediaPlayer. Метод create этого класса имеет два параметра: контекст и ссылку на ресурс или URI адрес музыкального файла. Для запуска/паузы/остановки воспроизведения служат методы start(), pause() и stop() соответственно. Все просто.

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

Остался еще один актуальный вопрос: как определить, что воспроизведение файла закончилось? Для этой цели служит функция обратного вызова onCompletion. Чтобы привязать ее к нашему медиаплееру нужно выполнить следующий код:

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

Источник

Оцените статью