Win32 API 日本語リファレンス
ホームMedia.KernelStreaming › KSDATARANGE_MUSIC

KSDATARANGE_MUSIC

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

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

フィールド

フィールドサイズx64x86説明
DataRangeKSDATAFORMAT64+0+0基底となるKSDATAFORMATデータ範囲記述子である。
TechnologyGUID16+64+64音源技術(FM・WaveTableなど)を識別するGUIDである。
ChannelsDWORD4+80+80同時発音可能なチャンネル数を示す。
NotesDWORD4+84+84同時発音可能なノート(音符)数を示す。
ChannelMaskDWORD4+88+88使用可能なチャンネルを示すビットマスクである。

各言語での定義

#include <windows.h>

// KSDATAFORMAT  (x64 64 / x86 64 バイト)
typedef struct KSDATAFORMAT {
    _Anonymous_e__Struct Anonymous;
    LONGLONG Alignment;
} KSDATAFORMAT;

// KSDATARANGE_MUSIC  (x64 96 / x86 96 バイト)
typedef struct KSDATARANGE_MUSIC {
    KSDATAFORMAT DataRange;
    GUID Technology;
    DWORD Channels;
    DWORD Notes;
    DWORD ChannelMask;
} KSDATARANGE_MUSIC;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct KSDATAFORMAT
{
    public _Anonymous_e__Struct Anonymous;
    public long Alignment;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct KSDATARANGE_MUSIC
{
    public KSDATAFORMAT DataRange;
    public Guid Technology;
    public uint Channels;
    public uint Notes;
    public uint ChannelMask;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure KSDATAFORMAT
    Public Anonymous As _Anonymous_e__Struct
    Public Alignment As Long
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure KSDATARANGE_MUSIC
    Public DataRange As KSDATAFORMAT
    Public Technology As Guid
    Public Channels As UInteger
    Public Notes As UInteger
    Public ChannelMask As UInteger
End Structure
import ctypes
from ctypes import wintypes

class KSDATAFORMAT(ctypes.Structure):
    _fields_ = [
        ("Anonymous", _Anonymous_e__Struct),
        ("Alignment", ctypes.c_longlong),
    ]

class KSDATARANGE_MUSIC(ctypes.Structure):
    _fields_ = [
        ("DataRange", KSDATAFORMAT),
        ("Technology", GUID),
        ("Channels", wintypes.DWORD),
        ("Notes", wintypes.DWORD),
        ("ChannelMask", wintypes.DWORD),
    ]
#[repr(C)]
pub struct KSDATAFORMAT {
    pub Anonymous: _Anonymous_e__Struct,
    pub Alignment: i64,
}

#[repr(C)]
pub struct KSDATARANGE_MUSIC {
    pub DataRange: KSDATAFORMAT,
    pub Technology: GUID,
    pub Channels: u32,
    pub Notes: u32,
    pub ChannelMask: u32,
}
import "golang.org/x/sys/windows"

type KSDATAFORMAT struct {
	Anonymous _Anonymous_e__Struct
	Alignment int64
}

type KSDATARANGE_MUSIC struct {
	DataRange KSDATAFORMAT
	Technology windows.GUID
	Channels uint32
	Notes uint32
	ChannelMask uint32
}
type
  KSDATAFORMAT = record
    Anonymous: _Anonymous_e__Struct;
    Alignment: Int64;
  end;

  KSDATARANGE_MUSIC = record
    DataRange: KSDATAFORMAT;
    Technology: TGUID;
    Channels: DWORD;
    Notes: DWORD;
    ChannelMask: DWORD;
  end;
const KSDATAFORMAT = extern struct {
    Anonymous: _Anonymous_e__Struct,
    Alignment: i64,
};

const KSDATARANGE_MUSIC = extern struct {
    DataRange: KSDATAFORMAT,
    Technology: GUID,
    Channels: u32,
    Notes: u32,
    ChannelMask: u32,
};
type
  KSDATAFORMAT {.bycopy.} = object
    Anonymous: _Anonymous_e__Struct
    Alignment: int64

  KSDATARANGE_MUSIC {.bycopy.} = object
    DataRange: KSDATAFORMAT
    Technology: GUID
    Channels: uint32
    Notes: uint32
    ChannelMask: uint32
struct KSDATAFORMAT
{
    _Anonymous_e__Struct Anonymous;
    long Alignment;
}

struct KSDATARANGE_MUSIC
{
    KSDATAFORMAT DataRange;
    GUID Technology;
    uint Channels;
    uint Notes;
    uint ChannelMask;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; KSDATARANGE_MUSIC サイズ: 96 バイト(x64)
dim st, 24    ; 4byte整数×24(構造体サイズ 96 / 4 切り上げ)
; DataRange : KSDATAFORMAT (+0, 64byte)  varptr(st)+0 を基点に操作(64byte:入れ子/配列)
; Technology : GUID (+64, 16byte)  varptr(st)+64 を基点に操作(16byte:入れ子/配列)
; Channels : DWORD (+80, 4byte)  st.20 = 値  /  値 = st.20   (lpoke/lpeek も可)
; Notes : DWORD (+84, 4byte)  st.21 = 値  /  値 = st.21   (lpoke/lpeek も可)
; ChannelMask : DWORD (+88, 4byte)  st.22 = 値  /  値 = st.22   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global GUID, pack=1
    #field int Data1
    #field short Data2
    #field short Data3
    #field byte Data4 8
#endstruct

#defstruct global KSDATARANGE_MUSIC
    #field byte DataRange 64
    #field GUID Technology
    #field int Channels
    #field int Notes
    #field int ChannelMask
#endstruct

stdim st, KSDATARANGE_MUSIC        ; NSTRUCT 変数を確保
st->Channels = 100
mes "Channels=" + st->Channels
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。