









Artikel ini membahas cara menggunakan DirectX Audio untuk loading dan memainkan file WAV dan MIDI termasuk Inisialisasi objek performance, segmen dan audiopath. Artikel ini juga membahas mengenai cara melakukan mixing sehingga dua atau lebih sampel suara dapat dimainkan secara simultan, yang sangat tepat dipergunakan pada pengembangan game. Di bagian terakhir, semua informasi diwujudkan menjadi sebuah wrapper class yang dapat digunakan untuk memainkan file WAV dan MIDI dengan DirectX Audio.
DirectX saat ini telah menjelma menjadi API yang matang untuk digunakan dalam pengembangan game pada platform Windows. DirectX banyak didukung developer game, selain karena mempermudah pekerjaan developer game juga karena luasnya penggunaan Windows di seluruh muka bumi. Jaman dulu pada jaman keemasannya DOS, developer game harus menulis code untuk semua perangkat keras yang diakses game mulai kode untuk memprogram kartu grafis, sound card, joystick, mouse, keyboard sampai kode untuk game enginenya sendiri. Tambah rumit jika tiap hardware cara pengaksesannya berbeda. Pada jaman itu developer game umumnya pekerjaannya tidak fokus ke game enginenya saja.
DirectX diciptakan untuk mempercepat proses pengembangan aplikasi multimedia khususnya game. Dengan adanya DirectX developer lebih fokus ke game programmingnya dan bukan API programming lagi. Untuk sound programming DirectX memiliki beberapa komponen-komponen yakni DirectSound dan DirectMusic, tapi untuk versi 8 keatas kedua komponen ini dilebur menjadi satu menjadi DirectX Audio.
Kode yang nanti ditulis menggunakan unit-unit yang merupakan konversi header DirectX Audio yg dapat didownload di Project-JEDI. Terima kasih buat orang-orang di JEDI yg sudah susah-susah mengkonversi header DirectX SDK dari C++ ke Delphi.
Ok langsung saja. Untuk menggunakan DirectX Audio (dan yg lainnya) secara garis besar kita perlu melakukan tiga langkah:
Karena DirectX Audio tidak lebih adalah sebuah COM server maka untuk memulai kita inisialisasi COM dengan memanggil fungsi CoInitialize. Fungsi ini dideklarasikan di unit ActiveX.pas dan mempunyai satu parameter, isi saja parameter ini dengan nil. Untuk mengetahui parameter apa ini silakan lihat di Windows API help. Contoh:
CoInitialize(nil);
Performance adalah istilah yang digunakan Microsoft untuk menyebut objek yg menangani pengaturan proses sound playback. Di satu aplikasi biasanya kita cuma butuh satu performance. Untuk menginisialisasi performance kita pergunakan fungsi CoCreateInstance dideklarasikan di unit ActiveX.pas. Contoh:
CoCreateInstance(
CLSID_DirectMusicPerformance,
nil,
CLSCTX_INPROC,
IID_IDirectMusicPerformance8,
FPerformance);
Parameter:
Jika sukses FPerformance tidak nil. Selanjutnya kita bisa memanggil fungsi anggota FPerformance InitAudio contoh:
if (FPerformance<>nil) then
begin
FPerformance.InitAudio(
nil,
nil,
Handle,
DMUS_APATH_SHARED_STEREOPLUSREVERB,
64,
DMUS_AUDIOF_ALL,
nil);
end;
Parameter:
Objek loader seperti namanya digunakan untuk me-load objek-objek DirectMusic seperti audio file atau resource agar dapat dimainkan oleh performance. Microsoft menyarankan kita menggunakan satu loader utk satu aplikasi. Agar penggunaan loader ini optimal disarankan untuk menciptakan sebuah loader dengan scope global dan baru membebaskan loader setelah aplikasi berakhir karena menurut M$ hal ini akan membuat object caching menjadi efisien.
Untuk menginisialisasi loader fungsi yang digunakan masih sama dengan performance
CoCreateInstance(CLSID_DirectMusicLoader,
nil,
CLSCTX_INPROC,
IID_IDirectMusicLoader8,
FLoader);
FLoader bertipe IDirectMusicLoader8
Untuk load sound sample kdari file kita gunakan fungsi anggota FLoader LoadObjectFromFile. contoh:
FLoader.LoadObjectFromFile(
CLSID_DirectMusicSegment,
IID_IDirectMusicSegment8,
wchFilename,
FSoundSegment);
Parameter:
FSoundSegment.Download(FPerformance);
Audiopath adalah istilah untuk objek yang menangani pengaturan aliran data suara. Jika kita ingin mengubah bagaimana suatu suara akan terdengar misal menambahkan filter, mixing dll, audiopath adalah tempatnya. Ketika kita menciptakan performance, DirectX juga menciptakan audiopath default. Kalau cuma untuk memainkan satu sample suara pada satu saat (seperti pada aplikasi audio player semisal winAmp) cukup menggunakan audiopath default. Tapi kalau untuk memainkan beberapa sample suara sekaligus pada satu saat seperti misal pada aplikasi game, tidak cukup hanya dengan audiopath default. Kalau kita menggunakan satu audiopath untuk memainkan beberapa sample suara, ketika kita memainkan sebuah sample, sample lain yang sebelumnya sedang dimainkan akan langsung di hentikan playbacknya, yang mana untuk aplikasi game sangat tidak cocok.
Agar tiap sample suara bisa dimainkan secara simutan (di-mix), kita perlu menciptakan audiopath untuk tiap-tiap segment. contoh:
FPerformance.CreateStandardAudioPath(
DMUS_APATH_SHARED_STEREOPLUSREVERB,
64,
TRUE,
FAudioPath);
Parameter:
Ini bagian yang paling menyenangkan. Untuk memainkan suara dari default audiopath kita menggunakan PlaySegment. Untuk memainkan segement dengan audiopath yang kita buat sendiri, kita menggunakan PlaySegmentEx. Kedua fungsi ini adalah fungsi anggota object performance. contoh:
FPerformance.PlaySegmentEx(
FSoundSegment,
nil,
nil,
DMUS_SEGF_SECONDARY,
0,
FSegmentState,
nil,
FAudioPath);
Parameter:
Untuk menghentikan suatu segment suara kita gunakan Stop atau StopEx anggota objek performance.
FPerformance.StopEx(FSoundSegment, 0, 0);
Parameter kedua dan ketiga kita set 0 agar playback dihentikan saat itu juga.
Supaya resource bisa dibebaskan ketika aplikasi diakhiri kita panggil fungsi CloseDown (fungsi anggota performance).CloseDown akan meng-unload segement-segment yg sebelumnya didownload.
FPerformance.CloseDown;
Kode lengkap contoh aplikasi dan unit yang berisi wrapper class bisa didownload di sini .
Anda suka artikel ini? Bantu website ini berkembang dengan menyumbang. Berapapun jumlahnya akan sangat dihargai.
Atau Anda dapat membantu dengan membuat bookmark.
Bookmark this on Delicious