кстати задача уточнилась — запись звука не требуется
требуется подсовывать приложениям типа скайп, камфрог звук из этого фильтра
а в фильтр звук будет пихать другое приложение
то есть фильтр по сути будет абсолютно прозрачным
но для указанных приложений он будет выглядеть микрофоном — и эти приложения будут думать и соотв передавать полученный звук из фильтра как будто они получили его из микрофона.
Здравствуйте, amid493, Вы писали:
A>похоже дело в том что фильтр прописался в CLSID_AudioInputDeviceCategory A>но почему то не прописался в A>HKEY_CURRENT_USER\Software\Microsoft\ActiveMovie\devenum A>а скайп похоже именно оттуда берет список устройств
Если все нормально написано, то должен видеть, у меня видит во всяком случае.
Посмотрите создает ли он экземпляр вашего фильтра, какие интерфейсы запрашивает. Поддержите их для фильтра и для принов.
ATP>Если все нормально написано, то должен видеть, у меня видит во всяком случае. ATP>Посмотрите создает ли он экземпляр вашего фильтра, какие интерфейсы запрашивает. Поддержите их для фильтра и для принов.
а можете выложить функцию DllRegisterServer вашего фильтра со всеми соответствующими REGFILTERPINS, REGFILTER2 и тд
?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Они подразумевались, ибо относятся к поведению любого стандартного звукового устройства Windows, с которым может работать практически любой звуковой софт, если он сделан "для звука вообще", а не заточен под определенный интерфейс. Это, если что, элементарно, и до Вашего появления ни разу не нуждалось в уточнениях. А Ваше наивное удивление похоже на реакцию иного продавца компьютерной лавки: "вы же просили модем — я вам и продал винмодем, откуда я знаю, что вы его под какой-то юникс поставите, я и слов-то таких не знаю".
До какого появления, я с технологией DShow и DSound уже лет 10 работаю и на 95,98,NT и т.д.
ЕМ>Угу — с претензией на то, что он еще и универсальный. Человек спрашивал общее решение, Вы же ему выдали очень частное, но с таким видом, будто всегда и везде только так и делают.
Претензии пока только с вашей стороны Евгений.
ЕМ>Это Вам очень повезло. Ибо мало что в винде сделано настолько криво, как запись звука через DirectSound. Ибо DS изначально проектировался исключительно для быстрого воспроизведения в игрушках, и записи там не было, как класса — ее прикрутили позднее, и откровенно по-босяцки.
Не нужно мне рассказывать об игрушках, я уже 10 лет за работу с мультимедиа деньги получаю и причем неплохие.
ЕМ>Никогда такого не было. Либо драйвер сам экспортировал все необходимые для MME функции (9x/ME/2k/XP/2k3), либо MME транслируется напрямую в WDM/KS.
Куда напрямую и кто прямее — посмотрите картинки по ссылке на MSDN, я вам прислал.
Обе технологии в конце концов обращаются к драйверу, т.ч. разницы нет никакой, но — DSound проще.
ЕМ>Вообще-то, в приличном обществе принято, что заявившему о факте наличия чего-либо следует предоставить и некие конкретные обоснования. Перекладывать бремя доказательство на сомневающихся — типичный подход жулика.
По вашим намекам я делаю вывод что вы как раз из "приличного" общества и считаете себя самым умным
ЕМ>Ага, при этом потеряв изрядное количество времени на прохождение тупикового пути, и не менее изрядно поматерив доброхота, уверенно по этому пути направившего...
Евгений, если вы умеете не только драйвера писать, но считать деньги и время — вы быстро поймете, что пути бывают разными и начинают все обычно с самых простых и проверенных.
Человеку не нужен драйвер, он хочет просто подставить свои данные и все.
ATP>>Если все нормально написано, то должен видеть, у меня видит во всяком случае. ATP>>Посмотрите создает ли он экземпляр вашего фильтра, какие интерфейсы запрашивает. Поддержите их для фильтра и для принов.
A>а можете выложить функцию DllRegisterServer вашего фильтра со всеми соответствующими REGFILTERPINS, REGFILTER2 и тд A>?
Могу, но дело в том что там используются внутренние библиотеки, без которых код неполон, которые выложить у меня нет возможности. Но я вас уверяю что кроме FilterMapper-а там ничего не используется. 99% — фильтр у вас создается но потом отсеивается по причине нехватки каких-нибудь стандартных интерфейсов.
ATP>Могу, но дело в том что там используются внутренние библиотеки, без которых код неполон, которые выложить у меня нет возможности. Но я вас уверяю что кроме FilterMapper-а там ничего не используется. 99% — фильтр у вас создается но потом отсеивается по причине нехватки каких-нибудь стандартных интерфейсов.
да полный код и не нужен — нужна фактически только вот эта часть
возможно еще нужно регистрировать в CLSID_SystemDeviceEnum?
У меня все также. Эти reg структуры на практике никак не влияют (кроме пожалуй MERIT-а) на процесс подбора фильтра при попытке его присоединить, можете сами попробовать указать любые параметры или нули — dll все равно загрузится и граф будет пытаться вставить зарегистрированный фильтр.
Попробуйте запустить skype из под отладчика и поставьте брикпоинт в конструкторе фильра. Он срабатывает?
а еще лучше — добавить вывод отладочной инфыв файл или банальных messagebox штук 5. Skype ведь шифрование трафика использует, не думаю что его просто так дебажить можно...
ATP>Попробуйте запустить skype из под отладчика и поставьте брикпоинт в конструкторе фильра. Он срабатывает?
ATP>Человеку не нужен драйвер, он хочет просто подставить свои данные и все.
Я долго работал над проблемой виртуального источника звука, но в конце концов пришел к драйверу, так как часть программ (в том числе и Скайп, AOL messenger, итд) так и не сработались с решением которое вы предлагаете (может быть потому что они вызывают CreateClassEnumerator со флагом CDEF_DEVMON_PNP_DEVICE ??). Простой вопрос — то, что вы предлагаете со Скайпом когда либо работало?
Здравствуйте, 3dlev, Вы писали:
ATP>>Человеку не нужен драйвер, он хочет просто подставить свои данные и все.
3>Я долго работал над проблемой виртуального источника звука, но в конце концов пришел к драйверу, так как часть программ (в том числе и Скайп, AOL messenger, итд) так и не сработались с решением которое вы предлагаете (может быть потому что они вызывают CreateClassEnumerator со флагом CDEF_DEVMON_PNP_DEVICE ??). Простой вопрос — то, что вы предлагаете со Скайпом когда либо работало?
Да у меня работает, вот прямо сейчас — мои DS фильтры как видео и аудио девайсы скайп видит и берет с них данные.
ATP>>Да у меня работает, вот прямо сейчас — мои DS фильтры как видео и аудио девайсы скайп видит и берет с них данные.
A>Плз, можешь показать реализацию IKsPropertySet, IAMStreamConfig, IAMStreamControl в классе фильтра?
IAMStreamControl — точно не нужен, просто возвращай E_NOTIMPL
IAMStreamConfig:
////////////////////////////////////////////////////////////////////////
// class AMStreamConfig
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
// Construction/Destruction
////////////////////////////////////////////////////////////////////////
AMStreamConfig::AMStreamConfig(const TCHAR* pName, CaptureOutputPin& pin, HRESULT* phr)
: CUnknown(pName, static_cast<IPin*>(&pin))
, m_pin(pin)
{
}
////////////////////////////////////////////////////////////////////////
// Public methods
STDMETHODIMP AMStreamConfig::NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
if(riid == IID_IAMStreamConfig) {
CheckPointer(ppv, E_POINTER);
return GetInterface(static_cast<IAMStreamConfig*>(this), ppv);
}
return CUnknown::NonDelegatingQueryInterface(riid, ppv);
}
////////////////////////////////////////////////////////////////////////
// Implementation
////////////////////////////////////////////////////////////////////////
// Implementation of IAMStreamConfig interface
STDMETHODIMP AMStreamConfig::SetFormat(AM_MEDIA_TYPE* pMType)
{
CheckPointer(pMType, E_POINTER);
CMediaType& mtype = *reinterpret_cast<CMediaType*>(pMType);
if (FAILED(m_pin.CheckMediaType(mtype)))
return VFW_E_INVALIDMEDIATYPE;
// Set preferred media type
m_pin.SetPreferredMeidaType(*pMType);
return S_OK;
}
////////////////////////////////////////////////////////////////////////
STDMETHODIMP AMStreamConfig::GetFormat(AM_MEDIA_TYPE** ppMType)
{
// Try to get current preferred media type
CMediaType mtPreferred = m_pin.GetPreferredMediaType();
if (!mtPreferred.IsValid()) {
// If not set try to get preferred media type from derived class
mtPreferred = OnGetPreferredMediaType();
}
// Allocate memory for output media type
*ppMType = reinterpret_cast<AM_MEDIA_TYPE*>(::CoTaskMemAlloc(sizeof(**ppMType)));
if (*ppMType == NULL)
return E_OUTOFMEMORY;
// Copy preferred media type to output media type
ZeroMemory(*ppMType, sizeof(**ppMType));
CMediaType& mtype = *reinterpret_cast<CMediaType*>(*ppMType);
mtype = mtPreferred;
// Media type successfully returnreturn S_OK;
}
////////////////////////////////////////////////////////////////////////
STDMETHODIMP AMStreamConfig::GetNumberOfCapabilities(int* pnCount, int* pnSize)
{
CheckPointer(pnCount, E_POINTER);
CheckPointer(pnSize, E_POINTER);
// Return number of media types supported
*pnCount = m_pin.GetMediaTypeCount();
// Return stream config capability structure size
*pnSize = m_pin.GetCapabilitiesSize();
return S_OK;
}
////////////////////////////////////////////////////////////////////////
STDMETHODIMP AMStreamConfig::GetStreamCaps(int nIndex, AM_MEDIA_TYPE** ppMType, BYTE* pStreamConfigCaps)
{
CheckPointer(ppMType, E_POINTER);
CheckPointer(pStreamConfigCaps, E_POINTER);
// Get capability parametersint nCapabilityCount;
int nCapabilitySize;
GetNumberOfCapabilities(&nCapabilityCount, &nCapabilitySize);
// Check indexif (nIndex < 0)
return E_INVALIDARG; // Negative indexif (nIndex >= nCapabilityCount)
return S_FALSE;
CMediaType mtCaps;
if (!m_pin.OnGetMediaType(nIndex, mtCaps))
return E_FAIL; // Can't get media type
// Allocate memory for output media type
*ppMType = reinterpret_cast<AM_MEDIA_TYPE*>(::CoTaskMemAlloc(sizeof(**ppMType)));
if (*ppMType == NULL)
return E_OUTOFMEMORY;
// Copy media type
ZeroMemory(*ppMType, sizeof(**ppMType));
CMediaType& mtype = *reinterpret_cast<CMediaType*>(*ppMType);
mtype = mtCaps;
// Copy capabilities
m_pin.GetCapabilities(pStreamConfigCaps);
return S_OK;
}
IKsPropertySet:
////////////////////////////////////////////////////////////////////////
// class KsPropertySet
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
// Construction/Destruction
////////////////////////////////////////////////////////////////////////
KsPropertySet::KsPropertySet(const TCHAR* pName, CaptureOutputPin& pin, HRESULT* phr)
: CUnknown(pName, static_cast<IPin*>(&pin))
, m_pin(pin)
{
}
////////////////////////////////////////////////////////////////////////
// Public methods
STDMETHODIMP KsPropertySet::NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
if(riid == IID_IKsPropertySet) {
CheckPointer(ppv, E_POINTER);
return GetInterface(static_cast<IKsPropertySet*>(this), ppv);
}
return CUnknown::NonDelegatingQueryInterface(riid, ppv);
}
////////////////////////////////////////////////////////////////////
// Implementation of IKsPropertySet interface
STDMETHODIMP KsPropertySet::Set(REFGUID guidPropSet, DWORD dwPropID, void* pInstanceData, DWORD cbInstanceData
, void* pPropData, DWORD cbPropData)
{
return E_NOTIMPL;
}
////////////////////////////////////////////////////////////////////////
STDMETHODIMP KsPropertySet::Get(REFGUID guidPropSet, DWORD dwPropID, void* pInstanceData, DWORD cbInstanceData
, void* pPropData, DWORD cbPropData, DWORD* pcbReturned)
{
if (guidPropSet != AMPROPSETID_Pin)
return E_PROP_SET_UNSUPPORTED;
if (dwPropID != AMPROPERTY_PIN_CATEGORY)
return E_PROP_ID_UNSUPPORTED;
if (pPropData == NULL && pcbReturned == NULL)
return E_POINTER;
if (pcbReturned != NULL)
*pcbReturned = sizeof(GUID);
if (pPropData == NULL)
return S_OK; // Caller just wants to know the size.if (cbPropData < sizeof(GUID))
return E_UNEXPECTED; // The buffer is too small.
*reinterpret_cast<GUID*>(pPropData) = PIN_CATEGORY_CAPTURE;
return S_OK;
}
////////////////////////////////////////////////////////////////////////
STDMETHODIMP KsPropertySet::QuerySupported(REFGUID guidPropSet, DWORD dwPropID, DWORD* pTypeSupport)
{
if (guidPropSet != AMPROPSETID_Pin)
return E_PROP_SET_UNSUPPORTED;
if (dwPropID != AMPROPERTY_PIN_CATEGORY)
return E_PROP_ID_UNSUPPORTED;
if (pTypeSupport != NULL)
// We support getting this property, but not setting it.
*pTypeSupport = KSPROPERTY_SUPPORT_GET;
return S_OK;
}
Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>>>Да у меня работает, вот прямо сейчас — мои DS фильтры как видео и аудио девайсы скайп видит и берет с них данные.
A>>Плз, можешь показать реализацию IKsPropertySet, IAMStreamConfig, IAMStreamControl в классе фильтра?
ATP>IAMStreamControl — точно не нужен, просто возвращай E_NOTIMPL
ATP>IAMStreamConfig:
...
Странно, у меня все так же, но Скайп его не видит. Спасибо за инфу, покопаюсь, выходит даром драйвером занимался
Здравствуйте, 3dlev, Вы писали:
3>Здравствуйте, AcidTheProgrammer, Вы писали:
ATP>>>>Да у меня работает, вот прямо сейчас — мои DS фильтры как видео и аудио девайсы скайп видит и берет с них данные.
A>>>Плз, можешь показать реализацию IKsPropertySet, IAMStreamConfig, IAMStreamControl в классе фильтра?
ATP>>IAMStreamControl — точно не нужен, просто возвращай E_NOTIMPL
ATP>>IAMStreamConfig:
3>...
3>Странно, у меня все так же, но Скайп его не видит. Спасибо за инфу, покопаюсь, выходит даром драйвером занимался
А с какой версией Skype-a, он DShow начиная с 4.1 начал использовать.
Здравствуйте, amid493, Вы писали:
A>ок и кто от кого наследуется тут? A>AMStreamConfig :IAMStreamConfig A>KsPropertySet : IKsPropertySet
да именно так
A>а сам фильтр-класс как соотноситься с AMStreamConfig, KsPropertySet? A>фильтр-класс : CBaseFilter, AMStreamConfig, KsPropertySet?
QueryIntyerface просто должен поддерживать IAMStreamConfig и IKsPropertySet интерфейсы. Простейшую реализацию, с которой Skype работает я вам и привёл.
3>>Странно, у меня все так же, но Скайп его не видит. Спасибо за инфу, покопаюсь, выходит даром драйвером занимался
ATP>А с какой версией Skype-a, он DShow начиная с 4.1 начал использовать.
Версия скайпа как раз 4.1. Значит что-то у меня не так. Если можете послать такой фильтр буду очень благодарен — думаю у меня в регистрации проблема, зарегистрирую посмотрю какая разница.
Re[3]: DS Filter as Audio Device
От:
Аноним
Дата:
14.03.10 13:31
Оценка:
Здравствуйте, alvas, Вы писали:
A>А это устройство будет видимым только для DirectShow?
Для любых DMO. Но если вопрос, будет ли видеть его windows media, то ответ — нет.
Здравствуйте, Аноним, Вы писали:
A>>А это устройство будет видимым только для DirectShow?
А>Для любых DMO. Но если вопрос, будет ли видеть его windows media, то ответ — нет.