📄 tvaudiofilter.cpp
字号:
/*+++ *******************************************************************\
*
* Copyright and Disclaimer:
*
* ---------------------------------------------------------------
* This software is provided "AS IS" without warranty of any kind,
* either expressed or implied, including but not limited to the
* implied warranties of noninfringement, merchantability and/or
* fitness for a particular purpose.
* ---------------------------------------------------------------
*
* Copyright (c) 2008 Conexant Systems, Inc.
* All rights reserved.
*
\******************************************************************* ---*/
#include "TvAudioFilter.h"
#include "Device.h"
#include "Merlin.h"
#include "commonGuid.h"
#include "miscfuncs.h"
static const KSPIN_MEDIUM TVAUDIO_INPUT_MEDIUM = {TUNER_TV_AUDIO_OUT_GUID, 0, 0 };
static const KSPIN_MEDIUM TVAUDIO_OUTPUT_MEDIUM = {TV_AUDIO_FILTER_OUT_GUID, 0, 0 };
NTSTATUS
TvAudioFilter::
setTvAudioProp(
IRP *p_irp,
KSPROPERTY_TVAUDIO_S *p_in,
KSPROPERTY_TVAUDIO_S *p_out
)
{
KSFILTER *p_ks_filt = KsGetFilterFromIrp( p_irp );
KSDEVICE *p_ks_dev = KsGetDevice( p_ks_filt );
Merlin* p_audio = ((Device*)p_ks_dev->Context)->getAudDec();
p_audio->setTVAudioMode(p_in->Mode);
return STATUS_SUCCESS;
}
NTSTATUS
TvAudioFilter::
getTvAudioProp(
IRP *p_irp,
KSPROPERTY *p_in,
void *p_out
)
{
Device* p_device = getDevice(p_irp);
if(!p_device)
{
return STATUS_UNSUCCESSFUL;
}
Merlin* p_audio = p_device->getAudDec();
switch( p_in->Id )
{
case KSPROPERTY_TVAUDIO_CAPS:
{
KSPROPERTY_TVAUDIO_CAPS_S *p_struct =
(KSPROPERTY_TVAUDIO_CAPS_S*)p_out;
p_struct->InputMedium = TVAUDIO_INPUT_MEDIUM;
p_struct->OutputMedium = TVAUDIO_OUTPUT_MEDIUM;
p_struct->InputMedium.Id = p_device->getMediumId();
p_struct->OutputMedium.Id = p_device->getMediumId();
// Report all of the possible audio decoding
// modes the hardware is capabable of
p_struct->Capabilities = p_audio->getCapabilities();
break;
}
case KSPROPERTY_TVAUDIO_MODE:
{
KSPROPERTY_TVAUDIO_S *p_struct = (KSPROPERTY_TVAUDIO_S*)p_out;
p_struct->Mode = p_audio->getCurrentMode();
break;
}
case KSPROPERTY_TVAUDIO_CURRENTLY_AVAILABLE_MODES:
{
KSPROPERTY_TVAUDIO_S *p_struct = (KSPROPERTY_TVAUDIO_S*)p_out;
p_struct->Mode = p_audio->getAvailableModes();
break;
}
default:
return STATUS_NOT_SUPPORTED;
}
return STATUS_SUCCESS;
}
NTSTATUS
TvAudioFilter::
registerFilter(PDEVICE_OBJECT p_physical_device_object,
DWORD medium_id)
{
const ULONG pin_count = 2;
//Create an array of mediums
KSPIN_MEDIUM mediums[pin_count];
mediums[0] = TVAUDIO_INPUT_MEDIUM;
mediums[1] = TVAUDIO_OUTPUT_MEDIUM;
mediums[0].Id = medium_id;
mediums[1].Id = medium_id;
//Create an array of pin directions
const BOOL INPUT_PIN = FALSE;
const BOOL OUTPUT_PIN = TRUE;
BOOL pin_directions[pin_count] =
{
INPUT_PIN,
OUTPUT_PIN
};
return KsRegisterFilterWithNoKSPins(
p_physical_device_object,
&KSCATEGORY_TVAUDIO,
pin_count,
pin_directions,
mediums,
NULL);
}
const KSPROPERTY_ITEM TVAudioProperties[] =
{
DEFINE_KSPROPERTY_ITEM
(
KSPROPERTY_TVAUDIO_CAPS,
TvAudioFilter::getTvAudioProp, // GetSupported or Handler
sizeof(KSPROPERTY_TVAUDIO_CAPS_S), // MinProperty
sizeof(KSPROPERTY_TVAUDIO_CAPS_S), // MinData
FALSE, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
0 // SerializedSize
),
DEFINE_KSPROPERTY_ITEM
(
KSPROPERTY_TVAUDIO_MODE,
TvAudioFilter::getTvAudioProp, // GetSupported or Handler // GetSupported or Handler
sizeof(KSPROPERTY_TVAUDIO_S), // MinProperty
sizeof(KSPROPERTY_TVAUDIO_S), // MinData
TvAudioFilter::setTvAudioProp, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
0 // SerializedSize
),
DEFINE_KSPROPERTY_ITEM
(
KSPROPERTY_TVAUDIO_CURRENTLY_AVAILABLE_MODES,
TvAudioFilter::getTvAudioProp, // GetSupported or Handler // GetSupported or Handler
sizeof(KSPROPERTY_TVAUDIO_S), // MinProperty
sizeof(KSPROPERTY_TVAUDIO_S), // MinData
FALSE, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
0 // SerializedSize
)
};
const KSPROPERTY_SET property_table[] =
{
DEFINE_KSPROPERTY_SET
(
&PROPSETID_VIDCAP_TVAUDIO,
SIZEOF_ARRAY(TVAudioProperties),
TVAudioProperties,
0,
NULL
)
};
extern
const
KSAUTOMATION_TABLE
TvAudioFilterAutomationTable =
{
SIZEOF_ARRAY( property_table ),
sizeof KSPROPERTY_ITEM,
property_table,
DEFINE_KSAUTOMATION_METHODS_NULL,
DEFINE_KSAUTOMATION_EVENTS_NULL
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -