Мой класс MyPlugIn наследуется от CTransInPlaceFilter, CPersistStream, ISpecifyPropertyPages и моего класса Filter, в котором реализовано, как обрабатывать звук. Я так понял по документации и т. д., что когда приложение (звуковой редактор) коннектит свой OutputPin к моему InputPin, то вызывает через IMemInputPin*, относящиийся к моему InputPin, GetAllocatorRequirements, затем GetAllocator, а затем по результатам делает DecideBufferSize. Поскольку GetAllocator определён в CTransInPlaceInputPin, то надо написать свой GetAllocatorRequirements и задать в нём свои ALLOCATOR_PROPERTIES. Для этого я пишу MyTransInPlaceInputPin:
class MyTransInPlaceInputPin : public CTransInPlaceInputPin{
m_pOutput=new CTransInPlaceOutputPin(NAME("NXInPlace output pin"), this, &hr, L"Output");
// a failed return code should delete the object
ASSERT(SUCCEEDED(hr));
if(!m_pOutput){
delete m_pInput;
m_pInput=0;
}
}
ASSERT(n==0 || n==1);
// Return the appropriate pin
switch(n){
case 0:
return m_pInput;
case 1:
return m_pOutput;
default:
return 0;
}
}
Он практически содран из CTransInPlaceFilter::GetPin.
Далее пишу GetAllocatorRequirements
HRESULT __stdcall MyTransInPlaceInputPin::GetAllocatorRequirements(ALLOCATOR_PROPERTIES* pProps){
Здесь DbgLog выводит в файл, что я установил, поэтому я знаю,что этот код точно исполняется.
Когда начинается обработка звука в функции
HRESULT MyPlugIn::Transform(IMediaSample* pSample), то я тем же DbgLog вывожу
long int size_buf=pSample->GetActualDataLength(); Под этим значением я и понимаю размер буфера. И он равен в редакторе Cool Edit Pro 11024 для всех буферов. Для других редакторов другой размер, но он все равно не равен тому, что я выставил, т. е. 8192.