在.pause()上淡出Android AudioTrack的方法?

时间:2015-10-15 02:24:06

标签: android audiotrack pause

我一直在钻研Android AudioTrack以反对我的兴趣。我试图在两个AudioTrack的播放之间无缝转换,也就是说,一个应该暂停而另一个应该开始,两者之间应该没有差距。

这没关系,但是我注意到在AudioTrack上调用.pause()方法时,它会在停止播放声音时“弹出”或“爆裂”。这并不令人惊讶,因为以这种方式突然停止播放声音(特别是如果它处于高点)必然会产生这些伪影。

但是,如果我可以在调用暂停时淡出AudioTrack的播放,这将是一个无问题。然而,这说起来容易做起来难,因为它似乎无法修改Android AudioTracks 到位。我也无法使用.setVolume(),因为我将API 17作为最低目标,因此Android 4.0用户仍然可以使用我的应用。

有没有办法做到这一点?我的直接想法是创建一个新的暂停(AudioTrack at)方法,该方法将修改AudioTrack缓冲区并允许它快速淡出,然后在淡入淡出后调用暂停。如果暂停发生几帧,如果这意味着弹出的声音将会消失,那对我来说并不是什么大不了的事。不幸的是,我没有看到一个简单的方法来做到这一点。

这是我到目前为止所拥有的:

if(event.getAction() == MotionEvent.ACTION_DOWN) {
            audioTracks[noteToPlay].release();
            audioTracks[noteToPlay] = new AudioTrack(AudioManager.STREAM_MUSIC,
                    sr, AudioFormat.CHANNEL_OUT_MONO,
                    AudioFormat.ENCODING_PCM_16BIT, BUFFSIZE,
                    AudioTrack.MODE_STATIC);
            writeSample(noteToPlay);
            audioTracks[noteToPlay].play();
        }
        else if (event.getAction() == MotionEvent.ACTION_UP) {
            short[] release = makeReleaseSample(noteToPlay);
            AudioTrack releaseTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                    sr, AudioFormat.CHANNEL_OUT_MONO,
                    AudioFormat.ENCODING_PCM_16BIT, BUFFSIZE,
                    AudioTrack.MODE_STATIC);
            releaseTrack.write(release, 0, release.length);
            audioTracks[noteToPlay].pause();
            releaseTrack.play();
        }

如您所见,在ACTION_UP处理程序中,我暂停 audioTracks [noteToPlay] 曲目并立即播放发布曲目。弹出发生在暂停时,因为audioTracks [noteToPlay]包含一个正弦波,并且暂停不会在低点暂停,因此它会产生伪像。

需要注意的是,audioTrack的最后一帧和第一帧释放包含相同的帧,所以我知道从第一个audioTrack中的点到的情况并非如此在第二个 - 我相当肯定这是由于第一个audioTrack的突然切断。

有什么想法吗?

0 个答案:

没有答案