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

ACMSTREAMHEADER

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

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

フィールド

フィールドサイズx64x86説明
cbStructDWORD4+0+0ACMSTREAMHEADER 構造体のサイズ (バイト単位)。このメンバーは、アプリケーションがこの構造体を使用する ACM ストリーム関数を呼び出す前に初期化しておく必要があります。このメンバーに指定するサイズは、基本の ACMSTREAMHEADER 構造体を格納できる大きさでなければなりません。
fdwStatusDWORD4+4+4

変換バッファーに関する情報を示すフラグ。このメンバーは、アプリケーションが acmStreamPrepareHeader 関数を呼び出す前に 0 に初期化しておく必要があり、ストリームヘッダーが準備済みの状態である間はアプリケーションが変更してはなりません。

名前 説明
ACMSTREAMHEADER_STATUSF_DONE
ACM またはドライバーによって設定され、変換が完了してバッファーをアプリケーションに返すことを示します。
ACMSTREAMHEADER_STATUSF_INQUEUE
ACM またはドライバーによって設定され、バッファーが変換のためにキューに入れられていることを示します。
ACMSTREAMHEADER_STATUSF_PREPARED
ACM によって設定され、acmStreamPrepareHeader 関数によってバッファーが準備済みであることを示します。
dwUserUINT_PTR8/4+8+8ユーザーデータ。アプリケーションが指定する任意のインスタンスデータを格納できます。
pbSrcBYTE*8/4+16+12変換元バッファーへのポインター。このポインターは、ストリームヘッダーが準備済みの状態である間、常に同じ場所を指していなければなりません。アプリケーションが変換元の場所を変更する必要がある場合は、ヘッダーの準備を解除し、別の場所を指定して再度準備する必要があります。
cbSrcLengthDWORD4+24+16pbSrc が指す変換元バッファーの長さ (バイト単位)。ヘッダーを準備するときは、このメンバーに変換元バッファーで使用する最大サイズを指定しなければなりません。変換は、準備時に指定した元のサイズ以下の変換元長に対して実行できます。ただし、アプリケーションがヘッダーの準備を解除するときは、このメンバーを元のサイズに戻さなければなりません。
cbSrcLengthUsedDWORD4+28+20変換に使用されたデータ量 (バイト単位)。このメンバーは変換が完了するまで有効ではありません。この値は cbSrcLength 以下になります。アプリケーションは、変換ストリームの次の変換元データへ進む際に cbSrcLengthUsed メンバーを使用する必要があります。
dwSrcUserUINT_PTR8/4+32+24ユーザーデータ。アプリケーションが指定する任意のインスタンスデータを格納できます。
pbDstBYTE*8/4+40+28変換先バッファーへのポインター。このポインターは、ストリームヘッダーが準備済みの状態である間、常に同じ場所を指していなければなりません。アプリケーションが変換先の場所を変更する必要がある場合は、ヘッダーの準備を解除し、別の場所を指定して再度準備する必要があります。
cbDstLengthDWORD4+48+32pbDst が指す変換先バッファーの長さ (バイト単位)。ヘッダーを準備するときは、このメンバーに変換先バッファーで使用する最大サイズを指定しなければなりません。
cbDstLengthUsedDWORD4+52+36変換によって返されたデータ量 (バイト単位)。このメンバーは変換が完了するまで有効ではありません。この値は cbDstLength 以下になります。アプリケーションは、変換ストリームの次の変換先の場所へ進む際に cbDstLengthUsed メンバーを使用する必要があります。
dwDstUserUINT_PTR8/4+56+40ユーザーデータ。アプリケーションが指定する任意のインスタンスデータを格納できます。
dwReservedDriverDWORD40+64+44予約済みです。使用しないでください。このメンバーはアプリケーションによる初期化を必要とせず、ヘッダーが準備済みの状態である間は決して変更してはなりません。

公式ドキュメント

ACMSTREAMHEADER 構造体は、変換ストリームにおける ACM の変換元バッファーと変換先バッファーの組を識別するために使用するヘッダーを定義します。

解説(Remarks)

ACMSTREAMHEADER 構造体を変換に使用する前に、acmStreamPrepareHeader 関数を使用して準備しておく必要があります。アプリケーションは、ACMSTREAMHEADER 構造体の使用を終えたら、変換元バッファーと変換先バッファーを解放する前に acmStreamUnprepareHeader 関数を呼び出さなければなりません。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#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