最近SDLの話をよく見かける気がします。
乗るしかない このビッグウェーブに
SDLは音声再生にSDL_mixerを使うものらしいので追加してみました。
SDL for D version 1.2.14.2
次の様な単純に再生するコードのみ動作を確認しています。
| 1 | import core.runtime; |
|---|---|
| 2 | import std.c.windows.windows; |
| 3 | import org.libsdl.sdl; |
| 4 | import org.libsdl.mixer; |
| 5 | |
| 6 | //-------------------------------------------------------------- |
| 7 | // D言語でWindowsアプリを作るときの基本処理 |
| 8 | |
| 9 | extern (Windows) |
| 10 | int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) |
| 11 | { |
| 12 | void exceptionHandler(Throwable e) |
| 13 | { |
| 14 | throw e; |
| 15 | } |
| 16 | |
| 17 | int result; |
| 18 | try |
| 19 | { |
| 20 | Runtime.initialize(&exceptionHandler); |
| 21 | scope (exit) Runtime.terminate(&exceptionHandler); |
| 22 | |
| 23 | dmain(); |
| 24 | } |
| 25 | catch (Throwable o) |
| 26 | { |
| 27 | MessageBoxA(null, cast(char*)o.toString(), "Error", MB_OK | MB_ICONEXCLAMATION); |
| 28 | result = 1; |
| 29 | } |
| 30 | |
| 31 | return result; |
| 32 | } |
| 33 | |
| 34 | // 画面サイズ |
| 35 | immutable int SCREEN_WIDTH = 640; |
| 36 | immutable int SCREEN_HEIGHT = 480; |
| 37 | |
| 38 | void dmain() |
| 39 | { |
| 40 | if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) |
| 41 | throw new Error("SDL_Init failed."); |
| 42 | scope(exit) SDL_Quit(); |
| 43 | |
| 44 | |
| 45 | // SDL_Mixerの初期化と終了 |
| 46 | Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 4096); |
| 47 | scope(exit) Mix_CloseAudio(); |
| 48 | |
| 49 | // ファイルの読み込みと解放 |
| 50 | Mix_Music* music = Mix_LoadMUS("hoge.ogg"); |
| 51 | scope(exit) Mix_FreeMusic(music); |
| 52 | |
| 53 | // 再生と停止 |
| 54 | Mix_PlayMusic(music, 0); |
| 55 | scope(exit) Mix_HaltMusic(); |
| 56 | |
| 57 | |
| 58 | SDL_Surface* screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32, SDL_HWSURFACE); |
| 59 | if (screen is null) |
| 60 | throw new Error("SDL_SetVideoMode failed."); |
| 61 | |
| 62 | |
| 63 | for (;;) |
| 64 | { |
| 65 | SDL_Event event; |
| 66 | while (SDL_PollEvent(&event)) |
| 67 | { |
| 68 | if (event.type == SDL_QUIT) |
| 69 | return; |
| 70 | } |
| 71 | } |
| 72 | } |
SDL_mixer.libが例によってcoff形式でありますが、
omf形式の物を所持していなかたので変換する必要がありました。
そこで探してみたのですが、変換するプログラムがきちんとありました。
digitalmars.D.announce - coffimplib tool
COFFIMPLIB - Digital Mars
ダウンロードはこちら (Digital Mars FTP)
coff2omfとの違いがはっきりとはわからないのですが、
coffimplibはインポートライブラリ専用の簡易版のようです。
とりあえずSDL_mixer.libについては無事変換出来ました。
みんなLinuxだからこの辺り困ってないのかな?
ついさっきSDL_mixer.dのポインタをすべてC-StyleからD-Styleに書き換えたってのに!
http://www.digitalmars.com/download/freecompiler.html
にあるimplib.exeで
implib /system hoge.dll hoge.lib
ってやってます。
DEFファイル?を自分でかかないといけないと思ってました。