Retracted some winmm changes

This commit is contained in:
Vincent Billet
2025-05-22 12:15:16 +02:00
parent 240d45201d
commit 1ed05c2498

View File

@@ -614,128 +614,6 @@ WAVEFORMATEXTENSIBLE :: struct {
SubFormat: GUID,
}
MPEGLAYER3_WFX_EXTRA_BYTES :: 12
// MPEG Layer3 WAVEFORMATEX structure
MPEGLAYER3WAVEFORMAT :: struct {
using wfx: WAVEFORMATEX,
wID: WORD,
fdwFlags: DWORD,
nBlockSize: WORD,
nFramesPerBlock: WORD,
nCodecDelay: WORD,
}
LPMPEGLAYER3WAVEFORMAT :: ^MPEGLAYER3WAVEFORMAT
MPEGLAYER3_ID_UNKNOWN :: 0
MPEGLAYER3_ID_MPEG :: 1
MPEGLAYER3_ID_CONSTANTFRAMESIZE :: 2
MPEGLAYER3_FLAG_PADDING_ISO :: 0x00000000
MPEGLAYER3_FLAG_PADDING_ON :: 0x00000001
MPEGLAYER3_FLAG_PADDING_OFF :: 0x00000002
/*
"MPEG-2" in the comments below refers to ISO/IEC 13818-7 (MPEG-2 AAC spec).
"MPEG-4" in the comments below refers to ISO/IEC 14496-3 (MPEG-4 Audio spec).
The following defines the format block to be used for MPEG-2 AAC or MPEG-4 HE-AAC v1/v2 streams.
When setting media type attributes in Media Foundation (MF) objects, this will appear in conjunction with major type MFMediaType_Audio and sub type MFAudioFormat_AAC (=MEDIASUBTYPE_MPEG_HEAAC).
The format block structure HEAACWAVEFORMAT is defined below. It starts with the structure HEAACWAVEINFO (which is an extension of WAVEFORMATEX), followed by AudioSpecificConfig() as defined by ISO/IEC 14496-3 (MPEG-4 audio).
Since the length of AudioSpecificConfig() may vary from one stream to another, this is a variable size format block.
The WAVEFORMATEX fields describe the properties of the core AAC stream, without SBR/PS extensions (if exists). This is the description of the WAVEFORMATEX fields:
wfx.wFormatTag - Set this to WAVE_FORMAT_MPEG_HEAAC (0x1610).
wfx.nChannels - Total number of channels in core AAC stream (including LFE if exists).
This might be different than the decoded number of channels if the MPEG-4 Parametric Stereo (PS) tool exists. If unknown, set to zero.
wfx.nSamplesPerSec - Sampling rate of core AAC stream. This will be one of the 12 supported sampling rate between 8000 and 96000 Hz, as defined in MPEG-2.
This might be different than the decoded sampling rate if the MPEG-4 Spectral Band Replication (SBR) tool exists.
If not know in advance, the sampling rate can be extracted from:
- the 4-bit sampling_frequency_index field in adts_fixed_header(), or
- program_config_element() in adif_header for MPEG-2 streams, or
- the 4-bit samplingFrequencyIndex field in AudioSpecificConfig() for MPEG-4 streams.
wfx.nAvgBytesPerSec - The average bytes per second calculated based on the average bit rate of the compressed stream.
This value may be used by parsers to seek into a particular time offset in the stream. It may also be used by applications to determine roughly how much buffer length to allocate.
If this is not known in advance, this value can be estimated by parsing some (or all) of the compressed HE-AAC frames and calculating bit rate based on average compressed frame size.
If unknown, set to zero.
wfx.nBlockAlign - Set this to 1.
wfx.wBitsPerSample - Desired bit depth of the decoded PCM. If unknown, set to zero.
wfx.cbSize - Set this to 12 (=sizeof(HEAACWAVEINFO)-sizeof(WAVEFORMATEX)) plus the size of AudioSpecificConfig() in bytes.
===================================
How do we parse this format block? assume pbBuff is the address of the first byte in the format block. We do the following:
pwfInfo := cast(^HEAACWAVEINFO)pbBuff
if pwfInfo.wStructType == 0 {
pwf := cast(^HEAACWAVEFORMAT)pbBuff
// All HEAACWAVEFORMAT fields can now be accessed through pwf
// To parse AudioSpecificConfig(), write a function such as
// ParseAudioSpecificConfig :: proc(pbASC: ^BYTE, dwASCLen: DWORD),
// and call:
dwASCLen: DWORD = pwf.wfInfo.wfx.cbSize - size_of(HEAACWAVEINFO) + size_of(WAVEFORMATEX)
ParseAudioSpecificConfig(pwf.pbAudioSpecificConfig, dwASCLen)
} else {
// Reserved
}
*/
// This structure has a size of 30 bytes
HEAACWAVEINFO :: struct {
// Defines core AAC properties. See description above. WAVEFORMATEX is of size 18 bytes.
using wfx: WAVEFORMATEX,
// Defines the payload type
// 0-RAW. The stream contains raw_data_block() elements only.
// 1-ADTS. The stream contains an adts_sequence(), as defined by MPEG-2.
// 2-ADIF. The stream contains an adif_sequence(), as defined by MPEG-2.
// 3-LOAS. The stream contains an MPEG-4 audio transport stream with a synchronization layer LOAS and a multiplex layer LATM.
// All other codes are reserved.
wPayloadType: WORD,
// This is the 8-bit field audioProfileLevelIndication available in the MPEG-4 object descriptor.
// It is an indication (as defined in MPEG-4 audio) of the audio profile and level required to process the content associated with this stream.
// For example values 0x28-0x2B correspond to AAC Profile, values 0x2C-0x2F correspond to HE-AAC profile and 0x30-0x33 for HE-AAC v2 profile.
// If unknown, set to zero or 0xFE ("no audio profile specified").
wAudioProfileLevelIndication: WORD,
// Defines the data that follows this structure. Currently only one data type is supported:
// 0- AudioSpecificConfig() (as defined by MPEG-4 Audio, ISO/IEC 14496-3) will follow this structure.
// wfx.cbSize will indicate the total length including AudioSpecificConfig().
// Use HEAACWAVEFORMAT to gain easy access to the address of the first byte of AudioSpecificConfig() for parsing.
// Typical values for the size of AudioSpecificConfig (ASC) are:
// - 2 bytes for AAC or HE-AAC v1/v2 with implicit signaling of SBR,
// - 5 bytes for HE-AAC v1 with explicit signaling of SBR,
// - 7 bytes for HE-AAC v2 with explicit signaling of SBR and PS.
// The size may be longer than 7 bytes if the 4-bit channelConfiguration field in ASC is zero, which means program_config_element() is present in ASC.
// All other codes are reserved.
wStructType: WORD,
// Set these to zero
wReserved1: WORD,
dwReserved2: DWORD,
}
LPHEAACWAVEINFO :: ^HEAACWAVEINFO
// This structure describes the format block for wStructType=0
// This structure has a size of 31 bytes
HEAACWAVEFORMAT :: struct {
using wfInfo: HEAACWAVEINFO,
pbAudioSpecificConfig: [1]BYTE, // First byte of AudioSpecificConfig()
}
LPHEAACWAVEFORMAT :: ^HEAACWAVEFORMAT
WAVEHDR :: struct {
lpData: LPSTR, /* pointer to locked data buffer */
dwBufferLength: DWORD, /* length of data buffer */
@@ -824,90 +702,3 @@ CALLBACK_TASK :: 0x00020000 /* dwCallback is a HTASK */
CALLBACK_FUNCTION :: 0x00030000 /* dwCallback is a FARPROC */
CALLBACK_THREAD :: CALLBACK_TASK /* thread ID replaces 16 bit task */
CALLBACK_EVENT :: 0x00050000 /* dwCallback is an EVENT Handle */
// Description: Type definitions used by the audio session manager RPC/COM interfaces
//-------------------------------------------------------------------------
// Description: AudioClient share mode
// SHARED - The device will be opened in shared mode and use the WAS format.
// EXCLUSIVE - The device will be opened in exclusive mode and use the application specified format.
AUDCLNT_SHAREMODE :: enum i32 {
SHARED,
EXCLUSIVE,
}
//-------------------------------------------------------------------------
// Description: Audio stream categories
// ForegroundOnlyMedia - (deprecated for Win10) Music, Streaming audio
// BackgroundCapableMedia - (deprecated for Win10) Video with audio
// Communications - VOIP, chat, phone call
// Alerts - Alarm, Ring tones
// SoundEffects - Sound effects, clicks, dings
// GameEffects - Game sound effects
// GameMedia - Background audio for games
// GameChat - In game player chat
// Speech - Speech recognition
// Media - Music, Streaming audio
// Movie - Video with audio
// FarFieldSpeech - Capture of far field speech
// UniformSpeech - Uniform, device agnostic speech processing
// VoiceTyping - Dictation, typing by voice
// Other - All other streams (default)
AUDIO_STREAM_CATEGORY :: enum i32 {
//ForegroundOnlyMedia = 1,
//BackgroundCapableMedia = 2,
Communications = 3,
Alerts = 4,
SoundEffects = 5,
GameEffects = 6,
GameMedia = 7,
GameChat = 8,
Speech = 9,
Movie = 10,
Media = 11,
FarFieldSpeech = 12,
UniformSpeech = 13,
VoiceTyping = 14,
Other = 0,
}
//-------------------------------------------------------------------------
// Description: AudioClient stream flags
// Can be a combination of AUDCLNT_STREAMFLAGS and AUDCLNT_SYSFXFLAGS:
// AUDCLNT_STREAMFLAGS (this group of flags uses the high word, w/exception of high-bit which is reserved, 0x7FFF0000):
// AUDCLNT_STREAMFLAGS_CROSSPROCESS - Audio policy control for this stream will be shared with with other process sessions that use the same audio session GUID.
// AUDCLNT_STREAMFLAGS_LOOPBACK - Initializes a renderer endpoint for a loopback audio application. In this mode, a capture stream will be opened on the specified renderer endpoint. Shared mode and a renderer endpoint is required.
// Otherwise the IAudioClient.Initialize call will fail. If the initialize is successful, a capture stream will be available from the IAudioClient object.
// AUDCLNT_STREAMFLAGS_EVENTCALLBACK - An exclusive mode client will supply an event handle that will be signaled when an IRP completes (or a waveRT buffer completes) telling it to fill the next buffer
// AUDCLNT_STREAMFLAGS_NOPERSIST - Session state will not be persisted
// AUDCLNT_STREAMFLAGS_RATEADJUST - The sample rate of the stream is adjusted to a rate specified by an application.
// AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY - When used with AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM, a sample rate converter with better quality than the default conversion but with a higher performance cost is used.
// This should be used if the audio is ultimately intended to be heard by humans as opposed to other scenarios such as pumping silence or populating a meter.
// AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM - A channel matrixer and a sample rate converter are inserted as necessary to convert between the uncompressed format supplied to IAudioClient.Initialize and the audio engine mix format.
// AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED - Session expires when there are no streams and no owning session controls.
// AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE - Don't show volume control in the Volume Mixer.
// AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED - Don't show volume control in the Volume Mixer after the session expires.
// AUDCLNT_SYSFXFLAGS (these flags use low word 0x0000FFFF):
// none defined currently
AUDCLNT_STREAMFLAGS_CROSSPROCESS :: 0x00010000
AUDCLNT_STREAMFLAGS_LOOPBACK :: 0x00020000
AUDCLNT_STREAMFLAGS_EVENTCALLBACK :: 0x00040000
AUDCLNT_STREAMFLAGS_NOPERSIST :: 0x00080000
AUDCLNT_STREAMFLAGS_RATEADJUST :: 0x00100000
AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY :: 0x08000000
AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM :: 0x80000000
AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED :: 0x10000000
AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE :: 0x20000000
AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED :: 0x40000000
//-------------------------------------------------------------------------
// Description: AudioSession State.
// AudioSessionStateInactive - The session has no active audio streams.
// AudioSessionStateActive - The session has active audio streams.
// AudioSessionStateExpired - The session is dormant.
AudioSessionState :: enum i32 {
Inactive = 0,
Active = 1,
Expired = 2,
}