XAUDIO2_BUFFER
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||
|---|---|---|---|---|---|---|---|---|---|
| Flags | DWORD | 4 | +0 | +0 | オーディオバッファーに関する追加情報を提供するフラグです。0、または次の値を指定できます。
| ||||
| AudioBytes | DWORD | 4 | +4 | +4 | オーディオデータのサイズ (バイト単位) です。PCM データの場合は XAUDIO2_MAX_BUFFER_BYTES (xaudio2.h で定義) 以下、XMA データの場合は XMA_READBUFFER_MAX_BYTES (xma2defs.h で定義) 以下でなければなりません。 メモ IXAudio2SourceVoice::SubmitSourceBuffer を使用して XAudio2 のボイスに送信する XMA バッファーには、完全な XMA ブロックが含まれていなければなりません。完全な XMA ブロックのサイズは XMA2WAVEFORMATEX.BytesPerBlock の値と等しくなければなりません。ただし、ファイル内の最後の XMA ブロックはこれより短い場合がありますが、その場合も完全とみなされます。
| ||||
| pAudioData | BYTE* | 8/4 | +8 | +8 | オーディオデータへのポインターです。
| ||||
| PlayBegin | DWORD | 4 | +16 | +12 | バッファー内で再生を開始する最初のサンプルです。 XMA バッファーの場合、この値は 128 サンプルの倍数でなければなりません。 | ||||
| PlayLength | DWORD | 4 | +20 | +16 | 再生する領域の長さ (サンプル単位) です。値が 0 の場合はバッファー全体を再生します。この場合、PlayBegin も 0 でなければなりません。 ADPCM データの場合、この値は、この XAUDIO2_BUFFER 構造体を含む ADPCMWAVEFORMAT 構造体の wSamplesPerBlock の倍数でなければなりません。 | ||||
| LoopBegin | DWORD | 4 | +24 | +20 | ループする領域の最初のサンプルです。LoopBegin の値は PlayBegin + PlayLength より小さくなければなりません。LoopBegin は PlayBegin より小さくてもかまいません。LoopCount が 0 の場合、LoopBegin は 0 でなければなりません。 | ||||
| LoopLength | DWORD | 4 | +28 | +24 | ループ領域の長さ (サンプル単位) です。LoopBegin+LoopLength の値は PlayBegin より大きく、PlayBegin + PlayLength より小さくなければなりません。LoopCount が 0 の場合、LoopLength は 0 でなければなりません。LoopCount が 0 以外の場合、ループ長が 0 であれば、サンプル全体をループすることを示します。 ADPCM データの場合、この値は、この XAUDIO2_BUFFER 構造体を含む ADPCMWAVEFORMAT 構造体の wSamplesPerBlock の倍数でなければなりません。 | ||||
| LoopCount | DWORD | 4 | +32 | +28 | ループ領域を繰り返す回数です。この値は 0 から XAUDIO2_MAX_LOOP_COUNT までの間で指定できます。LoopCount が 0 の場合はループが行われず、LoopBegin と LoopLength は 0 でなければなりません。無限にループするには、LoopCount に XAUDIO2_LOOP_INFINITE を設定します。 | ||||
| pContext | void* | 8/4 | +36 | +32 | コールバックでクライアントに返されるコンテキスト値です。NULL でもかまいません。 |
公式ドキュメント
IXAudio2SourceVoice::SubmitSourceBuffer と共に使用される、オーディオデータのバッファーを表します。
解説(Remarks)
XAudio2 のオーディオデータはインターリーブされており、特定のサンプル番号について各チャネルのデータが隣接して配置されます。たとえば、4 チャネルの Wave を XAudio2 のソースボイスで再生する場合、オーディオデータはチャネル 0 のサンプル、チャネル 1 のサンプル、チャネル 2 のサンプル、チャネル 3 のサンプル、続いてチャネル 0、1、2、3 の次のサンプル、という順に並びます。
XAUDIO2_BUFFER の AudioBytes メンバーと pAudioData メンバーは、再生するファイルの 'data' RIFF チャンクのバイト単位のサイズと内容に対応します。Xbox 360 でファイルを読み込む場合、チャンクの内容にバイトスワップが必要になることがあります。
XAUDIO2_BUFFER 構造体または XAUDIO2_BUFFER_WMA 構造体を保持するために割り当てたメモリは、それらを渡した IXAudio2SourceVoice::SubmitSourceBuffer の呼び出しが戻り次第、解放できます。構造体が指しているデータ (それぞれ pAudioData と pDecodedPacketCumulativeBytes) は、バッファーが完了する (IXAudio2VoiceCallback::OnBufferEnd コールバックによって通知されます) か、ボイスが停止または破棄されるまで解放できません。
プラットフォーム要件
Windows 10 (XAudio2.9)、Windows 8、Windows Phone 8 (XAudio 2.8)、DirectX SDK (XAudio 2.7)Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// XAUDIO2_BUFFER (x64 44 / x86 36 バイト)
#pragma pack(push, 1)
typedef struct XAUDIO2_BUFFER {
DWORD Flags;
DWORD AudioBytes;
BYTE* pAudioData;
DWORD PlayBegin;
DWORD PlayLength;
DWORD LoopBegin;
DWORD LoopLength;
DWORD LoopCount;
void* pContext;
} XAUDIO2_BUFFER;
#pragma pack(pop)using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct XAUDIO2_BUFFER
{
public uint Flags;
public uint AudioBytes;
public IntPtr pAudioData;
public uint PlayBegin;
public uint PlayLength;
public uint LoopBegin;
public uint LoopLength;
public uint LoopCount;
public IntPtr pContext;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure XAUDIO2_BUFFER
Public Flags As UInteger
Public AudioBytes As UInteger
Public pAudioData As IntPtr
Public PlayBegin As UInteger
Public PlayLength As UInteger
Public LoopBegin As UInteger
Public LoopLength As UInteger
Public LoopCount As UInteger
Public pContext As IntPtr
End Structureimport ctypes
from ctypes import wintypes
class XAUDIO2_BUFFER(ctypes.Structure):
_pack_ = 1
_fields_ = [
("Flags", wintypes.DWORD),
("AudioBytes", wintypes.DWORD),
("pAudioData", ctypes.c_void_p),
("PlayBegin", wintypes.DWORD),
("PlayLength", wintypes.DWORD),
("LoopBegin", wintypes.DWORD),
("LoopLength", wintypes.DWORD),
("LoopCount", wintypes.DWORD),
("pContext", ctypes.c_void_p),
]#[repr(C, packed(1))]
pub struct XAUDIO2_BUFFER {
pub Flags: u32,
pub AudioBytes: u32,
pub pAudioData: *mut core::ffi::c_void,
pub PlayBegin: u32,
pub PlayLength: u32,
pub LoopBegin: u32,
pub LoopLength: u32,
pub LoopCount: u32,
pub pContext: *mut core::ffi::c_void,
}import "golang.org/x/sys/windows"
type XAUDIO2_BUFFER struct {
Flags uint32
AudioBytes uint32
pAudioData uintptr
PlayBegin uint32
PlayLength uint32
LoopBegin uint32
LoopLength uint32
LoopCount uint32
pContext uintptr
}type
XAUDIO2_BUFFER = packed record
Flags: DWORD;
AudioBytes: DWORD;
pAudioData: Pointer;
PlayBegin: DWORD;
PlayLength: DWORD;
LoopBegin: DWORD;
LoopLength: DWORD;
LoopCount: DWORD;
pContext: Pointer;
end;const XAUDIO2_BUFFER = extern struct {
Flags: u32,
AudioBytes: u32,
pAudioData: ?*anyopaque,
PlayBegin: u32,
PlayLength: u32,
LoopBegin: u32,
LoopLength: u32,
LoopCount: u32,
pContext: ?*anyopaque,
};type
XAUDIO2_BUFFER {.packed.} = object
Flags: uint32
AudioBytes: uint32
pAudioData: pointer
PlayBegin: uint32
PlayLength: uint32
LoopBegin: uint32
LoopLength: uint32
LoopCount: uint32
pContext: pointeralign(1)
struct XAUDIO2_BUFFER
{
uint Flags;
uint AudioBytes;
void* pAudioData;
uint PlayBegin;
uint PlayLength;
uint LoopBegin;
uint LoopLength;
uint LoopCount;
void* pContext;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; XAUDIO2_BUFFER サイズ: 36 バイト(x86)
dim st, 9 ; 4byte整数×9(構造体サイズ 36 / 4 切り上げ)
; Flags : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; AudioBytes : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; pAudioData : BYTE* (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; PlayBegin : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; PlayLength : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; LoopBegin : DWORD (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; LoopLength : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; LoopCount : DWORD (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; pContext : void* (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; XAUDIO2_BUFFER サイズ: 44 バイト(x64)
dim st, 11 ; 4byte整数×11(構造体サイズ 44 / 4 切り上げ)
; Flags : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; AudioBytes : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; pAudioData : BYTE* (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; PlayBegin : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; PlayLength : DWORD (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; LoopBegin : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; LoopLength : DWORD (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; LoopCount : DWORD (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; pContext : void* (+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 XAUDIO2_BUFFER, pack=1
#field int Flags
#field int AudioBytes
#field intptr pAudioData
#field int PlayBegin
#field int PlayLength
#field int LoopBegin
#field int LoopLength
#field int LoopCount
#field intptr pContext
#endstruct
stdim st, XAUDIO2_BUFFER ; NSTRUCT 変数を確保
st->Flags = 100
mes "Flags=" + st->Flags