2011-01-17 8 views
0

私は、再生したいMIDIファイルを動的に作成するアプリケーションを作成しています。私のアプリでボタンを押すたびに、新しいMIDIファイルが作成され、外部ストレージに書き込まれます。私はその後、そのファイルを読んでそれを再生するアプリをしたい。 SoundPoolを使ってファイルを再生しています。しかし、私が見つけたサンプルから、SoundPoolはonCreateの間に初期化されるため、私のファイルは一度だけ読み込まれます。つまり、私が行った変更にかかわらず、ボタンを押すたびに同じファイルが再生されます。私はSound1の初期化をAudio1ButtonHandlerメソッドに移そうとしましたが、サウンドが得られなかったり、 "sample x not ready"というエラーが発生しました。私のアプリから関連するコードはここにある:MIDIファイルの動的再読

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

リリースする前に最初に停止してください!その後、リリース後、soundPoolをnullに設定します。

関連する問題