2016-03-26 16 views
0

Aşağıdaki tanımla birlikte AudioTrack oluşturuyorum.audioTrack.stop sesli oynatmayı durdurmuyor

audioTrack = new AudioTrack(
          AudioManager.STREAM_MUSIC, 
          44100, 
          AudioFormat.CHANNEL_OUT_MONO, 
          AudioFormat.ENCODING_PCM_16BIT, 
          buffer.length * 2, 
          AudioTrack.MODE_STATIC); 

audioTrack.write(buffer, 0, buffer.length); 
        audioTrack.setPositionNotificationPeriod(500); 
        audioTrack.setNotificationMarkerPosition(buffer.length); 
        progressListener = new PlaybackProgress(buffer.length); 
        audioTrack.setPlaybackPositionUpdateListener(progressListener); 

AudioTrack işlemi bittiğinde, sesi durdurmak ve kafa konumunu sıfırlamak için aşağıdakiler çağrılır.

private void resetAudioPlayback() { 
     ViewGroup.LayoutParams params = playbackView.getLayoutParams(); 
     params.width = 0; 
     playbackView.setLayoutParams(params); 
     audioTrack.stop(); 
     audioTrack.reloadStaticData(); 
     playImage.animate().alpha(100).setDuration(500).start(); 
    } 

Yukarıdaki kod, Android 5.1 ile mükemmel çalışır. Ama 4.4.4 ile sorun yaşıyorum. audioTrack.stop() çağrılır ancak ses durdurulmaz, çünkü reloadStaticData sesi tekrar başlangıç ​​konumuna geri sarar, ses yeniden çalar. ancak 5.1 ile, düzgün bir şekilde durur ve arabelleği tekrar oynatmanın başlangıcına sıfırlar ve oynat düğmesine basıldığında, en baştan oynatılır.

Birisi bana Android 4.4.4 ile bu sorunu nasıl çözebilir?

cevap

0

Sorununuzu çözecekse kesinlikle emin değilim, ancak stop() yerine pause() kullanmayı düşünün. Dokümantasyon ile, MODE_STREAM için stop(), yazılan son tamponun kalanını oynamaya devam edecektir. MODE_STATIC kullanıyorsunuz, ancak denemeye değer olabilir.

Ayrıca (muhtemelen ilgisiz), write() öğesinin yazılan bayt sayısını döndürdüğünü göz önünde bulundurun; bu nedenle, her seferinde AudioTrack'in tüm arabelleğini dolduran tek bir yazıya bağlı olmamalısınız. Write() bir OutputStream yazma gibi ele alınmalıdır, çünkü verilmiş olan tamponun tüm içeriğini yazamayabilir, böylece bir döngü yazmak ve her bir çağrı ile ne kadar yazıldığını yazmak daha iyidir(). Tüm yazımların toplamı, arabellek uzunluğuna eşit olana kadar arabellek dizisindeki yeni bir dizinden yazmak.

+0

Aslında, daha önce denedim, audioTrack.pause ve floş, biz parçayı geri sarmak ve bir sonraki oyun için hazır tutmak için reloadStaticData diyoruz. Burada duraklatma ve yıkama işlevini çağırırsam, reloadStaticData sesi geri sararmaz. – User

İlgili konular