2011-09-25 1 views
1

私はそれを簡単に保つつもりです。私は本質的にサウンドボードと考えられるものを作っています。一つの例外を除いて、私が望むやり方ですべてが働いています。 1つのImageViewを選択すると、割り当てられたサウンドが再生されます。別のImageViewを選択すると、割り当てられたサウンドが再生されますが、最初のサウンドはまだ再生されています。それらは重なり合うだけです。新しい音が始まると、前の音が止まるようにしたい。一度に1つのMediaPlayerインスタンスを再生

似たような質問がどこに寄せられているのか分かりますが、それらのどれも私を助けませんでした。私はそれを動作させるために変更することができる単純なものがありますか?ここで

は(マイナス輸入はスペースを節約するために)私のコードです:

パブリッククラス着メロ活動OnClickListener {

MediaPlayer songPlaying; 
MediaPlayer ring1; 
MediaPlayer ring2; 
MediaPlayer ring3; 

String songFile; 
String songTitle; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.ringview); 

    //Rintones Sound 

     ring1 = MediaPlayer.create(ringtones.this, R.raw.cc_sgl_rm); 
     ring2 = MediaPlayer.create(ringtones.this, R.raw.cc_sgl_kft); 
     ring3 = MediaPlayer.create(ringtones.this, R.raw.cc_sgl_e); 

    ImageView iv = (ImageView)findViewById(R.id.ccsgl1); 
    iv.setOnClickListener(this); 
    registerForContextMenu(iv); 

    ImageView iv2 = (ImageView)findViewById(R.id.ccsgl2); 
    iv2.setOnClickListener(this); 
    registerForContextMenu(iv2); 

    ImageView iv3 = (ImageView)findViewById(R.id.ccsgl3); 
    iv3.setOnClickListener(this); 
    registerForContextMenu(iv3); 

} 

@Override 
public void onClick(View v) { 
    switch(v.getId()){ 
     case R.id.ccsgl1: 
      ring1.start(); 
      songFile = "cc_sgl_rm"; 
      songTitle = "Regenerate Me"; 
      songPlaying = ring1; 
      break; 
     case R.id.ccsgl2: 
      ring2.start(); 
      songFile = "cc_sgl_kft"; 
      songTitle = "Knock Four Times"; 
      songPlaying = ring2; 
      break; 
     case R.id.ccsgl3: 
      ring3.start(); 
      songFile = "cc_sgl_e"; 
      songTitle = "Eleven"; 
      songPlaying = ring3; 
      break; 
    } 

} 

public boolean stopsong(MediaPlayer songPlaying){ 
if(songPlaying!=null){ 
    songPlaying.stop(); 
    songPlaying.release(); 
    songPlaying.start(); 
} 
return false; 
} 

//CONTEXT MENU 

@Override 
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) { 
super.onCreateContextMenu(menu, v, menuInfo); 
menu.setHeaderTitle("Save as..."); 
menu.add(0, v.getId(), 0, "Ringtone"); 
} 
@Override 
public boolean onContextItemSelected(MenuItem item) { 
if(item.getTitle()=="Ringtone"){function1(item.getItemId());} 
    else {return false;} 
return true; 
} 



public void function1(int id){ 
if 
(savering(R.raw.cc_sgl_rm)){ 
    // Code if successful 
    Toast.makeText(this, "Saved as Ringtone", Toast.LENGTH_SHORT).show(); 
} 
if 
(savering(R.raw.cc_sgl_kft)){ 
    // Code if successful 
    Toast.makeText(this, "Saved as Ringtone", Toast.LENGTH_SHORT).show(); 
}  
if 
(savering(R.raw.cc_sgl_e)){ 
    // Code if successful 
    Toast.makeText(this, "Saved as Ringtone", Toast.LENGTH_SHORT).show(); 
}  
else   
{ 
    // Code if unsuccessful 
    Toast.makeText(this, "Failed - Check your SDCard", Toast.LENGTH_SHORT).show(); 
} 

} 

//Save into Ring tone Folder 

public boolean savering(int ressound){ 
byte[] buffer=null; 
InputStream fIn = getBaseContext().getResources().openRawResource(ressound); 
int size=0; 

try { 
    size = fIn.available(); 
    buffer = new byte[size]; 
    fIn.read(buffer); 
    fIn.close(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    return false;  } 

String path="/sdcard/media/audio/ringtones/"; 
String filename=songFile+".mp3"; 

boolean exists = (new File(path)).exists(); 
if (!exists){new File(path).mkdirs();} 

FileOutputStream save; 
try { 
    save = new FileOutputStream(path+filename); 
    save.write(buffer); 
    save.flush(); 
    save.close(); 
} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    return false; 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    return false; 
} 
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://"+path+filename))); 

File k = new File(path, filename); 
ContentValues values = new ContentValues(); 
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); 
values.put(MediaStore.MediaColumns.TITLE, songTitle); 
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); 
values.put(MediaStore.Audio.Media.ARTIST, "six3six"); 
values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true); 
values.put(MediaStore.Audio.Media.IS_ALARM, true); 
values.put(MediaStore.Audio.Media.IS_MUSIC, false);  

//Insert it into the database 
this.getContentResolver().insert(MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()), values); 

return true; 
} 
+0

あなたが停止する&過去の音したいですか?または待つことは?サウンドボードから、私は音が重なることを期待しています。 –

+0

前の音を完全に止めたいです。 –

答えて

0

サウンドクリップが1MB未満であれば、SoundPoolを使用して代わりにしてみてくださいを実装して拡張MediaPlayer。あなたは(あなたの場合は1)を一度に再生できるようにしたい音の数に

SoundPool pool = new SoundPool(maxStreams, streamType, srcQuality); 

設定maxStreamsstreamTypeAudioManager.STREAM_MUSICに設定され、srcQualityは0に設定されています(まだ実装されていません)。

次に、あなたのサウンドファイルをロードするために

pool.load(this, R.raw.sound_file, 1); 

を呼ぶことにします。 SoundPoolため

ドキュメントはかなり良いです: http://developer.android.com/reference/android/media/SoundPool.html

関連する問題