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

ACMSTREAMHEADER

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

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

フィールド

フィールドサイズx64x86説明
cbStructDWORD4+0+0この構造体のサイズをバイト単位で示す。準備前に設定が必要である。
fdwStatusDWORD4+4+4ストリームヘッダーの状態フラグ(ACMSTREAMHEADER_STATUSF_*)を示す。
dwUserUINT_PTR8/4+8+8アプリケーションが自由に使えるユーザー定義データ。
pbSrcBYTE*8/4+16+12変換元データを格納するバッファへのポインター。
cbSrcLengthDWORD4+24+16変換元バッファの全長をバイト単位で示す。
cbSrcLengthUsedDWORD4+28+20実際に変換に使われた変換元データ長をバイト単位で返す。
dwSrcUserUINT_PTR8/4+32+24変換元に関連付けるユーザー定義データ。
pbDstBYTE*8/4+40+28変換先データを格納するバッファへのポインター。
cbDstLengthDWORD4+48+32変換先バッファの全長をバイト単位で示す。
cbDstLengthUsedDWORD4+52+36実際に書き込まれた変換先データ長をバイト単位で返す。
dwDstUserUINT_PTR8/4+56+40変換先に関連付けるユーザー定義データ。
dwReservedDriverDWORD40+64+44ドライバー用に予約された領域。アプリは使用しない。

各言語での定義

#include <windows.h>

// ACMSTREAMHEADER  (x64 104 / x86 84 バイト)
#pragma pack(push, 1)
typedef struct ACMSTREAMHEADER {
    DWORD cbStruct;
    DWORD fdwStatus;
    UINT_PTR dwUser;
    BYTE* pbSrc;
    DWORD cbSrcLength;
    DWORD cbSrcLengthUsed;
    UINT_PTR dwSrcUser;
    BYTE* pbDst;
    DWORD cbDstLength;
    DWORD cbDstLengthUsed;
    UINT_PTR dwDstUser;
    DWORD dwReservedDriver[10];
} ACMSTREAMHEADER;
#pragma pack(pop)
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct ACMSTREAMHEADER
{
    public uint cbStruct;
    public uint fdwStatus;
    public UIntPtr dwUser;
    public IntPtr pbSrc;
    public uint cbSrcLength;
    public uint cbSrcLengthUsed;
    public UIntPtr dwSrcUser;
    public IntPtr pbDst;
    public uint cbDstLength;
    public uint cbDstLengthUsed;
    public UIntPtr dwDstUser;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] public uint[] dwReservedDriver;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure ACMSTREAMHEADER
    Public cbStruct As UInteger
    Public fdwStatus As UInteger
    Public dwUser As UIntPtr
    Public pbSrc As IntPtr
    Public cbSrcLength As UInteger
    Public cbSrcLengthUsed As UInteger
    Public dwSrcUser As UIntPtr
    Public pbDst As IntPtr
    Public cbDstLength As UInteger
    Public cbDstLengthUsed As UInteger
    Public dwDstUser As UIntPtr
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=10)> Public dwReservedDriver() As UInteger
End Structure
import ctypes
from ctypes import wintypes

class ACMSTREAMHEADER(ctypes.Structure):
    _pack_ = 1
    _fields_ = [
        ("cbStruct", wintypes.DWORD),
        ("fdwStatus", wintypes.DWORD),
        ("dwUser", ctypes.c_size_t),
        ("pbSrc", ctypes.c_void_p),
        ("cbSrcLength", wintypes.DWORD),
        ("cbSrcLengthUsed", wintypes.DWORD),
        ("dwSrcUser", ctypes.c_size_t),
        ("pbDst", ctypes.c_void_p),
        ("cbDstLength", wintypes.DWORD),
        ("cbDstLengthUsed", wintypes.DWORD),
        ("dwDstUser", ctypes.c_size_t),
        ("dwReservedDriver", wintypes.DWORD * 10),
    ]
#[repr(C, packed(1))]
pub struct ACMSTREAMHEADER {
    pub cbStruct: u32,
    pub fdwStatus: u32,
    pub dwUser: usize,
    pub pbSrc: *mut core::ffi::c_void,
    pub cbSrcLength: u32,
    pub cbSrcLengthUsed: u32,
    pub dwSrcUser: usize,
    pub pbDst: *mut core::ffi::c_void,
    pub cbDstLength: u32,
    pub cbDstLengthUsed: u32,
    pub dwDstUser: usize,
    pub dwReservedDriver: [u32; 10],
}
import "golang.org/x/sys/windows"

type ACMSTREAMHEADER struct {
	cbStruct uint32
	fdwStatus uint32
	dwUser uintptr
	pbSrc uintptr
	cbSrcLength uint32
	cbSrcLengthUsed uint32
	dwSrcUser uintptr
	pbDst uintptr
	cbDstLength uint32
	cbDstLengthUsed uint32
	dwDstUser uintptr
	dwReservedDriver [10]uint32
}
type
  ACMSTREAMHEADER = packed record
    cbStruct: DWORD;
    fdwStatus: DWORD;
    dwUser: NativeUInt;
    pbSrc: Pointer;
    cbSrcLength: DWORD;
    cbSrcLengthUsed: DWORD;
    dwSrcUser: NativeUInt;
    pbDst: Pointer;
    cbDstLength: DWORD;
    cbDstLengthUsed: DWORD;
    dwDstUser: NativeUInt;
    dwReservedDriver: array[0..9] of DWORD;
  end;
const ACMSTREAMHEADER = extern struct {
    cbStruct: u32,
    fdwStatus: u32,
    dwUser: usize,
    pbSrc: ?*anyopaque,
    cbSrcLength: u32,
    cbSrcLengthUsed: u32,
    dwSrcUser: usize,
    pbDst: ?*anyopaque,
    cbDstLength: u32,
    cbDstLengthUsed: u32,
    dwDstUser: usize,
    dwReservedDriver: [10]u32,
};
type
  ACMSTREAMHEADER {.packed.} = object
    cbStruct: uint32
    fdwStatus: uint32
    dwUser: uint
    pbSrc: pointer
    cbSrcLength: uint32
    cbSrcLengthUsed: uint32
    dwSrcUser: uint
    pbDst: pointer
    cbDstLength: uint32
    cbDstLengthUsed: uint32
    dwDstUser: uint
    dwReservedDriver: array[10, uint32]
align(1)
struct ACMSTREAMHEADER
{
    uint cbStruct;
    uint fdwStatus;
    size_t dwUser;
    void* pbSrc;
    uint cbSrcLength;
    uint cbSrcLengthUsed;
    size_t dwSrcUser;
    void* pbDst;
    uint cbDstLength;
    uint cbDstLengthUsed;
    size_t dwDstUser;
    uint[10] dwReservedDriver;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; ACMSTREAMHEADER サイズ: 84 バイト(x86)
dim st, 21    ; 4byte整数×21(構造体サイズ 84 / 4 切り上げ)
; cbStruct : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; fdwStatus : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; dwUser : UINT_PTR (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; pbSrc : BYTE* (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; cbSrcLength : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; cbSrcLengthUsed : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; dwSrcUser : UINT_PTR (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; pbDst : BYTE* (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; cbDstLength : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; cbDstLengthUsed : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; dwDstUser : UINT_PTR (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; dwReservedDriver : DWORD (+44, 40byte)  varptr(st)+44 を基点に操作(40byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; ACMSTREAMHEADER サイズ: 104 バイト(x64)
dim st, 26    ; 4byte整数×26(構造体サイズ 104 / 4 切り上げ)
; cbStruct : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; fdwStatus : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; dwUser : UINT_PTR (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; pbSrc : BYTE* (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; cbSrcLength : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; cbSrcLengthUsed : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; dwSrcUser : UINT_PTR (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; pbDst : BYTE* (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; cbDstLength : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; cbDstLengthUsed : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; dwDstUser : UINT_PTR (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; dwReservedDriver : DWORD (+64, 40byte)  varptr(st)+64 を基点に操作(40byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global ACMSTREAMHEADER, pack=1
    #field int cbStruct
    #field int fdwStatus
    #field intptr dwUser
    #field intptr pbSrc
    #field int cbSrcLength
    #field int cbSrcLengthUsed
    #field intptr dwSrcUser
    #field intptr pbDst
    #field int cbDstLength
    #field int cbDstLengthUsed
    #field intptr dwDstUser
    #field int dwReservedDriver 10
#endstruct

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