我正在编写一个动态创建midi文件的应用程序,然后我想玩。每次我在我的应用程序中按下按钮时,都会创建一个新的midi文件并将其写入外部存储。然后,我希望该应用程序读取该文件并播放它。我正在使用SoundPool来播放文件。但是,从我发现的样本中,SoundPool在onCreate期间初始化,因此我的文件只读取一次。这意味着无论我对其进行任何更改,每次按下按钮时都会播放相同的文件。我已经尝试将SoundPool初始化移动到我的Audio1ButtonHandler方法中,但后来我没有声音或者选择了“sample x not ready”错误。我的应用程序的相关代码在这里:
public void onCreate(Bundle savedInstanceState) {
…………
soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
soundPoolMap = new HashMap<Integer, Integer>();
soundPoolMap.put(SOUNDPOSITION, soundPool.load("/sdcard/test.mid", 1));
}
public void Audio1ButtonHandler(View target) {
ArrayList<Integer> chord = new ArrayList<Integer>();
chord = Chord.calculateChord(kSelection, cSelection);
for (int i = 0; i < chord.size(); i++) {
System.out.println("chord value is " + chord.get(i).toString());
}
Midi.createMidiFile(chord);
playSound();
releaseSound();
}
public void playSound() {
AudioManager mgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume = streamVolumeCurrent / streamVolumeMax;
soundPool.play(soundPoolMap.get(SOUNDPOSITION), volume, volume, 1, 0, 1f);
}
public void releaseSound() {
soundPoolMap.clear();
soundPool.release();
}
正如你所看到的,我试图释放资源(在releaseSound中)试图强制它们被重新阅读但无济于事。
任何指针都会受到极大的欢迎。 感谢
答案 0 :(得分:0)
在发布之前先停止游戏!然后,在释放后,将soundPool设置为null。