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

WAVEOPENDESC

構造体
サイズx64: 44 バイト / x86: 24 バイトパッキング1

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

フィールド

フィールドサイズx64x86説明
hWaveHWAVE8/4+0+0オープンされた波形デバイスのハンドル(HWAVE)。
lpFormatWAVEFORMAT*8/4+8+4波形データの形式を記述するWAVEFORMAT構造体へのポインタ。
dwCallbackUINT_PTR8/4+16+8再生/録音通知を受け取るコールバック関数/ウィンドウ/イベントのハンドル。
dwInstanceUINT_PTR8/4+24+12コールバックへ渡されるユーザ定義のインスタンスデータ。
uMappedDeviceIDDWORD4+32+16波形マッパによって割り当てられた実デバイスのID。
dnDevNodeUINT_PTR8/4+36+20デバイスのデバイスノード(プラグアンドプレイ識別子)。

各言語での定義

#include <windows.h>

// WAVEOPENDESC  (x64 44 / x86 24 バイト)
#pragma pack(push, 1)
typedef struct WAVEOPENDESC {
    HWAVE hWave;
    WAVEFORMAT* lpFormat;
    UINT_PTR dwCallback;
    UINT_PTR dwInstance;
    DWORD uMappedDeviceID;
    UINT_PTR dnDevNode;
} WAVEOPENDESC;
#pragma pack(pop)
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct WAVEOPENDESC
{
    public IntPtr hWave;
    public IntPtr lpFormat;
    public UIntPtr dwCallback;
    public UIntPtr dwInstance;
    public uint uMappedDeviceID;
    public UIntPtr dnDevNode;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure WAVEOPENDESC
    Public hWave As IntPtr
    Public lpFormat As IntPtr
    Public dwCallback As UIntPtr
    Public dwInstance As UIntPtr
    Public uMappedDeviceID As UInteger
    Public dnDevNode As UIntPtr
End Structure
import ctypes
from ctypes import wintypes

class WAVEOPENDESC(ctypes.Structure):
    _pack_ = 1
    _fields_ = [
        ("hWave", ctypes.c_void_p),
        ("lpFormat", ctypes.c_void_p),
        ("dwCallback", ctypes.c_size_t),
        ("dwInstance", ctypes.c_size_t),
        ("uMappedDeviceID", wintypes.DWORD),
        ("dnDevNode", ctypes.c_size_t),
    ]
#[repr(C, packed(1))]
pub struct WAVEOPENDESC {
    pub hWave: *mut core::ffi::c_void,
    pub lpFormat: *mut core::ffi::c_void,
    pub dwCallback: usize,
    pub dwInstance: usize,
    pub uMappedDeviceID: u32,
    pub dnDevNode: usize,
}
import "golang.org/x/sys/windows"

type WAVEOPENDESC struct {
	hWave uintptr
	lpFormat uintptr
	dwCallback uintptr
	dwInstance uintptr
	uMappedDeviceID uint32
	dnDevNode uintptr
}
type
  WAVEOPENDESC = packed record
    hWave: Pointer;
    lpFormat: Pointer;
    dwCallback: NativeUInt;
    dwInstance: NativeUInt;
    uMappedDeviceID: DWORD;
    dnDevNode: NativeUInt;
  end;
const WAVEOPENDESC = extern struct {
    hWave: ?*anyopaque,
    lpFormat: ?*anyopaque,
    dwCallback: usize,
    dwInstance: usize,
    uMappedDeviceID: u32,
    dnDevNode: usize,
};
type
  WAVEOPENDESC {.packed.} = object
    hWave: pointer
    lpFormat: pointer
    dwCallback: uint
    dwInstance: uint
    uMappedDeviceID: uint32
    dnDevNode: uint
align(1)
struct WAVEOPENDESC
{
    void* hWave;
    void* lpFormat;
    size_t dwCallback;
    size_t dwInstance;
    uint uMappedDeviceID;
    size_t dnDevNode;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; WAVEOPENDESC サイズ: 24 バイト(x86)
dim st, 6    ; 4byte整数×6(構造体サイズ 24 / 4 切り上げ)
; hWave : HWAVE (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; lpFormat : WAVEFORMAT* (+4, 4byte)  varptr(st)+4 を基点に操作(4byte:入れ子/配列)
; dwCallback : UINT_PTR (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; dwInstance : UINT_PTR (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; uMappedDeviceID : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; dnDevNode : UINT_PTR (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WAVEOPENDESC サイズ: 44 バイト(x64)
dim st, 11    ; 4byte整数×11(構造体サイズ 44 / 4 切り上げ)
; hWave : HWAVE (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; lpFormat : WAVEFORMAT* (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; dwCallback : UINT_PTR (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; dwInstance : UINT_PTR (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; uMappedDeviceID : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; dnDevNode : UINT_PTR (+36, 8byte)  qpoke st,36,値 / qpeek(st,36)  ※IronHSPのみ。3.7/3.8は lpoke st,36,下位 : lpoke st,40,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global WAVEOPENDESC, pack=1
    #field intptr hWave
    #field intptr lpFormat
    #field intptr dwCallback
    #field intptr dwInstance
    #field int uMappedDeviceID
    #field intptr dnDevNode
#endstruct

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