Conversión entre etiquetas de formato y GUID de subformato
Las instrucciones para controlar formatos que no son de PCM WAVE_FORMAT_EXTENSIBLE son similares a las de los formatos que no son PCM especificados por etiquetas de formato de onda. En concreto, un formato de WAVE_FORMAT_EXTENSIBLE debe tener un generador de patillas independiente de la fábrica para formatos PCM y requiere su propio controlador de intersección de intervalo de datos.
El GUID especifica el formato de audio para un formato de WAVE_FORMAT_EXTENSIBLE en el miembro SubFormat de la estructura KSDATAFORMAT . Cada etiqueta de formato de onda registrada tiene un GUID de subformato correspondiente, que se genera mediante la macro DEFINE_WAVEFORMATEX_GUID en Ksmedia.h. Por ejemplo, el GUID correspondiente a la etiqueta WAVE_FORMAT_DOLBY_AC3_SPDIF se define como DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DOLBY_AC3_SPDIF).
Este fragmento de código de Ksmedia.h muestra cómo definir un nuevo GUID como una variable estática autoinicializada:
#define STATIC_KSDATAFORMAT_SUBTYPE_WAVEFORMATEX \
0x00000000L, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
DEFINE_GUIDSTRUCT("00000000-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_WAVEFORMATEX);
#define KSDATAFORMAT_SUBTYPE_WAVEFORMATEX DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_WAVEFORMATEX)
Estas macros de Ksmedia.h convierten entre etiquetas de formato de onda y sus GUID asociados:
#if !defined( DEFINE_WAVEFORMATEX_GUID )
#define DEFINE_WAVEFORMATEX_GUID(x) \
(USHORT)(x), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
#endif
#define INIT_WAVEFORMATEX_GUID(Guid, x) \
{ \
*(Guid) = KSDATAFORMAT_SUBTYPE_WAVEFORMATEX; \
(Guid)->Data1 = (USHORT)(x); \
}
#define IS_VALID_WAVEFORMATEX_GUID(Guid) \
(!memcmp(((PUSHORT)&KSDATAFORMAT_SUBTYPE_WAVEFORMATEX) + 1, \
((PUSHORT)(Guid)) + 1, sizeof(GUID) - sizeof(USHORT)))
#define EXTRACT_WAVEFORMATEX_ID(Guid)(USHORT)((Guid)->Data1)
El código de ejemplo siguiente combina estas técnicas para crear un GUID de subformato basado en la etiqueta de formato de onda WAVE_FORMAT_AC3_SPDIF, que tiene el valor 0x0092:
#define STATIC_KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF \
DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DOLBY_AC3_SPDIF)
DEFINE_GUIDSTRUCT("00000092-0000-0010-8000-00aa00389b71",
KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF);
#define KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF \
DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF)
...
INIT_WAVEFORMATEX_GUID(pMyGuid,myWaveFormatTag);
...
if (IS_VALID_WAVEFORMATEX_GUID(aWaveFormatExGuidPtr)) {
aWaveFormatTag = EXTRACT_WAVEFORMATEX_ID(aWaveFormatExGuidPtr);
}
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de