Win32 API 日本語リファレンス
ホームMedia.Audio.DirectSound › DS3DLISTENER

DS3DLISTENER

構造体
サイズx64: 64 バイト / x86: 64 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
dwSizeDWORD4+0+0この構造体のバイトサイズ。呼び出し前に設定する。
vPositionD3DVECTOR12+4+4リスナー(聴取者)の3D空間内の位置ベクトル。
vVelocityD3DVECTOR12+16+16リスナーの速度ベクトル(ドップラー効果計算用)。
vOrientFrontD3DVECTOR12+28+28リスナーの正面方向ベクトル。
vOrientTopD3DVECTOR12+40+40リスナーの頭頂方向(上向き)ベクトル。
flDistanceFactorFLOAT4+52+52距離係数。1メートルが何単位に相当するかを表す。
flRolloffFactorFLOAT4+56+56距離減衰係数。値が大きいほど距離による減衰が強い。
flDopplerFactorFLOAT4+60+60ドップラー効果係数。1.0が実世界、大きいほど効果が強調される。

各言語での定義

#include <windows.h>

// D3DVECTOR  (x64 12 / x86 12 バイト)
typedef struct D3DVECTOR {
    FLOAT x;
    FLOAT y;
    FLOAT z;
} D3DVECTOR;

// DS3DLISTENER  (x64 64 / x86 64 バイト)
typedef struct DS3DLISTENER {
    DWORD dwSize;
    D3DVECTOR vPosition;
    D3DVECTOR vVelocity;
    D3DVECTOR vOrientFront;
    D3DVECTOR vOrientTop;
    FLOAT flDistanceFactor;
    FLOAT flRolloffFactor;
    FLOAT flDopplerFactor;
} DS3DLISTENER;
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 DS3DLISTENER
{
    public uint dwSize;
    public D3DVECTOR vPosition;
    public D3DVECTOR vVelocity;
    public D3DVECTOR vOrientFront;
    public D3DVECTOR vOrientTop;
    public float flDistanceFactor;
    public float flRolloffFactor;
    public float flDopplerFactor;
}
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 DS3DLISTENER
    Public dwSize As UInteger
    Public vPosition As D3DVECTOR
    Public vVelocity As D3DVECTOR
    Public vOrientFront As D3DVECTOR
    Public vOrientTop As D3DVECTOR
    Public flDistanceFactor As Single
    Public flRolloffFactor As Single
    Public flDopplerFactor As Single
End Structure
import ctypes
from ctypes import wintypes

class D3DVECTOR(ctypes.Structure):
    _fields_ = [
        ("x", ctypes.c_float),
        ("y", ctypes.c_float),
        ("z", ctypes.c_float),
    ]

class DS3DLISTENER(ctypes.Structure):
    _fields_ = [
        ("dwSize", wintypes.DWORD),
        ("vPosition", D3DVECTOR),
        ("vVelocity", D3DVECTOR),
        ("vOrientFront", D3DVECTOR),
        ("vOrientTop", D3DVECTOR),
        ("flDistanceFactor", ctypes.c_float),
        ("flRolloffFactor", ctypes.c_float),
        ("flDopplerFactor", ctypes.c_float),
    ]
#[repr(C)]
pub struct D3DVECTOR {
    pub x: f32,
    pub y: f32,
    pub z: f32,
}

#[repr(C)]
pub struct DS3DLISTENER {
    pub dwSize: u32,
    pub vPosition: D3DVECTOR,
    pub vVelocity: D3DVECTOR,
    pub vOrientFront: D3DVECTOR,
    pub vOrientTop: D3DVECTOR,
    pub flDistanceFactor: f32,
    pub flRolloffFactor: f32,
    pub flDopplerFactor: f32,
}
import "golang.org/x/sys/windows"

type D3DVECTOR struct {
	x float32
	y float32
	z float32
}

type DS3DLISTENER struct {
	dwSize uint32
	vPosition D3DVECTOR
	vVelocity D3DVECTOR
	vOrientFront D3DVECTOR
	vOrientTop D3DVECTOR
	flDistanceFactor float32
	flRolloffFactor float32
	flDopplerFactor float32
}
type
  D3DVECTOR = record
    x: Single;
    y: Single;
    z: Single;
  end;

  DS3DLISTENER = record
    dwSize: DWORD;
    vPosition: D3DVECTOR;
    vVelocity: D3DVECTOR;
    vOrientFront: D3DVECTOR;
    vOrientTop: D3DVECTOR;
    flDistanceFactor: Single;
    flRolloffFactor: Single;
    flDopplerFactor: Single;
  end;
const D3DVECTOR = extern struct {
    x: f32,
    y: f32,
    z: f32,
};

const DS3DLISTENER = extern struct {
    dwSize: u32,
    vPosition: D3DVECTOR,
    vVelocity: D3DVECTOR,
    vOrientFront: D3DVECTOR,
    vOrientTop: D3DVECTOR,
    flDistanceFactor: f32,
    flRolloffFactor: f32,
    flDopplerFactor: f32,
};
type
  D3DVECTOR {.bycopy.} = object
    x: float32
    y: float32
    z: float32

  DS3DLISTENER {.bycopy.} = object
    dwSize: uint32
    vPosition: D3DVECTOR
    vVelocity: D3DVECTOR
    vOrientFront: D3DVECTOR
    vOrientTop: D3DVECTOR
    flDistanceFactor: float32
    flRolloffFactor: float32
    flDopplerFactor: float32
struct D3DVECTOR
{
    float x;
    float y;
    float z;
}

struct DS3DLISTENER
{
    uint dwSize;
    D3DVECTOR vPosition;
    D3DVECTOR vVelocity;
    D3DVECTOR vOrientFront;
    D3DVECTOR vOrientTop;
    float flDistanceFactor;
    float flRolloffFactor;
    float flDopplerFactor;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; DS3DLISTENER サイズ: 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:入れ子/配列)
; vOrientFront : D3DVECTOR (+28, 12byte)  varptr(st)+28 を基点に操作(12byte:入れ子/配列)
; vOrientTop : D3DVECTOR (+40, 12byte)  varptr(st)+40 を基点に操作(12byte:入れ子/配列)
; flDistanceFactor : FLOAT (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; flRolloffFactor : FLOAT (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; flDopplerFactor : FLOAT (+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 DS3DLISTENER
    #field int dwSize
    #field D3DVECTOR vPosition
    #field D3DVECTOR vVelocity
    #field D3DVECTOR vOrientFront
    #field D3DVECTOR vOrientTop
    #field float flDistanceFactor
    #field float flRolloffFactor
    #field float flDopplerFactor
#endstruct

stdim st, DS3DLISTENER        ; NSTRUCT 変数を確保
st->dwSize = 100
mes "dwSize=" + st->dwSize