Re: DS Filter as Audio Device
От: amid493 СССР http://gesell-ru.blogspot.com/
Дата: 11.03.10 12:19
Оценка:
кстати задача уточнилась — запись звука не требуется
требуется подсовывать приложениям типа скайп, камфрог звук из этого фильтра
а в фильтр звук будет пихать другое приложение
то есть фильтр по сути будет абсолютно прозрачным
но для указанных приложений он будет выглядеть микрофоном — и эти приложения будут думать и соотв передавать полученный звук из фильтра как будто они получили его из микрофона.
Re[3]: DS Filter as Audio Device
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 11.03.10 12:20
Оценка:
Здравствуйте, amid493, Вы писали:

A>похоже дело в том что фильтр прописался в CLSID_AudioInputDeviceCategory

A>но почему то не прописался в
A>HKEY_CURRENT_USER\Software\Microsoft\ActiveMovie\devenum
A>а скайп похоже именно оттуда берет список устройств

Если все нормально написано, то должен видеть, у меня видит во всяком случае.
Посмотрите создает ли он экземпляр вашего фильтра, какие интерфейсы запрашивает. Поддержите их для фильтра и для принов.
Re[4]: DS Filter as Audio Device
От: amid493 СССР http://gesell-ru.blogspot.com/
Дата: 11.03.10 12:38
Оценка:
ATP>Если все нормально написано, то должен видеть, у меня видит во всяком случае.
ATP>Посмотрите создает ли он экземпляр вашего фильтра, какие интерфейсы запрашивает. Поддержите их для фильтра и для принов.

а можете выложить функцию DllRegisterServer вашего фильтра со всеми соответствующими REGFILTERPINS, REGFILTER2 и тд
?

спасиб)
Re[10]: DS Filter as Audio Device
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 11.03.10 12:38
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Они подразумевались, ибо относятся к поведению любого стандартного звукового устройства Windows, с которым может работать практически любой звуковой софт, если он сделан "для звука вообще", а не заточен под определенный интерфейс. Это, если что, элементарно, и до Вашего появления ни разу не нуждалось в уточнениях. А Ваше наивное удивление похоже на реакцию иного продавца компьютерной лавки: "вы же просили модем — я вам и продал винмодем, откуда я знаю, что вы его под какой-то юникс поставите, я и слов-то таких не знаю".


До какого появления, я с технологией DShow и DSound уже лет 10 работаю и на 95,98,NT и т.д.

ЕМ>Угу — с претензией на то, что он еще и универсальный. Человек спрашивал общее решение, Вы же ему выдали очень частное, но с таким видом, будто всегда и везде только так и делают.


Претензии пока только с вашей стороны Евгений.

ЕМ>Это Вам очень повезло. Ибо мало что в винде сделано настолько криво, как запись звука через DirectSound. Ибо DS изначально проектировался исключительно для быстрого воспроизведения в игрушках, и записи там не было, как класса — ее прикрутили позднее, и откровенно по-босяцки.


Не нужно мне рассказывать об игрушках, я уже 10 лет за работу с мультимедиа деньги получаю и причем неплохие.

ЕМ>Никогда такого не было. Либо драйвер сам экспортировал все необходимые для MME функции (9x/ME/2k/XP/2k3), либо MME транслируется напрямую в WDM/KS.


Куда напрямую и кто прямее — посмотрите картинки по ссылке на MSDN, я вам прислал.
Обе технологии в конце концов обращаются к драйверу, т.ч. разницы нет никакой, но — DSound проще.

ЕМ>Вообще-то, в приличном обществе принято, что заявившему о факте наличия чего-либо следует предоставить и некие конкретные обоснования. Перекладывать бремя доказательство на сомневающихся — типичный подход жулика.


По вашим намекам я делаю вывод что вы как раз из "приличного" общества и считаете себя самым умным

ЕМ>Ага, при этом потеряв изрядное количество времени на прохождение тупикового пути, и не менее изрядно поматерив доброхота, уверенно по этому пути направившего...


Евгений, если вы умеете не только драйвера писать, но считать деньги и время — вы быстро поймете, что пути бывают разными и начинают все обычно с самых простых и проверенных.
Человеку не нужен драйвер, он хочет просто подставить свои данные и все.
Re[5]: DS Filter as Audio Device
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 11.03.10 12:44
Оценка:
Здравствуйте, amid493, Вы писали:


ATP>>Если все нормально написано, то должен видеть, у меня видит во всяком случае.

ATP>>Посмотрите создает ли он экземпляр вашего фильтра, какие интерфейсы запрашивает. Поддержите их для фильтра и для принов.

A>а можете выложить функцию DllRegisterServer вашего фильтра со всеми соответствующими REGFILTERPINS, REGFILTER2 и тд

A>?

Могу, но дело в том что там используются внутренние библиотеки, без которых код неполон, которые выложить у меня нет возможности. Но я вас уверяю что кроме FilterMapper-а там ничего не используется. 99% — фильтр у вас создается но потом отсеивается по причине нехватки каких-нибудь стандартных интерфейсов.
Re[6]: DS Filter as Audio Device
От: amid493 СССР http://gesell-ru.blogspot.com/
Дата: 11.03.10 12:49
Оценка:
ATP>Могу, но дело в том что там используются внутренние библиотеки, без которых код неполон, которые выложить у меня нет возможности. Но я вас уверяю что кроме FilterMapper-а там ничего не используется. 99% — фильтр у вас создается но потом отсеивается по причине нехватки каких-нибудь стандартных интерфейсов.

да полный код и не нужен — нужна фактически только вот эта часть

возможно еще нужно регистрировать в CLSID_SystemDeviceEnum?


REGPINTYPES sudInputTypes = { &MEDIATYPE_Audio, &MEDIASUBTYPE_PCM };   
REGPINTYPES sudOutputTypes = { &MEDIATYPE_Audio, &MEDIASUBTYPE_PCM };   

REGFILTERPINS sudPinReg[] = {   
    // Input pin.   
    { 0, FALSE, // Rendered?   
    FALSE, // Output?   
    FALSE, // Zero?   
    FALSE, // Many?   
    0, 0,    
    1, &sudInputTypes  // Media types.   
    },   
    // Output pin.   
    { 0, FALSE, // Rendered?   
    TRUE, // Output?   
    FALSE, // Zero?   
    FALSE, // Many?   
    0, 0,    
    1, &sudOutputTypes      // Media types.   
    }   
};   
// Declare filter information.   
REGFILTER2 rf2FilterReg = {   
    1,                // Version number.   
    MERIT_DO_NOT_USE, // Merit.   
    2,                // Number of pins.   
    sudPinReg         // Pointer to pin information.   
};   


STDAPI DllRegisterServer()
{
    HRESULT hr = AMovieDllRegisterServer2( TRUE );   
    if (FAILED(hr))   
    {   
        return hr;   
    }   
    IFilterMapper2 *pFM2 = NULL;   
    //CoCreateInstance (CLSID_SystemDeviceEnum, nil, CLSCTX_INPROC_SERVER,
    //    IID_ICreateDevEnum, pSysDevEnum);
    hr = CoCreateInstance(CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER,   
        IID_IFilterMapper2, (void **)&pFM2);   
    if (SUCCEEDED(hr))   
    {   
        hr = pFM2->RegisterFilter(   
            CLSID_WavDest,                // Filter CLSID.    
            sudWavDest.strName,                       // Filter name.   
            NULL,                            // Device moniker.    
            &CLSID_AudioInputDeviceCategory,  // Video compressor category.   
            sudWavDest.strName,                       // Instance data.   
            &rf2FilterReg                    // Filter information.   
            );   
        pFM2->Release();   
    }   
    return hr;   
}
Re[7]: DS Filter as Audio Device
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 11.03.10 12:58
Оценка:
Здравствуйте, amid493, Вы писали:

У меня все также. Эти reg структуры на практике никак не влияют (кроме пожалуй MERIT-а) на процесс подбора фильтра при попытке его присоединить, можете сами попробовать указать любые параметры или нули — dll все равно загрузится и граф будет пытаться вставить зарегистрированный фильтр.
Попробуйте запустить skype из под отладчика и поставьте брикпоинт в конструкторе фильра. Он срабатывает?
Re[8]: DS Filter as Audio Device
От: squid  
Дата: 11.03.10 14:55
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

а еще лучше — добавить вывод отладочной инфыв файл или банальных messagebox штук 5. Skype ведь шифрование трафика использует, не думаю что его просто так дебажить можно...

ATP>Попробуйте запустить skype из под отладчика и поставьте брикпоинт в конструкторе фильра. Он срабатывает?
Re[7]: DS Filter as Audio Device
От: 3dlev  
Дата: 11.03.10 16:08
Оценка:
Не забудьте реализовать интерфейс IKsPropertySet у вас в фильтре — без него многие программы не работают
Re[11]: DS Filter as Audio Device
От: 3dlev  
Дата: 11.03.10 16:16
Оценка:
ATP>Человеку не нужен драйвер, он хочет просто подставить свои данные и все.

Я долго работал над проблемой виртуального источника звука, но в конце концов пришел к драйверу, так как часть программ (в том числе и Скайп, AOL messenger, итд) так и не сработались с решением которое вы предлагаете (может быть потому что они вызывают CreateClassEnumerator со флагом CDEF_DEVMON_PNP_DEVICE ??). Простой вопрос — то, что вы предлагаете со Скайпом когда либо работало?
Re[12]: DS Filter as Audio Device
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 12.03.10 08:17
Оценка:
Здравствуйте, 3dlev, Вы писали:

ATP>>Человеку не нужен драйвер, он хочет просто подставить свои данные и все.


3>Я долго работал над проблемой виртуального источника звука, но в конце концов пришел к драйверу, так как часть программ (в том числе и Скайп, AOL messenger, итд) так и не сработались с решением которое вы предлагаете (может быть потому что они вызывают CreateClassEnumerator со флагом CDEF_DEVMON_PNP_DEVICE ??). Простой вопрос — то, что вы предлагаете со Скайпом когда либо работало?


Да у меня работает, вот прямо сейчас — мои DS фильтры как видео и аудио девайсы скайп видит и берет с них данные.
Re[13]: DS Filter as Audio Device
От: amid493 СССР http://gesell-ru.blogspot.com/
Дата: 12.03.10 09:14
Оценка:
ATP>Да у меня работает, вот прямо сейчас — мои DS фильтры как видео и аудио девайсы скайп видит и берет с них данные.

Плз, можешь показать реализацию IKsPropertySet, IAMStreamConfig, IAMStreamControl в классе фильтра?
Re[14]: DS Filter as Audio Device
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 12.03.10 09:31
Оценка:
Здравствуйте, amid493, Вы писали:


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 return
            return 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 parameters

            int nCapabilityCount;
            int nCapabilitySize;
            GetNumberOfCapabilities(&nCapabilityCount, &nCapabilitySize);

            // Check index

            if (nIndex < 0)
                return E_INVALIDARG; // Negative index

            if (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;
        }
Re[15]: DS Filter as Audio Device
От: amid493 СССР http://gesell-ru.blogspot.com/
Дата: 12.03.10 10:02
Оценка:
ATP>IAMStreamConfig:


ATP>IKsPropertySet:


ок и кто от кого наследуется тут?
AMStreamConfig :IAMStreamConfig
KsPropertySet : IKsPropertySet

а сам фильтр-класс как соотноситься с AMStreamConfig, KsPropertySet?
фильтр-класс : CBaseFilter, AMStreamConfig, KsPropertySet?
Re[15]: DS Filter as Audio Device
От: 3dlev  
Дата: 12.03.10 11:22
Оценка:
Здравствуйте, AcidTheProgrammer, Вы писали:

ATP>>>Да у меня работает, вот прямо сейчас — мои DS фильтры как видео и аудио девайсы скайп видит и берет с них данные.


A>>Плз, можешь показать реализацию IKsPropertySet, IAMStreamConfig, IAMStreamControl в классе фильтра?


ATP>IAMStreamControl — точно не нужен, просто возвращай E_NOTIMPL


ATP>IAMStreamConfig:


...

Странно, у меня все так же, но Скайп его не видит. Спасибо за инфу, покопаюсь, выходит даром драйвером занимался
Re[16]: DS Filter as Audio Device
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 13.03.10 19:51
Оценка:
Здравствуйте, 3dlev, Вы писали:

3>Здравствуйте, AcidTheProgrammer, Вы писали:


ATP>>>>Да у меня работает, вот прямо сейчас — мои DS фильтры как видео и аудио девайсы скайп видит и берет с них данные.


A>>>Плз, можешь показать реализацию IKsPropertySet, IAMStreamConfig, IAMStreamControl в классе фильтра?


ATP>>IAMStreamControl — точно не нужен, просто возвращай E_NOTIMPL


ATP>>IAMStreamConfig:


3>...


3>Странно, у меня все так же, но Скайп его не видит. Спасибо за инфу, покопаюсь, выходит даром драйвером занимался


А с какой версией Skype-a, он DShow начиная с 4.1 начал использовать.
Re[16]: DS Filter as Audio Device
От: AcidTheProgrammer Россия https://hts.tv/
Дата: 13.03.10 19:55
Оценка:
Здравствуйте, amid493, Вы писали:

A>ок и кто от кого наследуется тут?

A>AMStreamConfig :IAMStreamConfig
A>KsPropertySet : IKsPropertySet

да именно так

A>а сам фильтр-класс как соотноситься с AMStreamConfig, KsPropertySet?

A>фильтр-класс : CBaseFilter, AMStreamConfig, KsPropertySet?

QueryIntyerface просто должен поддерживать IAMStreamConfig и IKsPropertySet интерфейсы. Простейшую реализацию, с которой Skype работает я вам и привёл.
Re[17]: DS Filter as Audio Device
От: 3dlev  
Дата: 14.03.10 09:56
Оценка:
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, то ответ — нет.
Re[4]: DS Filter as Audio Device
От: alvas  
Дата: 14.03.10 14:59
Оценка:
Здравствуйте, Аноним, Вы писали:

A>>А это устройство будет видимым только для DirectShow?


А>Для любых DMO. Но если вопрос, будет ли видеть его windows media, то ответ — нет.


У если любые DMO будут видеть — это уже хорошо
http://alvas.net — Аудио-инструменты для .Net разработчиков
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.