gpt4 book ai didi

android - 精确时间播放三个或更多短音 SoundPool(钢琴和弦)

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:41:43 25 4
gpt4 key购买 nike

我有问题,我想同时启动声音。

我循环播放 3-5 段短音(钢琴声),前 1 毫秒有延迟,第二个有 17 毫秒,依此类推,最后一个声音有 60-90 毫秒。

我正在使用 SoundPool。

有人遇到过这样的问题或使用过可以解决此问题的库(同步启动多个短声音)吗?

下面是示例测试示例(我使用 RxJava,但我已经使用和不使用 RxJava 对其进行了测试):

   Observable.timer(150, TimeUnit.MILLISECONDS, Schedulers.single())
.repeat()
.subscribe(aLong -> {
for (int soundId = 55; i < 60; i++) {
soundPool.play(soundId , 1f, 1f, 1, 0, 1);
}
});

最佳答案

看来您需要实现listener (OnLoadCompleteListener)SoundPool 按照文档中的说明异步加载音频文件,所以我相信这就是您延迟的原因。

为 3 种声音找到了这个工作示例 here

public class SoundManager {

public static int SOUNDPOOLSND_MENU_BTN = 0;
public static int SOUNDPOOLSND_WIN = 1;
public static int SOUNDPOOLSND_LOOSE = 2;
public static int SOUNDPOOLSND_DRAW = 3;
public static int SOUNDPOOLSND_TICK1 = 4;
public static int SOUNDPOOLSND_TICK2 = 5;
public static int SOUNDPOOLSND_OUT_OF_TIME = 6;
public static int SOUNDPOOLSND_HISCORE = 7;
public static int SOUNDPOOLSND_CORRECT_LETTER = 8;

public static boolean isSoundTurnedOff;

private static SoundManager mSoundManager;

private SoundPool mSoundPool;
private SparseArray <Integer> mSoundPoolMap;
private AudioManager mAudioManager;

public static final int maxSounds = 4;

public static SoundManager getInstance(Context context)
{
if (mSoundManager == null){
mSoundManager = new SoundManager(context);
}

return mSoundManager;
}

public SoundManager(Context mContext)
{
mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
mSoundPool = new SoundPool(maxSounds, AudioManager.STREAM_MUSIC, 0);

mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
public void onLoadComplete(SoundPool soundPool, int sampleId,int status) {
loaded = true;
}
});

mSoundPoolMap = new SparseArray<Integer>();
mSoundPoolMap.put(SOUNDPOOLSND_MENU_BTN, mSoundPool.load(mContext, R.raw.menubutton, 1));
mSoundPoolMap.put(SOUNDPOOLSND_WIN, mSoundPool.load(mContext, R.raw.win, 1));
mSoundPoolMap.put(SOUNDPOOLSND_LOOSE, mSoundPool.load(mContext, R.raw.lose, 1));
mSoundPoolMap.put(SOUNDPOOLSND_TICK1, mSoundPool.load(mContext, R.raw.tick_0, 1));
mSoundPoolMap.put(SOUNDPOOLSND_TICK2, mSoundPool.load(mContext, R.raw.tick_1, 1));
mSoundPoolMap.put(SOUNDPOOLSND_OUT_OF_TIME, mSoundPool.load(mContext, R.raw.out_of_time, 1));
mSoundPoolMap.put(SOUNDPOOLSND_HISCORE, mSoundPool.load(mContext, R.raw.personal_highscore, 1));
mSoundPoolMap.put(SOUNDPOOLSND_CORRECT_LETTER, mSoundPool.load(mContext, R.raw.correct_letter, 1));

// testing simultaneous playing
int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
mSoundPool.play(mSoundPoolMap.get(0), streamVolume, streamVolume, 1, 20, 1f);
mSoundPool.play(mSoundPoolMap.get(1), streamVolume, streamVolume, 1, 2, 1f);
mSoundPool.play(mSoundPoolMap.get(2), streamVolume, streamVolume, 1, 0, 1f);


}

public void playSound(int index) {
if (isSoundTurnedOff)
return;

int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f);
}

public static void clear()
{
if (mSoundManager != null){
mSoundManager.mSoundPool = null;
mSoundManager.mAudioManager = null;
mSoundManager.mSoundPoolMap = null;
}
mSoundManager = null;
}
}

关于android - 精确时间播放三个或更多短音 SoundPool(钢琴和弦),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47651701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com