source: trunk/bin/SubOperation/dx/dx_music.sbp@ 356

Last change on this file since 356 was 187, checked in by dai, 18 years ago

AB本体のバイナリを登録

File size: 12.8 KB
Line 
1'このファイルには、DirectMusicをCOMインターフェイスレベルで扱うための関数が定義されています。
2
3
4'-------------------------------------------------
5' DirectMusicに必要なヘッダファイルをインクルード
6'-------------------------------------------------
7#include <directx9\dmusic.sbp>
8
9
10Dim dx_lpDMPerformance As *IDirectMusicPerformance8 'パフォーマンス
11Dim dx_lpDMLoader As *IDirectMusicLoader8 'ローダー
12
13'DirectMusicを初期化する関数
14Function dx_InitDMusic() As Long
15 Dim hr As DWord
16
17 'パフォーマンスの生成
18 hr = CoCreateInstance(CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC,
19 IID_IDirectMusicPerformance8, dx_lpDMPerformance)
20 If hr Then
21 dx_InitDMusic=0
22 Exit Function
23 End If
24
25 'パフォーマンスの初期化
26 hr = dx_lpDMPerformance->InitAudio(NULL, NULL, hMainWnd,
27 DMUS_APATH_SHARED_STEREOPLUSREVERB, 64, DMUS_AUDIOF_ALL, NULL)
28 If hr Then
29 dx_InitDMusic=0
30 Exit Function
31 End If
32
33 'ローダーの生成
34 hr = CoCreateInstance(CLSID_DirectMusicLoader, NULL,
35 CLSCTX_INPROC, IID_IDirectMusicLoader8, dx_lpDMLoader)
36 If hr Then
37 dx_InitDMusic=0
38 Exit Function
39 End If
40
41 dx_InitDMusic=1
42End Function
43
44' DirectMusicを終了するための関数
45Sub dx_QuitDMusic()
46 If dx_lpDMLoader Then dx_lpDMLoader->Release()
47 If dx_lpDMPerformance Then
48 'すべてのサウンドを停止
49 dx_lpDMPerformance->Stop(NULL, NULL, 0, 0)
50
51 'パフォーマンスオブジェクトを閉じる
52 dx_lpDMPerformance->CloseDown()
53
54 '解放
55 dx_lpDMPerformance->Release()
56 End If
57End Sub
58
59
60'------------------------
61' サウンド再生用のクラス
62'------------------------
63
64'エフェクト フラグ
65Enum EFFECT_FLAGS
66 NO_EFFECT = 0 'エフェクト無し
67 EFFECT_STANDARD_CHORUS = 1 'コーラス
68 EFFECT_STANDARD_COMPRESSOR = 2 'コンプレッサー
69 EFFECT_STANDARD_DISTORTION = 3 'ディストーション
70 EFFECT_STANDARD_ECHO = 4 'エコー
71 EFFECT_STANDARD_FLANGER = 5 'フランジ
72 EFFECT_STANDARD_GARGLE = 6 'ガーグル
73 EFFECT_STANDARD_I3DL2REVERB = 7 'Interactive 3D Level 2 リバーブ
74 EFFECT_STANDARD_PARAMEQ = 8 'パラメトリック イコライザ
75 EFFECT_WAVES_REVERB = 9 'Waves リバーブ
76End Enum
77
78Class CAudio
79Protected
80 lpDMSegment As *IDirectMusicSegment8 'セグメント
81 lpDMAudioPath As *IDirectMusicAudioPath8 'オーディオパス
82 lpDSBuffer As LPDIRECTSOUNDBUFFER8 'サウンドバッファ
83
84 dwFlags As DWord
85 dwLength As DWord 'サウンド長(ミリ秒)
86
87 Function LoadAndSetting(pszFileName As *Char) As Long
88 Dim hr As DWord
89
90 Release()
91
92 'サウンドの長さをdwLengthへ格納(ミリ秒単位)
93 Dim mop As MCI_OPEN_PARMS
94 Dim msep As MCI_SET_PARMS
95 Dim msp As MCI_STATUS_PARMS
96 mop.dwCallback=hMainWnd As DWord
97 mop.lpstrElementName=pszFileName
98 msep.dwTimeFormat=MCI_FORMAT_MILLISECONDS
99 mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,mop)
100 mciSendCommand(mop.wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,msep)
101 msp.dwItem=MCI_STATUS_LENGTH
102 mciSendCommand(mop.wDeviceID,MCI_STATUS,MCI_STATUS_ITEM,msp)
103 dwLength=msp.dwReturn
104 mciSendCommand(mop.wDeviceID,MCI_CLOSE,MCI_WAIT,ByVal VarPtr(hr))
105
106 'Unicodeに変換
107 Dim wstrFileName[MAX_PATH-1] As WCHAR
108 MultiByteToWideChar(CP_ACP, 0, pszFileName, -1, wstrFileName, MAX_PATH)
109
110 hr = dx_lpDMLoader->LoadObjectFromFile(CLSID_DirectMusicSegment,
111 IID_IDirectMusicSegment8, wstrFileName, VarPtr(lpDMSegment))
112 If hr Then
113 LoadAndSetting=0
114 Exit Function
115 End If
116
117 'バンドのダウンロード
118 hr = lpDMSegment->Download(dx_lpDMPerformance)
119 If hr Then
120 LoadAndSetting=0
121 Exit Function
122 End If
123
124 LoadAndSetting=1
125 End Function
126
127Private
128 Sub Release()
129 If lpDMSegment Then
130 Stop()
131
132 lpDMSegment->Unload(dx_lpDMPerformance)
133
134 If lpDSBuffer Then lpDSBuffer->Release()
135 If lpDMAudioPath Then lpDMAudioPath->Release()
136 lpDMSegment->Release()
137 End If
138 End Sub
139
140Public
141 'コンストラクタ
142 Sub CAudio()
143 lpDMSegment=0
144 lpDMAudioPath=0
145 lpDSBuffer=0
146 dwFlags=0
147 End Sub
148
149 'デストラクタ
150 Sub ~CAudio()
151 Release()
152 End Sub
153
154 'ファイルパスを指定
155 Function Load(pszFileName As *Char) As Long
156 Dim hr As DWord
157
158 hr=LoadAndSetting(pszFileName)
159 If hr=FALSE Then
160 Load=FALSE
161 Exit Function
162 End If
163
164 'オーディオパスの生成
165 hr = dx_lpDMPerformance->CreateStandardAudioPath(DMUS_APATH_DYNAMIC_STEREO, 64, FALSE, VarPtr(lpDMAudioPath))
166 If hr Then
167 Load=0
168 Exit Function
169 End If
170
171 'サウンドバッファの取得
172 hr = lpDMAudioPath->GetObjectInPath(DMUS_PCHANNEL_ALL, DMUS_PATH_BUFFER, 0,
173 GUID_NULL, 0, IID_IDirectSoundBuffer8, VarPtr(lpDSBuffer))
174 If hr Then
175 Load=0
176 Exit Function
177 End If
178
179 ' オーディオパスのアクティブ化
180 lpDMAudioPath->Activate(TRUE)
181
182 Load=1
183 End Function
184
185 '再生
186 Function Play() As Long
187 Dim hr As DWord
188
189 'セグメントの再生
190 hr = dx_lpDMPerformance->PlaySegmentEx(lpDMSegment,
191 NULL,
192 NULL,
193 dwFlags,
194 0,
195 NULL,
196 NULL,
197 lpDMAudioPath)
198 If hr Then
199 Play=FALSE
200 Exit Function
201 End If
202
203 Play=TRUE
204 End Function
205
206 '停止
207 Function Stop() As Long
208 Dim hr As Long
209
210 'セグメントの停止
211 hr=dx_lpDMPerformance->StopEx(lpDMSegment, 0, 0)
212
213 If hr=S_OK Then Stop=TRUE Else Stop=FALSE
214 End Function
215
216 '長さを取得
217 Function GetLength() As DWord
218 GetLength=dwLength
219 End Function
220
221 'プライマリセグメントにセット
222 Sub SetPrimary()
223 dwFlags=0
224 End Sub
225
226 'セカンダリセグメントにセット
227 Sub SetSecondary()
228 dwFlags=DMUS_SEGF_SECONDARY
229 End Sub
230
231 Function SetEffect(EffectFlag As EFFECT_FLAGS) As Long
232 Dim hr As DWord
233
234 If EffectFlag=NO_EFFECT Then
235 lpDSBuffer->SetFX(0, NULL, NULL)
236
237 SetEffect=1
238 Exit Function
239 End If
240
241 'エフェクトの設定
242 Dim effect As DSEFFECTDESC
243 effect.dwSize = SizeOf(DSEFFECTDESC)
244 effect.dwFlags = 0
245 Select Case EffectFlag
246 Case EFFECT_STANDARD_CHORUS
247 effect.guidDSFXClass = GUID_DSFX_STANDARD_CHORUS
248 Case EFFECT_STANDARD_COMPRESSOR
249 effect.guidDSFXClass = GUID_DSFX_STANDARD_COMPRESSOR
250 Case EFFECT_STANDARD_DISTORTION
251 effect.guidDSFXClass = GUID_DSFX_STANDARD_DISTORTION
252 Case EFFECT_STANDARD_ECHO
253 effect.guidDSFXClass = GUID_DSFX_STANDARD_ECHO
254 Case EFFECT_STANDARD_FLANGER
255 effect.guidDSFXClass = GUID_DSFX_STANDARD_FLANGER
256 Case EFFECT_STANDARD_GARGLE
257 effect.guidDSFXClass = GUID_DSFX_STANDARD_GARGLE
258 Case EFFECT_STANDARD_I3DL2REVERB
259 effect.guidDSFXClass = GUID_DSFX_STANDARD_I3DL2REVERB
260 Case EFFECT_STANDARD_PARAMEQ
261 effect.guidDSFXClass = GUID_DSFX_STANDARD_PARAMEQ
262 Case EFFECT_WAVES_REVERB
263 effect.guidDSFXClass = GUID_DSFX_WAVES_REVERB
264 End Select
265 effect.dwReserved1 = 0
266 effect.dwReserved2 = 0
267 lpDSBuffer->SetFX(1, VarPtr(effect), NULL)
268
269 SetEffect=1
270 End Function
271
272 'リピート回数を設定
273 Function SetRepeats(dwRepeats As DWord) As Long
274 If lpDMSegment->SetRepeats(dwRepeats)=S_OK Then
275 SetRepeats=TRUE
276 Else
277 SetRepeats=FALSE
278 End If
279 End Function
280
281 'シーク
282 Sub Seek(dwSeekTime As DWord) As Long
283 End Sub
284
285 'プレイ中であるかどうかを調べる
286 Function IsPlaying() As Long
287 If dx_lpDMPerformance->IsPlaying(lpDMSegment,NULL)=S_OK Then
288 IsPlaying=TRUE
289 Else
290 IsPlaying=FALSE
291 End If
292 End Function
293
294End Class
295
296'3D空間内音源
297Class CAudio3D
298 Inherits CAudio
299
300 lpDS3DBuffer As LPDIRECTSOUND3DBUFFER8 '3D空間内の音源
301
302Public
303 Sub CAudio3D()
304 CAudio()
305
306 lpDS3DBuffer=0
307 End Sub
308 Sub ~CAudio3D()
309 If lpDS3DBuffer Then lpDS3DBuffer->Release()
310 End Sub
311
312 'ファイルパスを指定
313 Function Load(pszFileName As BytePtr) As Long
314 Dim hr As DWord
315
316 hr=LoadAndSetting(pszFileName)
317 If hr=FALSE Then
318 Load=FALSE
319 Exit Function
320 End If
321
322 'オーディオパスの生成
323 hr = dx_lpDMPerformance->CreateStandardAudioPath(DMUS_APATH_DYNAMIC_3D, 64, FALSE, VarPtr(lpDMAudioPath))
324 If hr Then
325 Load=0
326 Exit Function
327 End If
328
329 '3Dサウンドバッファの取得
330 hr = lpDMAudioPath->GetObjectInPath(DMUS_PCHANNEL_ALL, DMUS_PATH_BUFFER, 0,
331 GUID_NULL, 0, IID_IDirectSound3DBuffer8, VarPtr(lpDS3DBuffer))
332 If hr Then
333 Load=0
334 Exit Function
335 End If
336
337 'サウンドバッファの取得
338 hr = lpDMAudioPath->GetObjectInPath(DMUS_PCHANNEL_ALL, DMUS_PATH_BUFFER, 0,
339 GUID_NULL, 0, IID_IDirectSoundBuffer8, VarPtr(lpDSBuffer))
340 If hr Then
341 Load=0
342 Exit Function
343 End If
344
345 ' オーディオパスのアクティブ化
346 lpDMAudioPath->Activate(TRUE)
347
348 Load=1
349 End Function
350
351 Function SetEffect(EffectFlag As EFFECT_FLAGS) As Long
352 'CAudio3Dではエフェクトをサポートしない
353 SetEffect=0
354 End Function
355
356 Function GetFrequency(lpdwFrequency As *DWord) As Long
357 Dim hr As Long
358 hr=lpDSBuffer->GetFrequency(lpdwFrequency)
359 If hr=S_OK Then
360 GetFrequency=TRUE
361 Else
362 GetFrequency=FALSE
363 End If
364 End Function
365
366 Function SetFrequency(dwFrequency As DWord) As Long
367 Dim hr As Long
368 hr=lpDSBuffer->SetFrequency(dwFrequency)
369 If hr=S_OK Then
370 SetFrequency=TRUE
371 Else
372 SetFrequency=FALSE
373 End If
374 End Function
375
376
377 '--------------------------
378 ' 音源に関するメソッド
379 '--------------------------
380
381 '最短距離の設定(この距離を超えると減衰が始まる)
382 Function SetMinDistance(distance As Single) As Long
383 Dim hr As Long
384 hr=lpDS3DBuffer->SetMinDistance(distance, DS3D_DEFERRED)
385 If hr=S_OK Then
386 SetMinDistance=TRUE
387 Else
388 SetMinDistance=FALSE
389 End If
390 End Function
391
392 '最長距離の設定(聞こえる音量が0になり、減衰の計算がストップする距離)
393 Function SetMaxDistance(distance As Single) As Long
394 Dim hr As Long
395 hr=lpDS3DBuffer->SetMaxDistance(distance, DS3D_DEFERRED)
396 If hr=S_OK Then
397 SetMaxDistance=TRUE
398 Else
399 SetMaxDistance=FALSE
400 End If
401 End Function
402
403 '音源の位置の設定
404 Function SetPosition(x As Single, y As Single, z As Single) As Long
405 Dim hr As Long
406 hr=lpDS3DBuffer->SetPosition(x,y,z,DS3D_DEFERRED)
407 If hr=S_OK Then
408 SetPosition=TRUE
409 Else
410 SetPosition=FALSE
411 End If
412 End Function
413
414 '音源の速度の設定
415 Function SetVelocity(x As Single, y As Single, z As Single) As Long
416 Dim hr As Long
417 hr=lpDS3DBuffer->SetVelocity(x,y,z,DS3D_DEFERRED)
418 If hr=S_OK Then
419 SetVelocity=TRUE
420 Else
421 SetVelocity=FALSE
422 End If
423 End Function
424
425 '音源のコーン角度の設定
426 Function SetConeAngles(dwInsideAngle As DWord, dwOutsideAngle As DWord) As Long
427 Dim hr As Long
428 hr=lpDS3DBuffer->SetConeAngles(dwInsideAngle,dwOutsideAngle,DS3D_DEFERRED)
429 If hr=S_OK Then
430 SetConeAngles=TRUE
431 Else
432 SetConeAngles=FALSE
433 End If
434 End Function
435
436 '音源のコーン方向の設定
437 Function SetConeOrientation(x As Single, y As Single, z As Single) As Long
438 Dim hr As Long
439 hr=lpDS3DBuffer->SetConeOrientation(x,y,z,DS3D_DEFERRED)
440 If hr=S_OK Then
441 SetConeOrientation=TRUE
442 Else
443 SetConeOrientation=FALSE
444 End If
445 End Function
446
447 '音源の外部角度の外側ボリュームの設定(1/100 dB 単位で指定)
448 Function SetConeOutsideVolume(ConeOutsideVolume As Long)
449 Dim hr As Long
450 hr=lpDS3DBuffer->SetConeOutsideVolume(ConeOutsideVolume,DS3D_DEFERRED)
451 If hr=S_OK Then
452 SetConeOutsideVolume=TRUE
453 Else
454 SetConeOutsideVolume=FALSE
455 End If
456 End Function
457End Class
458
459'リスナー
460Class CListener
461 lpDS3DListener As LPDIRECTSOUND3DLISTENER8
462Public
463 Sub CListener()
464 Dim hr As Long
465 Dim lpDMAudioPath As *IDirectMusicAudioPath8 'オーディオパス
466
467 'オーディオパスの生成
468 hr = dx_lpDMPerformance->CreateStandardAudioPath(DMUS_APATH_DYNAMIC_3D, 64, FALSE, VarPtr(lpDMAudioPath))
469 If hr Then
470 lpDMAudioPath=0
471 Exit Sub
472 End If
473
474 'リスナーの取得
475 hr = lpDMAudioPath->GetObjectInPath(0, DMUS_PATH_PRIMARY_BUFFER, 0,
476 GUID_NULL, 0, IID_IDirectSound3DListener8, VarPtr(lpDS3DListener))
477 If hr Then
478 lpDS3DListener=0
479 Exit Sub
480 End If
481
482 'オーディオパスを破棄
483 lpDMAudioPath->Release()
484 End Sub
485 Sub ~CListener()
486 If lpDS3DListener Then lpDS3DListener->Release()
487 End Sub
488
489 'リスナーの位置の設定
490 Function SetPosition(x As Single, y As Single, z As Single) As Long
491 Dim hr As Long
492 hr=lpDS3DListener->SetPosition(x,y,z,DS3D_DEFERRED)
493 If hr=S_OK Then
494 SetPosition=TRUE
495 Else
496 SetPosition=FALSE
497 End If
498 End Function
499
500 'リスナーの速度の設定
501 Function SetVelocity(x As Single, y As Single, z As Single) As Long
502 Dim hr As Long
503 hr=lpDS3DListener->SetVelocity(x,y,z,DS3D_DEFERRED)
504 If hr=S_OK Then
505 SetVelocity=TRUE
506 Else
507 SetVelocity=FALSE
508 End If
509 End Function
510
511 'リスナーの方向の設定
512 Function SetOrientation(FrontX As Single, FrontY As Single, FrontZ As Single, TopX As Single, TopY As Single, TopZ As Single) As Long
513 Dim hr As Long
514 hr=lpDS3DListener->SetOrientation(
515 FrontX,FrontY,FrontZ,
516 TopX,TopY,TopZ,
517 DS3D_DEFERRED)
518 If hr=S_OK Then
519 SetOrientation=TRUE
520 Else
521 SetOrientation=FALSE
522 End If
523 End Function
524
525 'リスナー及び音源の状況を更新する
526 Function CommitSettings() As BOOL
527 Dim hr As Long
528 hr=lpDS3DListener->CommitDeferredSettings()
529 If hr=S_OK Then
530 CommitSettings=TRUE
531 Else
532 CommitSettings=FALSE
533 End If
534 End Function
535End Class
Note: See TracBrowser for help on using the repository browser.