Использование SoundPool, Timer и TimerTask для воспроизведения случайного звука каждую минуту - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь воспроизводить случайный звук каждую минуту, который предлагает пользователю взаимодействовать с устройством. Я использую SoundPool, Timer и TimerTask, чтобы попытаться достичь этого. Когда воспроизводится звук, я также использую Logcat, чтобы увидеть идентификатор звука, который должен быть воспроизведен (это для целей исследования и анализа данных). Я попробовал несколько методов, которые включают инициализацию SoundPool внутри и вне метода run () TimerTask, а также освобождение SoundPool после нажатия кнопки. timer.Schedule используется для планирования запуска TimerTask. Должен ли я установить эти значения c?

LogCat регистрирует SoundId, но звук не воспроизводится последовательно. Например, он будет воспроизводить первый звук и регистрировать его, затем он будет регистрировать другие SoundId без воспроизведения звука. Это происходит, даже если кнопка была нажата и ресурсы SoundPool были освобождены. Иногда звук вообще не воспроизводится.

Может кто-нибудь посоветовать мне, почему это было бы непоследовательным или лучшим способом go сделать это, пожалуйста?

public class TouchscreenDashboard extends AppCompatActivity implements View.OnClickListener {

private SoundPool soundPool;
int[] sounds={R.raw.decrease_fan_speed_by_2, R.raw.decrease_fan_speed_by_5,
        R.raw.increase_fan_speed1, R.raw.increase_fan_speed_by_3,R.raw.lower_temp1,
        R.raw.lower_temp4, R.raw.raise_temp2, R.raw.raise_temp3 ,R.raw.skip_backwards_2_songs,
        R.raw.skip_backwards_4_songs,R.raw.skip_forward_1_song, R.raw.skip_forward_5_songs,
        R.raw.volume_down3,R.raw.volume_down6, R.raw.volume_up3, R.raw.volume_up5};

private Button volumeUp;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_2);
    Log.i("DashboardActivity", "Dashboard has started");

    Timer timer = new Timer() {};
    TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {

            AudioAttributes audioAttributes = new AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                    .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
                    .build();

            soundPool = new SoundPool.Builder()
                    .setAudioAttributes(audioAttributes)
                    .build();

            Random r = new Random();
            int Low = 0;
            int High = 16;
            int random = r.nextInt(High-Low) + Low;
            int soundId = soundPool.load(getApplicationContext(), sounds[random], 1);

            soundPool.play(soundId, 1, 1, 0, 0, 1);
            Log.i("DashboardActivity", "SoundId: " + random);
        }
    };
    timer.schedule(timerTask, 60000, 60000);

    volumeUp = findViewById(R.id.volumeUp);

}

@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.volumeUp:
            if (volumeCount < 99) {
                volumeCount++;
                volumeText.setText(Integer.toString(volumeCount));
            }
            soundPool.release();
            Log.i("DashboardActivity", "Volume Up Clicked");
            break;
        }
    }
}

1 Ответ

0 голосов
/ 31 марта 2020

Итак, после долгих стрессов у меня есть рабочее решение! Я все еще думаю, что должен быть лучший способ сделать это, но это то, что я придумал. SetOnLoadCompleteListener теперь воспроизводит звук только после загрузки, а timerTask2 работает на 5 секунд позади timerTask1. Причина 5-секундной задержки в том, что все мои звуки менее 1-3 секунд.

public class TouchscreenDashboard extends AppCompatActivity implements View.OnClickListener {

int[] sounds={R.raw.decrease_fan_speed_by_2, R.raw.decrease_fan_speed_by_5,
        R.raw.increase_fan_speed1, R.raw.increase_fan_speed_by_3,R.raw.lower_temp1,
        R.raw.lower_temp4, R.raw.raise_temp2, R.raw.raise_temp3 ,R.raw.skip_backwards_2_songs,
        R.raw.skip_backwards_4_songs,R.raw.skip_forward_1_song, R.raw.skip_forward_5_songs,
        R.raw.volume_down3,R.raw.volume_down6, R.raw.volume_up3, R.raw.volume_up5};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_2);
    Log.i("DashboardActivity", "Dashboard has started");

    startTimer();

}

public void startTimer() {
    timer = new Timer();
    timer2 = new Timer();
    initializeTimerTask();
    initializeTimerTask2();
    timer.schedule(timerTask, randomTimeInt, randomTimeInt); //
    timer2.schedule(timerTask2, randomTimeInt + 5000, randomTimeInt);
}

public void initializeTimerTask() {

    timerTask = new TimerTask() {
        @Override
        public void run() {

            audioAttributes = new AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                    .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
                    .build();
            soundPool = new SoundPool.Builder()
                    .setAudioAttributes(audioAttributes)
                    .build();

            releaseSoundpool = true;
            Random r = new Random();
            int Low = 0;
            int High = 16;
            int random = r.nextInt(High-Low) + Low;
            final int soundId = soundPool.load(getApplicationContext(), sounds[random], 1);
            soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
                @Override
                public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                    soundPool.play(soundId, 1, 1, 1, 0, 1);
                }
            });
            Log.d("TouchscreenDashboard", "soundID played: " + random);
        }
    };
}

public void initializeTimerTask2() {

    timerTask2 = new TimerTask() {
        @Override
        public void run() {
            soundPool.release();
            Log.d("TouchscreenDashboard", "SoundPool released");
        }
    };
}

Я действительно надеюсь, что это поможет кому-то еще.

...