I have a Delphi 6 Pro application that uses the DSPACK component library to send audio to Skype from the system's preferred audio input device. I use the TSampleGrabber component to connect to the Filter Graph chain, and then send the audio buffers to Skype. The problem is that I only receive once a second. In other words, the OnBuffer () event for the TSampleGrabber instance is fired only once per second with the full second data value in the Buffer parameter. I need to know how to change the Filter Graph chain so that it captures data from the input device faster than once per second. If possible, I would like to do it as fast as every 50 ms, or at least every 100 ms.
The My Filter Graph chain consists of a TFilter that is displayed on the preferred audio input device at the top. I connect the output terminals of this filter to the “WAV Dest” input pins assigned by TFilter, so I can get samples in WMA format in PCM format. Then I connect the output pins of the WAV Dest filter to the input pins of the TSampleGrabber instance. What do I need to change to fire the TSampleGrabber OnBuffer () event for a faster transition?
UPDATE . Based on Roman R's answer, I was able to implement a solution, which I will show below. One record. His link led me to the following blog post, which was helpful in solving:
http://sid6581.wordpress.com/2006/10/09/minimizing-audio-capture-latency-in-directshow/
var
intfCapturePin: IPin;
...............
with FFiltAudCap as IBaseFilter do
CheckDSError(findPin(StringToOleStr('Capture'), intfCapturePin));
if not Assigned(intfCapturePin) then
raise Exception.Create('Unable to find the audio input device' Capture output pin.');
setBufferLatency(intfCapturePin as IAMBufferNegotiation, 50, theMediaType);
..................
procedure setBufferLatency(
// A buffer negotiation interface pointer.
intfBufNegotiate: IAMBufferNegotiation;
// The desired latency in milliseconds.
bufLatencyMS: WORD;
// The media type the audio stream is set to.
theMediaType: TMediaType);
var
allocProp: _AllocatorProperties;
wfex: TWaveFormatEx;
begin
if not Assigned(intfBufNegotiate) then
raise Exception.Create('The buffer negotiation interface object is unassigned.');
wfex := getWaveFormat(theMediaType);
if wfex.nAvgBytesPerSec = 0 then
raise Exception.Create('The average bytes per second value for the given Media Type is 0.');
allocProp.cbAlign := -1;
allocProp.cbBuffer := Trunc(wfex.nAvgBytesPerSec * (bufLatencyMS / 1000));
allocProp.cbPrefix := -1;
allocProp.cBuffers := -1;
CheckDSError(intfBufNegotiate.SuggestAllocatorProperties(allocProp));
end;