2012-05-31 3 views
0

Я использую SampleGrabber для получения аудиоданных, однако мой метод BufferCB не выполняется. Что я делаю не так ?BufferCB не вызывается SampleGrabber

//add Sample Grabber 
      IBaseFilter pSampleGrabber = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_SampleGrabber)); 
      hr = pGraph.AddFilter(pSampleGrabber, "SampleGrabber"); 
      checkHR(hr, "Can't add Sample Grabber"); 

     AMMediaType pSampleGrabber_pmt = new AMMediaType(); 
     //pSampleGrabber_pmt.majorType = MediaType.Audio; 
     pSampleGrabber_pmt.subType = MediaSubType.PCM; 
     pSampleGrabber_pmt.formatType = FormatType.WaveEx; 
     pSampleGrabber_pmt.fixedSizeSamples = true; 
     pSampleGrabber_pmt.formatSize = 18; 
     pSampleGrabber_pmt.sampleSize = 2; 

     WaveFormatEx pSampleGrabber_Format = new WaveFormatEx(); 
     pSampleGrabber_Format.wFormatTag = 1; 
     pSampleGrabber_Format.nChannels = 1; 
     pSampleGrabber_Format.nSamplesPerSec = 48000; 
     pSampleGrabber_Format.nAvgBytesPerSec = 96000; 
     pSampleGrabber_Format.nBlockAlign = 2; 
     pSampleGrabber_Format.wBitsPerSample = 16; 
     pSampleGrabber_pmt.formatPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(pSampleGrabber_Format)); 
     Marshal.StructureToPtr(pSampleGrabber_Format, pSampleGrabber_pmt.formatPtr, false); 
     hr = ((ISampleGrabber)pSampleGrabber).SetMediaType(pSampleGrabber_pmt); 
     DsUtils.FreeAMMediaType(pSampleGrabber_pmt); 
     checkHR(hr, "Can't set media type to sample grabber"); 

     ISampleGrabber pGrabber = new SampleGrabber() as ISampleGrabber; 
     pGrabber = (ISampleGrabber)pSampleGrabber; 
     pGrabber.SetCallback(null, 1); 

Мой метод BufferCB подобен

public int BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen) 
     { 

      return 0; 
     } 

ответ

1

Вы создали и настроили один экземпляр pSampleGrabber, а затем вы подключаете свой обратный вызов на другой неиспользуемый на холостом ходу, например pGrabber.

Вам нужно

pSampleGrabber as ISampleGrabber 

вместо

new SampleGrabber() as ISampleGrabber 
+0

Я получаю ошибку «Ссылка на объект требуется для нестатических полей, методы или свойства» – CharlesBryan

+0

ээ, вы делаете еще более странные вещи. 'pGrabber = new ...' абсолютно бесполезен, так как вы неидеально освобождаете этот экземпляр. 'SetCallback (null' - что вы ожидаете здесь? Вы передаете« null », где ожидается ваш обратный вызов ... –

+0

Ой, я вижу .. Итак, мне нужно реализовать ISampleGrabberCB, а затем разместить мою реализацию BufferCB там? – CharlesBryan