223 lines
7.2 KiB
C
223 lines
7.2 KiB
C
// Public native render-stream syscall ABI declarations.
|
|
|
|
#pragma once
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <ntlite/status.h>
|
|
#include <ntlite/handle.h>
|
|
|
|
#define SYS_AUDIO_ABI_VERSION 5u
|
|
#define SYS_AUDIO_MAX_ENDPOINTS 32u
|
|
#define SYS_AUDIO_STREAM_CAPACITY_FRAMES 4096u
|
|
|
|
#define SYS_AUDIO_GAIN_Q16_UNITY 65536u
|
|
#define SYS_AUDIO_PAN_Q16_LEFT (-65536)
|
|
#define SYS_AUDIO_PAN_Q16_CENTER 0
|
|
#define SYS_AUDIO_PAN_Q16_RIGHT 65536
|
|
|
|
// Identifies one logical render destination.
|
|
typedef enum SYS_AUDIO_ENDPOINT_KIND {
|
|
SysAudioEndpointLineOut = 1,
|
|
SysAudioEndpointSpeakerHeadphone,
|
|
SysAudioEndpointOtherAnalog
|
|
} SYS_AUDIO_ENDPOINT_KIND;
|
|
|
|
// Identifies the interleaved PCM sample representation accepted by native streams.
|
|
typedef enum SYS_AUDIO_SAMPLE_FORMAT {
|
|
SysAudioSampleS16 = 1
|
|
} SYS_AUDIO_SAMPLE_FORMAT;
|
|
|
|
// Describes one interleaved PCM stream format.
|
|
typedef struct SYS_AUDIO_FORMAT {
|
|
uint32_t SampleRate;
|
|
uint16_t ChannelCount;
|
|
uint16_t SampleFormat;
|
|
} SYS_AUDIO_FORMAT;
|
|
|
|
#define SYS_AUDIO_ENDPOINT_FLAG_AVAILABLE 0x00000001u
|
|
#define SYS_AUDIO_ENDPOINT_FLAG_DEFAULT 0x00000002u
|
|
#define SYS_AUDIO_ENDPOINT_FLAG_VALID_MASK 0x00000003u
|
|
|
|
#define SYS_AUDIO_ENDPOINT_CAP_JACK_SENSE 0x00000001u
|
|
#define SYS_AUDIO_ENDPOINT_CAP_HARDWARE_GAIN 0x00000002u
|
|
#define SYS_AUDIO_ENDPOINT_CAP_VALID_MASK 0x00000003u
|
|
|
|
// Identifies the lifecycle state reported for one render endpoint.
|
|
typedef enum SYS_AUDIO_ENDPOINT_STATE {
|
|
SysAudioEndpointStarting = 1,
|
|
SysAudioEndpointReady,
|
|
SysAudioEndpointStopping,
|
|
SysAudioEndpointFailed,
|
|
SysAudioEndpointRemoved
|
|
} SYS_AUDIO_ENDPOINT_STATE;
|
|
|
|
// Reports one endpoint snapshot keyed by its stable kernel identifier.
|
|
typedef struct SYS_AUDIO_ENDPOINT_INFO {
|
|
uint32_t Size;
|
|
uint32_t Version;
|
|
uint32_t EndpointId;
|
|
uint32_t Kind;
|
|
uint32_t Flags;
|
|
uint32_t Capabilities;
|
|
uint32_t State;
|
|
SYS_AUDIO_FORMAT HardwareFormat;
|
|
uint32_t PeriodCount;
|
|
uint32_t FramesPerPeriod;
|
|
uint32_t MasterVolumeQ16;
|
|
bool MasterMuted;
|
|
KSTATUS FailureStatus;
|
|
uint32_t Reserved;
|
|
} SYS_AUDIO_ENDPOINT_INFO;
|
|
|
|
// Selects the endpoint array used by one enumeration call.
|
|
typedef struct SYS_AUDIO_ENUMERATE_ENDPOINTS_REQUEST {
|
|
uint32_t Size;
|
|
uint32_t Flags;
|
|
SYS_AUDIO_ENDPOINT_INFO* Endpoints;
|
|
uint32_t Capacity;
|
|
uint32_t Reserved;
|
|
uint32_t* CountOut;
|
|
} SYS_AUDIO_ENUMERATE_ENDPOINTS_REQUEST;
|
|
|
|
// Selects one endpoint and source format for a new render stream handle.
|
|
typedef struct SYS_AUDIO_OPEN_STREAM_REQUEST {
|
|
uint32_t Size;
|
|
uint32_t Flags;
|
|
uint32_t EndpointId;
|
|
SYS_AUDIO_FORMAT Format;
|
|
uint32_t Reserved;
|
|
SYS_HANDLE* StreamHandleOut;
|
|
} SYS_AUDIO_OPEN_STREAM_REQUEST;
|
|
|
|
// Describes one bounded nonblocking stream write.
|
|
typedef struct SYS_AUDIO_WRITE_REQUEST {
|
|
uint32_t Size;
|
|
uint32_t Flags;
|
|
SYS_HANDLE StreamHandle;
|
|
uint32_t FrameCount;
|
|
const void* Frames;
|
|
uint32_t* WrittenFramesOut;
|
|
} SYS_AUDIO_WRITE_REQUEST;
|
|
|
|
#define SYS_AUDIO_WAIT_WRITABLE 0x00000001u
|
|
#define SYS_AUDIO_WAIT_CONSUMED 0x00000002u
|
|
#define SYS_AUDIO_WAIT_PRESENTED 0x00000004u
|
|
#define SYS_AUDIO_WAIT_STOPPED 0x00000008u
|
|
#define SYS_AUDIO_WAIT_DRAINED 0x00000010u
|
|
#define SYS_AUDIO_WAIT_FAILED 0x00000020u
|
|
#define SYS_AUDIO_WAIT_DISCONTINUITY 0x00000040u
|
|
#define SYS_AUDIO_WAIT_VALID_MASK 0x0000007Fu
|
|
|
|
// Arms the stream handle event for one or more progress conditions.
|
|
typedef struct SYS_AUDIO_ARM_WAIT_REQUEST {
|
|
uint32_t Size;
|
|
uint32_t Flags;
|
|
SYS_HANDLE StreamHandle;
|
|
uint32_t Mask;
|
|
// Frame counters are inclusive absolute targets and generations are change baselines.
|
|
uint32_t WritableFrames;
|
|
uint32_t Reserved;
|
|
uint64_t ConsumedFrames;
|
|
uint64_t PresentedFrames;
|
|
uint64_t DrainedGeneration;
|
|
uint64_t DiscontinuityGeneration;
|
|
} SYS_AUDIO_ARM_WAIT_REQUEST;
|
|
|
|
// Identifies the public lifecycle state of one native render stream.
|
|
typedef enum SYS_AUDIO_STREAM_STATE {
|
|
SysAudioStreamCreated = 1,
|
|
SysAudioStreamRunning,
|
|
SysAudioStreamPaused,
|
|
SysAudioStreamDraining,
|
|
SysAudioStreamStopped,
|
|
SysAudioStreamFailed
|
|
} SYS_AUDIO_STREAM_STATE;
|
|
|
|
// Reports one coherent stream snapshot.
|
|
typedef struct SYS_AUDIO_STREAM_INFO {
|
|
uint32_t Size;
|
|
uint32_t Version;
|
|
uint32_t State;
|
|
uint32_t Reserved;
|
|
SYS_AUDIO_FORMAT Format;
|
|
uint32_t CapacityFrames;
|
|
uint32_t BufferedFrames;
|
|
uint32_t WritableFrames;
|
|
KSTATUS FailureStatus;
|
|
uint64_t FramesSubmitted;
|
|
uint64_t FramesConsumed;
|
|
uint64_t FramesPresented;
|
|
uint64_t FramesDiscarded;
|
|
uint64_t OutputFramesMixed;
|
|
uint64_t SilenceFramesInserted;
|
|
// Underruns count recoverable source starvation periods.
|
|
uint64_t Underruns;
|
|
uint64_t DrainedGeneration;
|
|
// Discontinuities report explicit control or hardware timeline changes.
|
|
uint64_t DiscontinuityGeneration;
|
|
uint32_t VolumeQ16;
|
|
int32_t PanQ16;
|
|
bool Muted;
|
|
uint8_t ReservedBytes[7];
|
|
} SYS_AUDIO_STREAM_INFO;
|
|
|
|
// Updates one stream's software gain, balance, and mute targets.
|
|
// Volume uses unsigned Q16 in [0, 1] and pan uses signed Q16 in [-1, 1].
|
|
typedef struct SYS_AUDIO_SET_VOLUME_REQUEST {
|
|
uint32_t Size;
|
|
uint32_t Flags;
|
|
SYS_HANDLE StreamHandle;
|
|
bool Muted;
|
|
uint32_t VolumeQ16;
|
|
int32_t PanQ16;
|
|
} SYS_AUDIO_SET_VOLUME_REQUEST;
|
|
|
|
// Updates one endpoint's master software gain and mute state.
|
|
typedef struct SYS_AUDIO_SET_MASTER_VOLUME_REQUEST {
|
|
uint32_t Size;
|
|
uint32_t Flags;
|
|
uint32_t EndpointId;
|
|
bool Muted;
|
|
uint32_t VolumeQ16;
|
|
} SYS_AUDIO_SET_MASTER_VOLUME_REQUEST;
|
|
|
|
// Enumerates render endpoints and returns the complete count even when capacity is insufficient.
|
|
KSTATUS SysAudioEnumerateEndpoints(const SYS_AUDIO_ENUMERATE_ENDPOINTS_REQUEST* request);
|
|
|
|
// Opens one waitable, process-owned native render stream handle.
|
|
KSTATUS SysAudioOpenStream(const SYS_AUDIO_OPEN_STREAM_REQUEST* request);
|
|
|
|
// Copies as many complete frames as currently fit and returns WOULD_BLOCK when none fit.
|
|
KSTATUS SysAudioWrite(const SYS_AUDIO_WRITE_REQUEST* request);
|
|
|
|
// Replaces the any-condition progress targets that drive one stream handle's wait state.
|
|
KSTATUS SysAudioArmWait(const SYS_AUDIO_ARM_WAIT_REQUEST* request);
|
|
|
|
// Copies one coherent stream snapshot after the caller initializes infoOut->Size.
|
|
KSTATUS SysAudioQueryStream(SYS_HANDLE streamHandle, SYS_AUDIO_STREAM_INFO* infoOut);
|
|
|
|
// Starts one created or stopped stream.
|
|
KSTATUS SysAudioStart(SYS_HANDLE streamHandle);
|
|
|
|
// Pauses future mixing while preserving unconsumed source frames.
|
|
KSTATUS SysAudioPause(SYS_HANDLE streamHandle);
|
|
|
|
// Resumes one paused stream.
|
|
KSTATUS SysAudioResume(SYS_HANDLE streamHandle);
|
|
|
|
// Rejects new writes and stops after all submitted frames reach a terminal disposition.
|
|
KSTATUS SysAudioDrain(SYS_HANDLE streamHandle);
|
|
|
|
// Stops future mixing and discards source frames not yet committed to hardware periods.
|
|
KSTATUS SysAudioStop(SYS_HANDLE streamHandle);
|
|
|
|
// Returns one stopped stream to an empty position-zero state.
|
|
KSTATUS SysAudioReset(SYS_HANDLE streamHandle);
|
|
|
|
// Updates one stream's software volume, pan, and mute state.
|
|
KSTATUS SysAudioSetVolume(const SYS_AUDIO_SET_VOLUME_REQUEST* request);
|
|
|
|
// Updates one endpoint's master software volume and mute state.
|
|
KSTATUS SysAudioSetMasterVolume(const SYS_AUDIO_SET_MASTER_VOLUME_REQUEST* request);
|