+1

Phát âm thanh trong game Android sử dụng SoundPool

SoundPool là gì

SoundPool là một tập hợp các mẫu âm thanh được tải vào bộ nhớ từ resource bên trong file APK hoặc từ hệ thống file. Điều đó có nghĩa là nó được thiết kế để chơi những file âm thanh ngắn, do đó nó phù hợp cho việc tạo hiệu ứng âm thanh trong game ví dụ đạn nổ, ăn coin, lên level.

Tạo SoundPool

SoundPool sp = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);

với Android 5.0 trở lên cách tạo SoundPool sẽ khác như sau:

AudioAttributes attrs = new AudioAttributes.Builder()
        .setUsage(AudioAttributes.USAGE_GAME)
        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
        .build();
SoundPool sp = new SoundPool.Builder()
        .setMaxStreams(10)
        .setAudioAttributes(attrs)
        .build();

Đoạn code trên tạo sound pool cho tối đa là 10 luồng âm thanh (số luồng âm thanh phát đồng thời) và sử dụng stream là AudioManager.STREAM_MUSIC.

Để có thể điều chỉnh volume đúng đến stream Music trong game của bạn cần gọi method sau ở Activity cần control volume:

setVolumeControlStream(AudioManager.STREAM_MUSIC);

Load âm thanh vào SoundPool

Khi đã tạo SoundPool xong bạn cần load các đoạn âm thanh muốn play vào để có thể sẵn sàng phát bất cứ khi nào. Cần ghi nhớ id của các đoạn âm thanh hiệu ứng để có thể play

int soundIds[] = new int[10];
soundIds[0] = sp.load(context, R.raw.sound_explosion, 1);
soundIds[1] = sp.load(context, R.raw.sound_gain_coin, 1);
soundIds[2] = sp.load(context, R.raw.sound_level_up, 1);
//load các file hiệu ứng âm thanh cho game và lưu lại id

Play âm thanh đã load

Khi cần phát âm thanh giả sử ăn coin

sp.play(soundIds[1], 1, 1, 1, 0, 1.0);

Với các params như sau:

  • soundID id của file âm thanh return từ method load()
  • leftVolume volume của kênh bên trái (range = 0.0 to 1.0)
  • rightVolume volume của kênh bên phải (range = 0.0 to 1.0)
  • Độ ưu tiên (0 = lowest priority)
  • Chế độ lặp âm thanh (0 = no loop, -1 = loop forever)
  • Tốc độ chơi (1.0 = normal playback, range 0.5 to 2.0)

Phần kết

Bạn cần nhớ rằng SoundPool không nên sử dụng để play files có dung lượng quá 1MB, file càng nhỏ thì hiệu năng càng tốt cho ứng dụng.

Một điều nữa bạn cần phải release SoundPool sau khi sử dụng xong, hoặc trong onDestroy của activty.

HẾT.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.