ホーム › Media.Audio › ACMDRVSTREAMHEADER
ACMDRVSTREAMHEADER
構造体サイズ=各フィールドのバイト数(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 | 変換先に関連付けるユーザー定義データ。 |
| fdwConvert | DWORD | 4 | +64 | +44 | 変換動作を制御するフラグ(ACM_STREAMCONVERTF_*)を示す。 |
| padshNext | ACMDRVSTREAMHEADER* | 8/4 | +68 | +48 | 連結する次のストリームヘッダーへのポインター。NULL可。 |
| fdwDriver | DWORD | 4 | +76 | +52 | ドライバー固有のフラグを示す。 |
| dwDriver | UINT_PTR | 8/4 | +80 | +56 | ドライバーが管理するヘッダー固有のデータ。 |
| fdwPrepared | DWORD | 4 | +88 | +60 | 準備状態を示すフラグ。 |
| dwPrepared | UINT_PTR | 8/4 | +92 | +64 | 準備時にドライバーが保持するデータ。 |
| pbPreparedSrc | BYTE* | 8/4 | +100 | +68 | 準備時の変換元バッファへのポインター。 |
| cbPreparedSrcLength | DWORD | 4 | +108 | +72 | 準備時の変換元バッファ長をバイト単位で示す。 |
| pbPreparedDst | BYTE* | 8/4 | +112 | +76 | 準備時の変換先バッファへのポインター。 |
| cbPreparedDstLength | DWORD | 4 | +120 | +80 | 準備時の変換先バッファ長をバイト単位で示す。 |
各言語での定義
#include <windows.h>
// ACMDRVSTREAMHEADER (x64 124 / x86 84 バイト)
#pragma pack(push, 1)
typedef struct ACMDRVSTREAMHEADER {
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 fdwConvert;
ACMDRVSTREAMHEADER* padshNext;
DWORD fdwDriver;
UINT_PTR dwDriver;
DWORD fdwPrepared;
UINT_PTR dwPrepared;
BYTE* pbPreparedSrc;
DWORD cbPreparedSrcLength;
BYTE* pbPreparedDst;
DWORD cbPreparedDstLength;
} ACMDRVSTREAMHEADER;
#pragma pack(pop)using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct ACMDRVSTREAMHEADER
{
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;
public uint fdwConvert;
public IntPtr padshNext;
public uint fdwDriver;
public UIntPtr dwDriver;
public uint fdwPrepared;
public UIntPtr dwPrepared;
public IntPtr pbPreparedSrc;
public uint cbPreparedSrcLength;
public IntPtr pbPreparedDst;
public uint cbPreparedDstLength;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure ACMDRVSTREAMHEADER
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
Public fdwConvert As UInteger
Public padshNext As IntPtr
Public fdwDriver As UInteger
Public dwDriver As UIntPtr
Public fdwPrepared As UInteger
Public dwPrepared As UIntPtr
Public pbPreparedSrc As IntPtr
Public cbPreparedSrcLength As UInteger
Public pbPreparedDst As IntPtr
Public cbPreparedDstLength As UInteger
End Structureimport ctypes
from ctypes import wintypes
class ACMDRVSTREAMHEADER(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),
("fdwConvert", wintypes.DWORD),
("padshNext", ctypes.c_void_p),
("fdwDriver", wintypes.DWORD),
("dwDriver", ctypes.c_size_t),
("fdwPrepared", wintypes.DWORD),
("dwPrepared", ctypes.c_size_t),
("pbPreparedSrc", ctypes.c_void_p),
("cbPreparedSrcLength", wintypes.DWORD),
("pbPreparedDst", ctypes.c_void_p),
("cbPreparedDstLength", wintypes.DWORD),
]#[repr(C, packed(1))]
pub struct ACMDRVSTREAMHEADER {
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 fdwConvert: u32,
pub padshNext: *mut core::ffi::c_void,
pub fdwDriver: u32,
pub dwDriver: usize,
pub fdwPrepared: u32,
pub dwPrepared: usize,
pub pbPreparedSrc: *mut core::ffi::c_void,
pub cbPreparedSrcLength: u32,
pub pbPreparedDst: *mut core::ffi::c_void,
pub cbPreparedDstLength: u32,
}import "golang.org/x/sys/windows"
type ACMDRVSTREAMHEADER struct {
cbStruct uint32
fdwStatus uint32
dwUser uintptr
pbSrc uintptr
cbSrcLength uint32
cbSrcLengthUsed uint32
dwSrcUser uintptr
pbDst uintptr
cbDstLength uint32
cbDstLengthUsed uint32
dwDstUser uintptr
fdwConvert uint32
padshNext uintptr
fdwDriver uint32
dwDriver uintptr
fdwPrepared uint32
dwPrepared uintptr
pbPreparedSrc uintptr
cbPreparedSrcLength uint32
pbPreparedDst uintptr
cbPreparedDstLength uint32
}type
ACMDRVSTREAMHEADER = packed record
cbStruct: DWORD;
fdwStatus: DWORD;
dwUser: NativeUInt;
pbSrc: Pointer;
cbSrcLength: DWORD;
cbSrcLengthUsed: DWORD;
dwSrcUser: NativeUInt;
pbDst: Pointer;
cbDstLength: DWORD;
cbDstLengthUsed: DWORD;
dwDstUser: NativeUInt;
fdwConvert: DWORD;
padshNext: Pointer;
fdwDriver: DWORD;
dwDriver: NativeUInt;
fdwPrepared: DWORD;
dwPrepared: NativeUInt;
pbPreparedSrc: Pointer;
cbPreparedSrcLength: DWORD;
pbPreparedDst: Pointer;
cbPreparedDstLength: DWORD;
end;const ACMDRVSTREAMHEADER = extern struct {
cbStruct: u32,
fdwStatus: u32,
dwUser: usize,
pbSrc: ?*anyopaque,
cbSrcLength: u32,
cbSrcLengthUsed: u32,
dwSrcUser: usize,
pbDst: ?*anyopaque,
cbDstLength: u32,
cbDstLengthUsed: u32,
dwDstUser: usize,
fdwConvert: u32,
padshNext: ?*anyopaque,
fdwDriver: u32,
dwDriver: usize,
fdwPrepared: u32,
dwPrepared: usize,
pbPreparedSrc: ?*anyopaque,
cbPreparedSrcLength: u32,
pbPreparedDst: ?*anyopaque,
cbPreparedDstLength: u32,
};type
ACMDRVSTREAMHEADER {.packed.} = object
cbStruct: uint32
fdwStatus: uint32
dwUser: uint
pbSrc: pointer
cbSrcLength: uint32
cbSrcLengthUsed: uint32
dwSrcUser: uint
pbDst: pointer
cbDstLength: uint32
cbDstLengthUsed: uint32
dwDstUser: uint
fdwConvert: uint32
padshNext: pointer
fdwDriver: uint32
dwDriver: uint
fdwPrepared: uint32
dwPrepared: uint
pbPreparedSrc: pointer
cbPreparedSrcLength: uint32
pbPreparedDst: pointer
cbPreparedDstLength: uint32align(1)
struct ACMDRVSTREAMHEADER
{
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 fdwConvert;
void* padshNext;
uint fdwDriver;
size_t dwDriver;
uint fdwPrepared;
size_t dwPrepared;
void* pbPreparedSrc;
uint cbPreparedSrcLength;
void* pbPreparedDst;
uint cbPreparedDstLength;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; ACMDRVSTREAMHEADER サイズ: 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 も可)
; fdwConvert : DWORD (+44, 4byte) st.11 = 値 / 値 = st.11 (lpoke/lpeek も可)
; padshNext : ACMDRVSTREAMHEADER* (+48, 4byte) varptr(st)+48 を基点に操作(4byte:入れ子/配列)
; fdwDriver : DWORD (+52, 4byte) st.13 = 値 / 値 = st.13 (lpoke/lpeek も可)
; dwDriver : UINT_PTR (+56, 4byte) st.14 = 値 / 値 = st.14 (lpoke/lpeek も可)
; fdwPrepared : DWORD (+60, 4byte) st.15 = 値 / 値 = st.15 (lpoke/lpeek も可)
; dwPrepared : UINT_PTR (+64, 4byte) st.16 = 値 / 値 = st.16 (lpoke/lpeek も可)
; pbPreparedSrc : BYTE* (+68, 4byte) st.17 = 値 / 値 = st.17 (lpoke/lpeek も可)
; cbPreparedSrcLength : DWORD (+72, 4byte) st.18 = 値 / 値 = st.18 (lpoke/lpeek も可)
; pbPreparedDst : BYTE* (+76, 4byte) st.19 = 値 / 値 = st.19 (lpoke/lpeek も可)
; cbPreparedDstLength : DWORD (+80, 4byte) st.20 = 値 / 値 = st.20 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; ACMDRVSTREAMHEADER サイズ: 124 バイト(x64)
dim st, 31 ; 4byte整数×31(構造体サイズ 124 / 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,上位
; fdwConvert : DWORD (+64, 4byte) st.16 = 値 / 値 = st.16 (lpoke/lpeek も可)
; padshNext : ACMDRVSTREAMHEADER* (+68, 8byte) varptr(st)+68 を基点に操作(8byte:入れ子/配列)
; fdwDriver : DWORD (+76, 4byte) st.19 = 値 / 値 = st.19 (lpoke/lpeek も可)
; dwDriver : UINT_PTR (+80, 8byte) qpoke st,80,値 / qpeek(st,80) ※IronHSPのみ。3.7/3.8は lpoke st,80,下位 : lpoke st,84,上位
; fdwPrepared : DWORD (+88, 4byte) st.22 = 値 / 値 = st.22 (lpoke/lpeek も可)
; dwPrepared : UINT_PTR (+92, 8byte) qpoke st,92,値 / qpeek(st,92) ※IronHSPのみ。3.7/3.8は lpoke st,92,下位 : lpoke st,96,上位
; pbPreparedSrc : BYTE* (+100, 8byte) qpoke st,100,値 / qpeek(st,100) ※IronHSPのみ。3.7/3.8は lpoke st,100,下位 : lpoke st,104,上位
; cbPreparedSrcLength : DWORD (+108, 4byte) st.27 = 値 / 値 = st.27 (lpoke/lpeek も可)
; pbPreparedDst : BYTE* (+112, 8byte) qpoke st,112,値 / qpeek(st,112) ※IronHSPのみ。3.7/3.8は lpoke st,112,下位 : lpoke st,116,上位
; cbPreparedDstLength : DWORD (+120, 4byte) st.30 = 値 / 値 = st.30 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global ACMDRVSTREAMHEADER, 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 fdwConvert
#field intptr padshNext
#field int fdwDriver
#field intptr dwDriver
#field int fdwPrepared
#field intptr dwPrepared
#field intptr pbPreparedSrc
#field int cbPreparedSrcLength
#field intptr pbPreparedDst
#field int cbPreparedDstLength
#endstruct
stdim st, ACMDRVSTREAMHEADER ; NSTRUCT 変数を確保
st->cbStruct = 100
mes "cbStruct=" + st->cbStruct