D言語スレを見ている限り要するにこういうのを作ればいいんだな!
わかったやってみよう。
にわかにやる気出てきたので追加した。
よしぷろぐらむかこう。
-
Dマスコットアクション
2011年04月03日 23時52分comment (2) -
OpenSL ES での複数音源再生
2011年03月23日 04時56分以前の記事で、MIDIを複数再生するとおかしくなると書きましたが、使い方が悪かったようです。
EngineとOutput Mixが1対1で、Output MixとPlayerが1対Nだと思っていましたが、
正しくはEngineとOutput Mixが1対Nで、Output MixとPlayerが1対1のようです。
リファレンスにもきちんと書いてありました。7.9 Output Mix
Description
The output mix object represents a set of audio output devices to which one audio output
stream is sent. The application retrieves an output mix object from the engine and may
specify that output mix as the sink for a media object. The engine must support at least
one output mix, though it may support more. The API does not provide a direct audio
output IO-device as a sink for media objects.
実際そのように修正したところ、エミュレータ上の動作は正常になりました。
ただ、Output Mixの数は最低1つが保証されているのみで、
それ以上もたぶんあるんじゃないの的な記述なのが少々気になります。
実際に使える数の上限は不明です。
とりあえずエミュレータ上で2音まで確認しました。
ランタイムの実装依存だとは思いますが、もしかしたら実機依存かもしれません。 -
D言語でDirectX 補足情報
2011年03月20日 12時21分前回のD言語用DirectXモジュールについての補足です。
このモジュールを使用する場合の開発環境ですが、必要なものはdmdのみです。
DirectXのSDKは特に必要ありません。
サンプルやリファレンスが欲しい時にインストールすれば良いです。
libファイルも用意してませんので、リンクする必要はありません。
DirectXをD言語から使用する方法ですが、基本的にC++から使用する場合と同じです。
何か調べる時にはC++からの使用を解説しているサイトなどを探してください。
APIは同一となっています。(なっていなかったら私の作成ミスです。)
基本的にCOMのオブジェクトはC++と同様に取れますが、
ルートとなるオブジェクトの取得には注意が必要です。
インポートライブラリを同梱していませんので、
例えば「DirectSoundCreate8」のような関数ではなく、CoCreateInstanceを使うことをお勧めします。
つまり、IDirectSound8やIDirectInput8等は次の様にCOM標準の方法で取得します。1 IDirectSound8 directSound; 2 CoCreateInstance(&CLSID_DirectSound8, null, CLSCTX.CLSCTX_INPROC_SERVER, &IID_IDirectSound8, cast(void**)&directSound); 1 IDirectInput8 directInput; 2 CoCreateInstance(&CLSID_DirectInput8, null, CLSCTX.CLSCTX_INPROC_SERVER, &IID_IDirectInput8, cast(VOID**)&directInput);
同じようにしてDirect3Dのオブジェクトも取りたいところですが、
Direct3Dに限ってはCoCreateInstanceでは取れません。
「Direct3DCreate9」のような専用関数を使用する必要があります。
この関数の実体はDLLに含まれています。
「Direct3DCreate9」ならば「d3d9.dll」です。
よって、次の様にDLLから関数を取得して使用します。1 HMODULE d3d9Dll = LoadLibrary("d3d9.dll\0".ptr); 2 3 Direct3DCreate9Function Direct3DCreate9 = cast(Direct3DCreate9Function)GetProcAddress(d3d9Dll, "Direct3DCreate9\0".ptr); 4 5 IDirect3D9 direct3D = Direct3DCreate9(D3D_SDK_VERSION);
Direct3D 11の場合はこうです。1 HMODULE d3d11Dll = LoadLibrary("d3d11.dll\0".ptr); 2 3 PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN D3D11CreateDeviceAndSwapChain = cast(PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN)GetProcAddress(d3d11Dll, "D3D11CreateDeviceAndSwapChain\0".ptr); 4 5 IDXGISwapChain swapChain; 6 ID3D11Device device; 7 ID3D11DeviceContext immediateContext; 8 D3D_FEATURE_LEVEL featureLevel; 9 DXGI_SWAP_CHAIN_DESC swapChainDesc; // 設定略 10 D3D11CreateDeviceAndSwapChain(null, D3D_DRIVER_TYPE.D3D_DRIVER_TYPE_HARDWARE, null, 0, null, 0, D3D11_SDK_VERSION, &swapChainDesc, &swapChain, &device, &featureLevel, &immediateContext); -
D言語でDirectX
2011年03月17日 22時38分いつものように手持ちのソースの再アップです。
D言語からはCOMが扱えるようになっているので、
DirectXのヘッダ情報さえD言語モジュールとして作ってしまえば割と簡単にDirectXが扱えます。
ただ、そのD言語モジュールを作るのが激しく面倒です。
使う人がそれぞれでこんな作業をしていたら宇宙のエントロピーが増大してしまうと思うのです。
そうすると魔法少女的なところにも影響があると思うのでよろしくありません。
なので私がせっせと作ったモジュールを置いておきます。
D言語(D2)用 DirectX モジュール
例によって手作業でやっている部分が多いので
何かおかしなところがあればこのモジュールが原因の可能性が高いです。
可能な限り正しく動く状態にしたいと思いますので、
そういった場合には情報をいただければと思います。
また、上記モジュールの使用例として
簡単なプログラムを作成しました。
サンプルプログラム2011年3月21日 追記
上記のサンプルプログラムがdmd2.052でビルド出来なかったため、修正版を置いておきます。
winmain.dで一箇所Objectをcatchしている箇所があったので、そこをThrowableに直しただけです。
サンプルプログラム -
D言語でOgg vorbis
2011年03月16日 19時47分