动态重新读取midi文件

时间:2011-01-17 17:29:39

标签: android

我正在编写一个动态创建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中)试图强制它们被重新阅读但无济于事。

任何指针都会受到极大的欢迎。 感谢

1 个答案:

答案 0 :(得分:0)

在发布之前先停止游戏!然后,在释放后,将soundPool设置为null。