【问题标题】:Android - How to mute SoundPool in TimerTask without stopping itAndroid - 如何在 TimerTask 中将 SoundPool 静音而不停止它
【发布时间】:2019-02-12 23:45:57
【问题描述】:

我正在尝试创建节拍器的声音,但是无法将其静音。我希望能够在不停止 TimerTask 的情况下将其静音,因为我希望在取消静音后速率保持一致。这是我的代码:

public class Metronome {
    private boolean mute;
    private boolean playing = false;
    private Timer mainTimer;
    private SoundPool mSoundPool;
    int mSoundID;

    public Metronome(Context context) {
        mSoundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0);
        mSoundID = mSoundPool.load(context, R.raw.metronome, 1);
    }

    public void play(float pace, boolean mute) {
        mainTimer = new Timer();
        MyTimerTask mainTimerTask = new MyTimerTask();
        mainTimer.schedule(mainTimerTask, 0, Math.round(pace * 1000));
        this.mute = mute;
        playing = true;
    }

    public void stop() {
        mainTimer.cancel();
        mainTimer.purge();
        playing = false;
    }

    public boolean isPlaying() {
        return playing;
    }

    public void setMute(boolean mute) {
        this.mute = mute;
        if (mute) {
            mSoundPool.setVolume(mSoundID, 0, 0);
        } else {
            mSoundPool.setVolume(mSoundID, 1, 1);
        }
    }

    private void playSound() {
        if (!mute) {
            mSoundPool.play(mSoundID, 1, 1, 1, 0, 1);
        }
    }

    class MyTimerTask extends TimerTask {

        @Override
        public void run() {
            playSound();
        }
    }
}

但是,调用setMute(true) 不起作用。有谁知道如何使我的 SoundPool 静音?

【问题讨论】:

    标签: android timer timertask soundpool android-sound


    【解决方案1】:

    想通了。当我使用静态方法和变量时它可以工作。

    public class Metronome {
        public static boolean mute = false;
        public static boolean playing = false;
        private static Timer mainTimer;
        private static SoundPool soundPool;
        private static int soundID;
    
        public static void loadSound(Context context) {
            soundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0);
            soundID = soundPool.load(context, R.raw.metronome, 1);
        }
    
        public static void play(float pace, boolean isMuted) {
            mainTimer = new Timer();
            MyTimerTask mainTimerTask = new MyTimerTask();
            mainTimer.schedule(mainTimerTask, 0, Math.round(pace * 1000));
            mute = isMuted;
            playing = true;
        }
    
        public static void stop() {
            mainTimer.cancel();
            mainTimer.purge();
            playing = false;
        }
    
        static class MyTimerTask extends TimerTask {
            @Override
            public void run() {
                playSound();
            }
    
            private void playSound() {
                if (!mute) {
                    soundPool.play(soundID, 1, 1, 1, 0, 1);
                }
            }
        }
    }
    

    【讨论】:

    • 考虑到 SoundPool 的官方 Android 文档没有提及全局状态、单例等,我相信真正的问题出在其他地方,将所有内容更改为静态只是碰巧解决了它。例如,在与播放声音的节拍器不同的实例上调用 setMute()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多