Sabtu, 04 Mei 2013

Memainkan File Sound Pada Android dengan SoundPool Lebih Responsif, Misal untuk Game

Ada tiga cara untuk memainkan File Sound (Suara), atau File Musik. Yang pertama memakai MediaPlayer, yang kedua memakai SoundPool, dan yang ketiga Penulis lupa memakai apa :) Media Player lebih ditujukan untuk memainkan file yang berdurasi panjang misalnya file MP3. Tetapi MediaPlayer tidak responsif, artinya untuk loading lebih lama. Sedangkan SoundPool adalah teknik memainkan file suara yang sering digunakan untuk Game dan Background Music yang lebih Responsif. Tetapi tentu saja kekurangannya SoundPool tidak untuk file Music (Sound) yang berukuran besar atau berada di lokasi eksternal misalnya Web atau SDCard. Tetapi harus berada di dalam aplikasi (Raw atau Asset folder) dan bertipe OGG atau MIDI.

Cara memainkan file Suara dengan MediaPlayer sepertinya pernah penulis bahas di artikel lain, kalau belum ya lain kali lah :) Untuk artikel memainkan file MP3 di SDCard atau Web juga rencananya ingin penulis buat di kesempatan lain. Kali ini kita gunakan teknik SoundPool untuk memainkan file suara berekstensi OGG.

Buat project Android baru, tempatkan file sound *.ogg di direktori project res/raw/sound1.ogg. Kemudian kita tuliskan kode program di MainActivity sebagai berikut :



package com.amijaya.androidsoundpool;

import android.app.Activity;
import android.media.AudioManager;
import android.media.SoundPool;
import android.media.SoundPool.OnLoadCompleteListener;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

// http://cariprogram.blogspot.com
// nuramijaya@gmail.com
public class MainActivity extends Activity implements OnTouchListener {
private SoundPool soundPool;
private int soundID;
boolean loaded = false;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View view = findViewById(R.id.textView1);
view.setOnTouchListener(this);
// Set the hardware buttons to control the music
this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
// Load the sound
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId,
int status) {
loaded = true;
}
});
soundID = soundPool.load(this, R.raw.sound1, 1);

}

@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// Getting the user sound settings
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
float actualVolume = (float) audioManager
.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = (float) audioManager
.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume = actualVolume / maxVolume;
// Is the sound loaded already?
if (loaded) {
soundPool.play(soundID, volume, volume, 1, 0, 1f);
Log.e("Test", "Played sound");
}
}
return false;
}
}


Untuk tampilannya kita pakai default saja pada activity_main.xml seperti ini :


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:text="Click on the screen to start playing"
android:id="@+id/textView1" android:layout_width="fill_parent"
android:layout_height="fill_parent"></TextView>
</LinearLayout>


File AndroidManifest.xml juga tidak perlu dirubah :


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.amijaya.androidsoundpool"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.amijaya.androidsoundpool.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Hasilnya, klik pada tampilan aplikasi, akan keluar suara :


Project selengkapnya download disini. Caranya untuk mendownload seperti ini.

Semoga berguna.