ホーム › Media.Audio.DirectSound › DS3DBUFFER
DS3DBUFFER
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| dwSize | DWORD | 4 | +0 | +0 | この構造体のバイトサイズ。呼び出し前に設定する。 |
| vPosition | D3DVECTOR | 12 | +4 | +4 | 音源の3D空間内の位置ベクトル。 |
| vVelocity | D3DVECTOR | 12 | +16 | +16 | 音源の速度ベクトル(ドップラー効果計算用)。 |
| dwInsideConeAngle | DWORD | 4 | +28 | +28 | 音量コーンの内側角度(度)。この内側は最大音量。 |
| dwOutsideConeAngle | DWORD | 4 | +32 | +32 | 音量コーンの外側角度(度)。この外側はlConeOutsideVolume。 |
| vConeOrientation | D3DVECTOR | 12 | +36 | +36 | 音量コーンの向きを示す方向ベクトル。 |
| lConeOutsideVolume | INT | 4 | +48 | +48 | コーン外側の音量減衰量(符号付き、100分の1dB単位)。 |
| flMinDistance | FLOAT | 4 | +52 | +52 | これより近づいても音量が増えない最小距離。 |
| flMaxDistance | FLOAT | 4 | +56 | +56 | これより遠ざかっても音量が減らない最大距離。 |
| dwMode | DWORD | 4 | +60 | +60 | 3D処理モード(DS3DMODE_NORMAL/HEADRELATIVE/DISABLE)。 |
各言語での定義
#include <windows.h>
// D3DVECTOR (x64 12 / x86 12 バイト)
typedef struct D3DVECTOR {
FLOAT x;
FLOAT y;
FLOAT z;
} D3DVECTOR;
// DS3DBUFFER (x64 64 / x86 64 バイト)
typedef struct DS3DBUFFER {
DWORD dwSize;
D3DVECTOR vPosition;
D3DVECTOR vVelocity;
DWORD dwInsideConeAngle;
DWORD dwOutsideConeAngle;
D3DVECTOR vConeOrientation;
INT lConeOutsideVolume;
FLOAT flMinDistance;
FLOAT flMaxDistance;
DWORD dwMode;
} DS3DBUFFER;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct D3DVECTOR
{
public float x;
public float y;
public float z;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DS3DBUFFER
{
public uint dwSize;
public D3DVECTOR vPosition;
public D3DVECTOR vVelocity;
public uint dwInsideConeAngle;
public uint dwOutsideConeAngle;
public D3DVECTOR vConeOrientation;
public int lConeOutsideVolume;
public float flMinDistance;
public float flMaxDistance;
public uint dwMode;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure D3DVECTOR
Public x As Single
Public y As Single
Public z As Single
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure DS3DBUFFER
Public dwSize As UInteger
Public vPosition As D3DVECTOR
Public vVelocity As D3DVECTOR
Public dwInsideConeAngle As UInteger
Public dwOutsideConeAngle As UInteger
Public vConeOrientation As D3DVECTOR
Public lConeOutsideVolume As Integer
Public flMinDistance As Single
Public flMaxDistance As Single
Public dwMode As UInteger
End Structureimport ctypes
from ctypes import wintypes
class D3DVECTOR(ctypes.Structure):
_fields_ = [
("x", ctypes.c_float),
("y", ctypes.c_float),
("z", ctypes.c_float),
]
class DS3DBUFFER(ctypes.Structure):
_fields_ = [
("dwSize", wintypes.DWORD),
("vPosition", D3DVECTOR),
("vVelocity", D3DVECTOR),
("dwInsideConeAngle", wintypes.DWORD),
("dwOutsideConeAngle", wintypes.DWORD),
("vConeOrientation", D3DVECTOR),
("lConeOutsideVolume", ctypes.c_int),
("flMinDistance", ctypes.c_float),
("flMaxDistance", ctypes.c_float),
("dwMode", wintypes.DWORD),
]#[repr(C)]
pub struct D3DVECTOR {
pub x: f32,
pub y: f32,
pub z: f32,
}
#[repr(C)]
pub struct DS3DBUFFER {
pub dwSize: u32,
pub vPosition: D3DVECTOR,
pub vVelocity: D3DVECTOR,
pub dwInsideConeAngle: u32,
pub dwOutsideConeAngle: u32,
pub vConeOrientation: D3DVECTOR,
pub lConeOutsideVolume: i32,
pub flMinDistance: f32,
pub flMaxDistance: f32,
pub dwMode: u32,
}import "golang.org/x/sys/windows"
type D3DVECTOR struct {
x float32
y float32
z float32
}
type DS3DBUFFER struct {
dwSize uint32
vPosition D3DVECTOR
vVelocity D3DVECTOR
dwInsideConeAngle uint32
dwOutsideConeAngle uint32
vConeOrientation D3DVECTOR
lConeOutsideVolume int32
flMinDistance float32
flMaxDistance float32
dwMode uint32
}type
D3DVECTOR = record
x: Single;
y: Single;
z: Single;
end;
DS3DBUFFER = record
dwSize: DWORD;
vPosition: D3DVECTOR;
vVelocity: D3DVECTOR;
dwInsideConeAngle: DWORD;
dwOutsideConeAngle: DWORD;
vConeOrientation: D3DVECTOR;
lConeOutsideVolume: Integer;
flMinDistance: Single;
flMaxDistance: Single;
dwMode: DWORD;
end;const D3DVECTOR = extern struct {
x: f32,
y: f32,
z: f32,
};
const DS3DBUFFER = extern struct {
dwSize: u32,
vPosition: D3DVECTOR,
vVelocity: D3DVECTOR,
dwInsideConeAngle: u32,
dwOutsideConeAngle: u32,
vConeOrientation: D3DVECTOR,
lConeOutsideVolume: i32,
flMinDistance: f32,
flMaxDistance: f32,
dwMode: u32,
};type
D3DVECTOR {.bycopy.} = object
x: float32
y: float32
z: float32
DS3DBUFFER {.bycopy.} = object
dwSize: uint32
vPosition: D3DVECTOR
vVelocity: D3DVECTOR
dwInsideConeAngle: uint32
dwOutsideConeAngle: uint32
vConeOrientation: D3DVECTOR
lConeOutsideVolume: int32
flMinDistance: float32
flMaxDistance: float32
dwMode: uint32struct D3DVECTOR
{
float x;
float y;
float z;
}
struct DS3DBUFFER
{
uint dwSize;
D3DVECTOR vPosition;
D3DVECTOR vVelocity;
uint dwInsideConeAngle;
uint dwOutsideConeAngle;
D3DVECTOR vConeOrientation;
int lConeOutsideVolume;
float flMinDistance;
float flMaxDistance;
uint dwMode;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; DS3DBUFFER サイズ: 64 バイト(x64)
dim st, 16 ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; dwSize : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; vPosition : D3DVECTOR (+4, 12byte) varptr(st)+4 を基点に操作(12byte:入れ子/配列)
; vVelocity : D3DVECTOR (+16, 12byte) varptr(st)+16 を基点に操作(12byte:入れ子/配列)
; dwInsideConeAngle : DWORD (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; dwOutsideConeAngle : DWORD (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; vConeOrientation : D3DVECTOR (+36, 12byte) varptr(st)+36 を基点に操作(12byte:入れ子/配列)
; lConeOutsideVolume : INT (+48, 4byte) st.12 = 値 / 値 = st.12 (lpoke/lpeek も可)
; flMinDistance : FLOAT (+52, 4byte) st.13 = 値 / 値 = st.13 (lpoke/lpeek も可)
; flMaxDistance : FLOAT (+56, 4byte) st.14 = 値 / 値 = st.14 (lpoke/lpeek も可)
; dwMode : DWORD (+60, 4byte) st.15 = 値 / 値 = st.15 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global D3DVECTOR
#field float x
#field float y
#field float z
#endstruct
#defstruct global DS3DBUFFER
#field int dwSize
#field D3DVECTOR vPosition
#field D3DVECTOR vVelocity
#field int dwInsideConeAngle
#field int dwOutsideConeAngle
#field D3DVECTOR vConeOrientation
#field int lConeOutsideVolume
#field float flMinDistance
#field float flMaxDistance
#field int dwMode
#endstruct
stdim st, DS3DBUFFER ; NSTRUCT 変数を確保
st->dwSize = 100
mes "dwSize=" + st->dwSize