Как воспроизвести звук с помощью Soundpool в android? - PullRequest
0 голосов
/ 26 апреля 2020

Я создаю приложение для фортепиано в Android. Я использовал SoundPool для загрузки аудиофайла, а затем с помощью onTouchListener я получаю идентификатор кнопки для воспроизведения соответствующего аудиофайла. Когда я запускаю приложение, оно работает нормально. Но когда я быстро нажимаю кнопку, я получаю эту ошибку ..

E/AudioTrack: AudioFlinger could not create track, status: -12 
E/SoundPool: Error creating AudioTrack

Когда я искал здесь решение, я обнаружил, что оно происходит, потому что приложению не хватает памяти. Решением стал вызов метода soundPool.release() после завершения работы. Но я не уверен, где я должен вызывать функцию релиза в моем коде. Как я должен правильно вызвать функцию релиза в моем коде. Как мне решить эту ошибку?

вот код, который я использую ..

PianoKey. java

public class PianoKey extends AppCompatActivity {

    public Activity activity;
    private SoundPool myPianoSounds;
    private int mySoundId;
    private int myStreamId;
    private int myViewId;
    private Button myButton;
    private int soundClip;
    private Rect rect;
    private View.OnTouchListener myTouchListener;

    public PianoKey(){

    }

    public PianoKey(Activity a, Context context, int soundID, int viewID, SoundPool pianoSounds){
            this.activity = a;
            mySoundId = soundID;
            myViewId = viewID;
            myPianoSounds = pianoSounds;
            soundClip = myPianoSounds.load(context, mySoundId,1);
            myButton = (Button)this.activity.findViewById(viewID);

        myTouchListener = new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent e) {
                myButton.getParent().requestDisallowInterceptTouchEvent(true);
                rect = new Rect(myButton.getLeft(), myButton.getTop(), myButton.getRight(), myButton.getBottom());

                if(e.getAction() == MotionEvent.ACTION_DOWN){
                    myStreamId = myPianoSounds.play(soundClip,1,1,1,0,1);
                }
                if(e.getAction() == MotionEvent.ACTION_MOVE){
                    if(!rect.contains(v.getLeft() + (int) e.getX(), v.getTop() + (int) e.getY())){

                        myPianoSounds.setVolume(myStreamId, 0.1f, 0.1f);
                        new android.os.Handler().postDelayed(
                                new Runnable() {
                                    public void run() {
                                        myPianoSounds.stop(myStreamId);
                                    }
                                },
                                300);
                    }
                }
                if(e.getAction() == MotionEvent.ACTION_UP){
                  //  myPianoSounds.setVolume(myStreamId, 0.1f, 0.1f);
                    new android.os.Handler().postDelayed(
                            new Runnable() {
                                @Override
                                public void run() {
                                    myPianoSounds.stop(myStreamId);
                                }
                            },
                    500);
                }
                 return true;
            }
        };

        myButton.setOnTouchListener(myTouchListener);
    }

}

MainActivity. Java

public class MainActivity extends AppCompatActivity {

    private HorizontalScrollView scrollView;
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        scrollView = findViewById(R.id.scrollView);

        int[] soundFiles = {
                R.raw.c_3,R.raw.c_black3,R.raw.d_3,R.raw.d_black3,R.raw.e_3,R.raw.f_3,R.raw.f_black3,R.raw.g_3,R.raw.g_black3,R.raw.a_3,R.raw.a_black3,R.raw.b_3,
                R.raw.c_4,R.raw.c_black4,R.raw.d_4,R.raw.d_black4,R.raw.e_4,R.raw.f_4,R.raw.f_black4,R.raw.g_4,R.raw.g_black4,R.raw.a_4,R.raw.a_black4,R.raw.b_4,
                R.raw.c_5,R.raw.c_black5,R.raw.d_5,R.raw.d_black5,R.raw.e_5,R.raw.f_5,R.raw.f_black5,R.raw.g_5,R.raw.g_black5,R.raw.a_5,R.raw.a_black5,R.raw.b_5,
        };

        int [] viewId = {
                R.id.p1,R.id.b1, R.id.p2, R.id.b2, R.id.p3, R.id.p4,R.id.b3,R.id.p5, R.id.b4,R.id.p6,R.id.b5,R.id.p7,
                R.id.p8,R.id.b6, R.id.p9, R.id.b7, R.id.p10, R.id.p11,R.id.b8,R.id.p12, R.id.b9,R.id.p13,R.id.b10,R.id.p14,
                R.id.p15,R.id.b11, R.id.p16, R.id.b12, R.id.p17, R.id.p18,R.id.b13,R.id.p19, R.id.b14,R.id.p20,R.id.b15,R.id.p21};

        SoundPool octave3Sounds = new SoundPool.Builder().setMaxStreams(20).build();
        SoundPool octave4Sounds = new SoundPool.Builder().setMaxStreams(20).build();
        SoundPool octave5Sounds = new SoundPool.Builder().setMaxStreams(20).build();

        for(int i=0; i<12; i++){
            PianoKey key = new PianoKey(this, this, soundFiles[i], viewId[i],octave3Sounds);
        }
        for(int i=12; i<24; i++){
            PianoKey key = new PianoKey(this, this, soundFiles[i], viewId[i],octave4Sounds);
        }
        for(int i=24; i<36; i++){
            PianoKey key = new PianoKey(this, this, soundFiles[i], viewId[i],octave5Sounds);
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...