Android останавливает цикл SoundPool для нескольких действий. Или остановите все звуки при смене страниц

Я программирую на Android и Java всего несколько недель, пытаясь настроить гитарный тюнер для настройки вашей гитары на слух. Простой эталонный тюнер. Я использовал большую часть этого кода сайта для его создания.

Как мне остановить SoundPool, когда я нажимаю на другую страницу / активность?

В настоящее время у меня есть две страницы, каждая с 7 звуковыми кнопками. Когда вы нажимаете любую кнопку, она зацикливается до тех пор, пока вы не нажмете другую кнопку, затем она зациклится и так далее... Если я нажимаю кнопку для следующей страницы, а затем нажимаю новую кнопку, звук с последней страницы все еще воспроизводится! довольно раздражает, когда вы пытаетесь настроить гитару на слух!

Может быть, простая кнопка остановки, чтобы остановить весь SoundPool, была бы хорошей идеей?

Вот мой пакет кода SoundManager org.gtdb.guitar_tuners;

    import android.content.Context;
    import android.media.AudioManager;
    import android.media.SoundPool;

    public class SoundManager 
    {
        private Context pContext;
        private SoundPool sndPool;
        private float rate = 1.0f;
        private float masterVolume = 1.0f;
        private float leftVolume = 1.0f;
        private float rightVolume = 1.0f;
        private float balance = 0.5f;

        // Constructor, setup the audio manager and store the app context
        public SoundManager(Context appContext)
        {
          sndPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 100);
          pContext = appContext;
        }

        // Load up a sound and return the id
        public int load(int sound_id)
        {
            return sndPool.load(pContext, sound_id, 1);
        }

        // Play a sound
        public void play(int sound_id)
        {
            sndPool.play(sound_id, leftVolume, rightVolume, 100, -1, rate);     
        }


        // Set volume values based on existing balance value
        public void setVolume(float vol)
        {
            masterVolume = vol;

            if(balance < 1.0f)
            {
                leftVolume = masterVolume;
                rightVolume = masterVolume * balance;
            }
            else
            {
                rightVolume = masterVolume;
                leftVolume = masterVolume * ( 2.0f - balance );
            }

        }

        public void setSpeed(float speed)
        {
            rate = speed;

            // Speed of zero is invalid 
            if(rate < 0.01f)
                rate = 0.01f;

            // Speed has a maximum of 2.0
            if(rate > 2.0f)
                rate = 2.0f;
        }

        public void setBalance(float balVal)
        {
            balance = balVal;

            // Recalculate volume levels
            setVolume(masterVolume);
        }



        // Free ALL the things!
        public void unloadAll()
        {
            sndPool.release();      
        }

    }

Вот мой код активности пакета Main.java org.gtdb.guitar_tuners;

    import android.app.Activity;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageButton;
    import android.widget.ImageView;
    import android.widget.Toast;        
    import com.google.ads.AdRequest;
    import com.google.ads.AdSize;
    import com.google.ads.AdView;

    import android.widget.LinearLayout;

    public class Main extends Activity {

        SoundManager snd;
        int string1, string2, string3, string4, string5, string6, string7;
        OnClickListener buttZonClick;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
            setContentView(R.layout.main);

            LinearLayout layout = (LinearLayout) findViewById(R.id.adMobUnit);

            // Create the adView
            // Please replace MY_BANNER_UNIT_ID with your AdMob Publisher ID
            AdView adView = new AdView(this, AdSize.IAB_MRECT, "aaaaaaaaaaaaa");

            // Add the adView to it
            layout.addView(adView);

            // Initiate a generic request to load it with an ad
            AdRequest request = new AdRequest();
            request.setTesting(true);

            adView.loadAd(request);

            // Create an instance of our sound manger
            snd = new SoundManager(getApplicationContext());

            // Load the samples from res/raw
            string1 = snd.load(R.raw.eadgbe1);
            string2 = snd.load(R.raw.eadgbe2);
            string3 = snd.load(R.raw.eadgbe3);
            string4 = snd.load(R.raw.eadgbe4);
            string5 = snd.load(R.raw.eadgbe5);
            string6 = snd.load(R.raw.eadgbe6);
            string7 = snd.load(R.raw.eadgbestrum);

            /** Tuner Link **/
            Button b1 = (Button) findViewById(R.id.tuner1);
            b1.setOnClickListener(new OnClickListener() {

                public void onClick(View v) {
                    startActivity(new Intent(Main.this, Dadgad.class));
                }
            });
            /** Tuner Link **/
            Button b2 = (Button) findViewById(R.id.tuner2);
            b2.setOnClickListener(new OnClickListener() {

                public void onClick(View v) {
                    startActivity(new Intent(Main.this, Daefce.class));


                }
            });

            /** gtdb.org Link **/
            ImageButton b7 = (ImageButton) findViewById(R.id.imageButton1);
            b7.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    Intent i = new Intent(Intent.ACTION_VIEW, Uri
                            .parse("http://www.gtdb.org/stats/click.php?id=17"));
                    startActivity(i);
                }
            });

        }

        public int count = 0;
        // Button listener assigned in XML layout
        public void clickHandler(View v) {
            int id = v.getId(); // Use the button id to determine which sample
                                // should be played

            switch (id) {
            case R.id.button1:
                    snd.play(1);
                break;

            case R.id.button2:
                snd.play(2);
                break;

            case R.id.button3:
                snd.play(3);
                break;

            case R.id.button4:
                snd.play(4);
                break;

            case R.id.button5:
                snd.play(5);
                break;

            case R.id.button6:
                snd.play(6);
                break;

            case R.id.button7:
                snd.play(7);
                break;
            }
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.menu, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            if (item.getItemId() == R.id.item1) {
                Toast.makeText(Main.this,
                        "Android Guitar Tuner App from Guitar Tunings Database - www.gtdb.org",
                        Toast.LENGTH_LONG).show();
            }
            return super.onOptionsItemSelected(item);
        }

    }

Извиняюсь за код, я могу себе представить, что это беспорядок, так как я в основном новичок в Java и Android. Я собирал кусочки кода других людей и смотрел видео lynda.com.

Текущая версия моего тюнера есть в продаже, но в ней нет петли звуков, так что вы можете просматривать страницы и слушать. но без петли вы должны продолжать нажимать кнопку, чтобы настроить вашу гитару! Вы можете увидеть это здесь

1 ответ

Есть ли Soundpool.stop(int) работа для тебя? Если так, то почему бы просто не переопределить Activity.onPause() метод и положить его там?

Другие вопросы по тегам