По классике MSVAD обеспечивает выходящий пин с типом MEDIASUBTYPE_PCM. Хотелось бы добавить и поддержку MEDIASUBTYPE_IEEE_FLOAT.
Если "тупо" добавить туда этот тип, после сборки драйвера DirectShow видит только MEDIASUBTYPE_PCM.
Вот код:
static KSDATARANGE_AUDIO PinDataRangesStream[] =
{
{
{
sizeof(KSDATARANGE_AUDIO),
0,
0,
0,
STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
},
MAX_CHANNELS_PCM,
MIN_BITS_PER_SAMPLE_PCM,
MAX_BITS_PER_SAMPLE_PCM,
MIN_SAMPLE_RATE,
MAX_SAMPLE_RATE
},
{
{
sizeof(KSDATARANGE_AUDIO),
0,
0,
0,
STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
STATICGUIDOF(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT),
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
},
MAX_CHANNELS_PCM,
32,
32,
44100,
44100
}
};
static
PKSDATARANGE PinDataRangePointersStream[] =
{
PKSDATARANGE(&PinDataRangesStream[0]),
PKSDATARANGE(&PinDataRangesStream[1])
};
далее все без изменений, кроме функций, где добавлена поддержка этого нового типа:
NTSTATUS CMiniportWaveCyclicMSVAD::ValidateFormat()
NTSTATUS CMiniportWaveCyclic::PropertyHandlerProposedFormat()
Если просто заменить KSDATAFORMAT_SUBTYPE_PCM на KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, драйвер установиться, но DirectShow его не увидит.
Идеи?
Здравствуйте, Vicul, Вы писали:
V>Если просто заменить KSDATAFORMAT_SUBTYPE_PCM на KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, драйвер установиться, но DirectShow его не увидит.
V>Идеи?
В драйверах, с этим, дела не имел, но, например, в DirectShow с таким типом тоже никто не соединится. Может быть тут по аналогии нужно: тип у IEEE_FLOAT все-равно PCM всегда указывается ( KSDATAFORMAT_SUBTYPE_PCM) а вот уже вместо WaveFormatEx подсовывается WAVEFORMATEXTENSIBLE и уже там указывается конкретный subtype (KSDATAFORMAT_SUBTYPE_IEEE_FLOAT).
если для AM_MEDIA_TYPE:
majortype = MEDIATYPE_AUDIO;
subtype = MEDIASUBTYPE_PCM; // (всегда для всех PCM)
//...
formattype = FORMAT_WaveFormatEx;
// а уже формат заполнить правильно с WAVEFORMATEXTENSIBLE где указывается правильный тип, например MEDIASUBTYPE_IEEE_FLOT;
IA
Может так?