Android SoundPool: повторное воспроизведение остановленного звука

В настоящее время я пытаюсь воспроизвести звуки в своем приложении для Android с помощью SoundPool API. Воспроизведение звука не проблема. Теперь я хочу остановить звук и перезапустить его позже с самого начала. Но когда я вызываю функцию остановки, а затем play(), звук не воспроизводится. Вот код:

загрузить звук:

soundId = soundPool.load(context, fileId, 1);

воспроизвести звук:

streamId = soundPool.play(soundId, 1.0f, 1.0f, 1, -1, 1);

остановить звук:

soundPool.stop(streamId);

Я также пытался снова загрузить звук, прежде чем воспроизвести его во второй раз, но это не помогло.

Когда я использую паузу/возобновление, звук воспроизводится с того места, где он был остановлен (но я хочу всегда с самого начала).

Любая помощь будет оценена

РЕДАКТИРОВАТЬ:

Я только что понял кое-что странное. Когда я использую soundpool.stop(), он работает каждый второй раз, когда я вызываю soundpool.play(). Таким образом, первый вызов play() воспроизводит звук, второй нет, 3-й, 5-й, 7-й вызов воспроизводит звук. Когда я использую soundpool.pause(), а затем play(), он работает каждый третий раз. Итак, 1-й, 4-й, 7-й... вызов play() запускает звук.

Это ошибка? Или я неправильно его использую?


person user3266343    schedule 03.03.2014    source источник


Ответы (2)


Я создал простой проект, чтобы запускать и останавливать звук, а затем воспроизводить его снова. вот код

Button b1, b2;
private int streamId;
private int soundID;
private SoundPool sp;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    b1 = (Button) findViewById(R.id.b1);
    b2 = (Button) findViewById(R.id.b2);
    sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
    soundID = sp.load(this, R.raw.middle, 1);
    b1.setOnClickListener(this);
    b2.setOnClickListener(this);

}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

    switch (v.getId()) {
    case R.id.b1:
        streamId = sp.play(soundID, 1, 1, 1, 0, 1f);
        break;
    case R.id.b2:
        sp.stop(streamId);

        break;
    }
}

в моем случае я работал правильно, если вы делаете то же самое, проблема может быть где-то еще. Если бы вы могли предоставить более подробную информацию, возможно, мы могли бы выяснить, в чем проблема.

person Ravinder Bhandari    schedule 03.03.2014
comment
Спасибо за ответ. Я ничего не слышу, когда использую ваш код. Когда я меняю при инициации объекта SoundPool AudioManager.STREAM_MUSIC на AudioManager.STREAM_RING (как я использую его в своем приложении), я слышу его каждый второй раз. Нужно ли дополнительное разрешение для STREAM_MUSIC? И не могли бы вы проверить, есть ли у вас такая же проблема с STREAM_RING? - person user3266343; 03.03.2014
comment
Я дважды проверил свой код, и он работает правильно как для AudioManager.STREAM_MUSIC, так и для AudioManager.STREAM_RING. Я бы порекомендовал вам создать образец проекта и протестировать все возможности, которые вы хотите, или предоставить точную реализацию soundPool в вашем текущем проекте. - person Ravinder Bhandari; 03.03.2014

Играть в:

nowPlaying= soundPool.play(soundId, 1.0f, 1.0f, 1, -1, 1); 

soundPool.stop(nowPlaying);

теперь перезагрузите его:

soundId = soundPool.load(this, R.raw.yoursound, 0);
person Alessandro Verona    schedule 07.12.2015