2016-03-26 11 views
0

ich mit folgenden Definition erschaffe Audiotrack.audioTrack.stop hört nicht auf Audio-Wiedergabe

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); 

Wenn der audioTrack beendet ist, wird das folgende aufgerufen, um den Ton zu stoppen und die Kopfposition zurückzusetzen.

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(); 
    } 

Der obige Code funktioniert einwandfrei mit Android 5.1. Aber ich habe Probleme mit 4.4.4. audioTrack.stop() aufgerufen wird, aber der Ton nicht gestoppt wird, da die reloadStaticData der Ton wieder in die Startposition zurückgespult, wiederholt es Audio. aber mit 5.1 wird es korrekt gestoppt und setzt den Puffer zurück auf den Beginn der Wiedergabe und wenn die Wiedergabetaste gedrückt wird, wird von Anfang an abgespielt.

Kann mir jemand helfen, wie kann ich dieses Problem mit Android 4.4.4?

Antwort

0

Ich bin nicht ganz sicher, ob dies Ihr Problem lösen, aber bedenken Sie Pause() verwenden, anstatt stop(). Durch die Dokumentation wird stop() für MODE_STREAM den Rest des letzten Puffers, der geschrieben wurde, weiter abspielen. Sie verwenden MODE_STATIC, aber es könnte einen Versuch wert sein.

Auch (möglicherweise unabhängig), bedenken Sie, dass write() die Anzahl der geschriebenen Bytes zurückgibt, Sie sollten also nicht auf einen einzelnen Schreibvorgang angewiesen sein, der den gesamten Puffer des AudioTracks jedes Mal füllt. write() sollte wie ein Outputstream schreiben in behandelt werden, dass sie nicht den gesamten Inhalt des Puffers schreiben kann es gegeben wurde, so ist es besser, eine Schleife zu schreiben und überprüfen, wie viel hat sich bei jedem Aufruf geschrieben zu schreiben(), dann weiter Schreiben von einem neuen Index in das Pufferarray, bis die Summe aller Schreibvorgänge gleich der Länge des Puffers ist.

+0

Eigentlich habe ich schon versucht, audioTrack.pause und bündig, ist das, was wir reloadStaticData rufen Sie den Titel zurückzuspulen und es für das nächste Spiel bereit zu halten. Wenn ich pause und flush anrufe, spult die reloadStaticData die Audiodaten nicht zurück. – User

Verwandte Themen