作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有问题,我想同时启动声音。
我循环播放 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/
我使用Andrew的d3和弦图示例并希望将弯曲切片内的所有文本标签居中。我尝试了很多东西,但始终无法将文本居中。你知道需要什么巫师技巧吗? var width = 720, height = 720,
我正在尝试实现一个系统,在该系统中我可以同时播放一组频率,目前可以单独播放每个频率。下面我有一个代码,它播放给定的频率,一次播放一个。 import java.applet.*; im
是否可以一次重新映射使用 ctrl+k 作为第一个按键操作的所有和弦? 我使用 ctrl+k 删除该行的其余部分。由于它与 vscode 中使用的最常见和弦冲突,因此通过快捷方式重新映射快捷方式会很不
我是一名优秀的程序员,十分优秀!