Звук

 V*D*V

Решение следующих задач:

Проигрывание звуковых эффектов, в том числе несколько параллельно

Сделать доступной регулировку звука приложения через регулятор Multimedia устройства.

 

Используем в качестве основы код от http://code.google.com/p/replicaisland/.

Регулировка звука через регулятор Multimedia устройства

Задача решается вызовом

 

setVolumeControlStream( AudioManager.STREAM_MUSIC );

 

внутри метода onCreate(...) в тех Activity, где это необходимо.

 

Код

При использовании кода не стоит забывать о вызове функции cleanup() по завершении работы во избежании утечки ресурсов.

 

 

public class SoundManager {

 private static final int MAX_STREAMS = 4;

 private static final int MAX_SOUNDS = 16;

 

 public static final int PRIORITY_LOW = 0;

 public static final int PRIORITY_NORMAL = 1;

 public static final int PRIORITY_HIGH = 2;

 public static final int PRIORITY_MUSIC = 3;

 

 private static SoundManager m_instance = null;

 private Context m_context;

 private SoundPool m_SoundPool;

 private AudioManager m_AudioManager;

 private boolean m_SoundEnabled;

 private int[] m_LoopingStreams;

 

 private int[] m_sounds_ids = null;

 

 private SoundManager() {}

 public static synchronized SoundManager getInstance()

 {

         if( m_instance == null )

                 m_instance = new SoundManager();

         return m_instance;

 }

 public void init(Context context) {

         m_context = context;

         m_AudioManager = (AudioManager)context.getSystemService( Context.AUDIO_SERVICE );

         m_SoundEnabled = true;

         m_SoundPool = new SoundPool( MAX_STREAMS, AudioManager.STREAM_MUSIC, 0 );

         m_sounds_ids = new int[MAX_SOUNDS];

         m_LoopingStreams = new int[MAX_STREAMS];

         for( int x = 0; x < m_LoopingStreams.length; x++ ) {

                 m_LoopingStreams[x] = -1;

         }

 }

 public void cleanup()

 {

         m_SoundPool.release();

         m_SoundPool = null;

         m_sounds_ids = null;

         m_AudioManager.unloadSoundEffects();

         m_instance = null;

 }

 public void addSound(int index, int resId) {

         m_sounds_ids[index] = m_SoundPool.load( m_context, resId, 1 );

 }

 synchronized public final int play(int soundId) {

         if( m_SoundEnabled ) {

                 return m_SoundPool.play( m_sounds_ids[soundId], 1.0f, 1.0f, PRIORITY_NORMAL, 0, 1.0f );

         }

         return -1;

 }

 synchronized public final int play(int soundId, boolean loop, int priority, float volume, float rate) {

         int stream = -1;

         if( m_SoundEnabled ) {

                 stream = m_SoundPool.play( m_sounds_ids[soundId], volume, volume, priority, loop ? -1 : 0, rate);

                 if( loop ) {

                         addLoopingStream( stream );

                 }

         }

         

         return stream;

 }

 public final void stop(int stream) {

         m_SoundPool.stop( stream );

         removeLoopingStream( stream );

 }

 public final void pause(int stream) {

         m_SoundPool.pause( stream );

 }

 public final void resume(int stream) {

         m_SoundPool.resume( stream );

 }

 public final void stopAll() {

         final int count = m_LoopingStreams.length;

         for( int x = count - 1; x >= 0; x-- ) {

                 if( m_LoopingStreams[x] >= 0 ) {

                         stop( m_LoopingStreams[x] );

                 }

         }

 }

 public void pauseAll() {

         final int count = m_LoopingStreams.length;

         for( int x = 0; x < count; x++ ) {

                 if( m_LoopingStreams[x] >= 0 ) {

                         pause( m_LoopingStreams[x] );

                 }

         }

 }

 private void addLoopingStream(int stream) {

         final int count = m_LoopingStreams.length;

         for( int x = 0; x < count; x++ ) {

                 if( m_LoopingStreams[x] < 0 ) {

                         m_LoopingStreams[x] = stream;

                         break;

                 }

         }

 }

 private void removeLoopingStream(int stream) {

         final int count = m_LoopingStreams.length;

         for( int x = 0; x < count; x++ ) {

                 if( m_LoopingStreams[x] == stream ) {

                         m_LoopingStreams[x] = -1;

                         break;

                 }

         }

 }

 synchronized public final void setSoundEnabled(boolean soundEnabled) {

         m_SoundEnabled = soundEnabled;

 }

 

 public final boolean isSoundEnabled() {

         return m_SoundEnabled;

 }

 

}