ホーム › Media.Audio › ACMSTREAMHEADER
ACMSTREAMHEADER
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| cbStruct | DWORD | 4 | +0 | +0 | この構造体のサイズをバイト単位で示す。準備前に設定が必要である。 |
| fdwStatus | DWORD | 4 | +4 | +4 | ストリームヘッダーの状態フラグ(ACMSTREAMHEADER_STATUSF_*)を示す。 |
| dwUser | UINT_PTR | 8/4 | +8 | +8 | アプリケーションが自由に使えるユーザー定義データ。 |
| pbSrc | BYTE* | 8/4 | +16 | +12 | 変換元データを格納するバッファへのポインター。 |
| cbSrcLength | DWORD | 4 | +24 | +16 | 変換元バッファの全長をバイト単位で示す。 |
| cbSrcLengthUsed | DWORD | 4 | +28 | +20 | 実際に変換に使われた変換元データ長をバイト単位で返す。 |
| dwSrcUser | UINT_PTR | 8/4 | +32 | +24 | 変換元に関連付けるユーザー定義データ。 |
| pbDst | BYTE* | 8/4 | +40 | +28 | 変換先データを格納するバッファへのポインター。 |
| cbDstLength | DWORD | 4 | +48 | +32 | 変換先バッファの全長をバイト単位で示す。 |
| cbDstLengthUsed | DWORD | 4 | +52 | +36 | 実際に書き込まれた変換先データ長をバイト単位で返す。 |
| dwDstUser | UINT_PTR | 8/4 | +56 | +40 | 変換先に関連付けるユーザー定義データ。 |
| dwReservedDriver | DWORD | 40 | +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 Structureimport 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