I have developed an audio capture filter for direct show that appears in FMLE as an available audio capture source. When I select this device I get the error message "Audio format provided by audio capture device is not supported by this application". This direct show filter (device) outputs PCM (wav) stereo audio, 2 channels at a 44.1k sample rate which is pretty generic and the same format provided by another capture device on my system.
Why is FMLE reporting this error? The FMLE documentation says that it supports any direct show available capture devices so my direct show filter should work. My filter works in other applications and with the graphedit application included with the windows SDK.
Can anyone shed any light on what is required from a direct show filter for audio to work with FMLE. My filter does video as well from my capture device and that work perfectly.
What am I missing?
PLEASE HELP!!!!
thanks.
I have the same problem described above with the "MV Audio Pipe Source" listed below. I've provided 3 other capture devices for comparison. Is it possible that FMLE isn't working with the "MV Audio Pipe Source" (virtual) capture device because FMLE expects a higher or lower quality input format? My other devices output 23 different audio sampling rates. The "MV Audio Pipe Source" only outputs 1 audio sampling rate. See below.
using device: MV Audio Pipe Source
EnumDeviceCaps: output pin: Capture
EnumDeviceCaps: trying pin Capture
EnumDeviceCaps: input pin default format configured
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:44100 bits/sample:16
using device: Dazzle DVC100 Audio Device
EnumDeviceCaps: output pin: Capture
EnumDeviceCaps: input pin: Microphone
EnumDeviceCaps: trying pin Capture
EnumDeviceCaps: input pin default format configured
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:44100 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:44100 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:44100 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:32000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:32000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:22050 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:22050 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:11025 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:11025 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:8000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:8000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:44100 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:44100 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:22050 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:22050 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:11025 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:11025 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:8000 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:8000 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:48000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:48000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:96000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:96000 bits/sample:16
using device: Osprey-230 Audio Device 1
EnumDeviceCaps: output pin: Capture
EnumDeviceCaps: input pin: Unbalanced
EnumDeviceCaps: input pin: Balanced
EnumDeviceCaps: trying pin Capture
EnumDeviceCaps: input pin default format configured
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:44100 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:44100 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:44100 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:32000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:32000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:22050 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:22050 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:11025 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:11025 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:8000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:8000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:44100 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:44100 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:22050 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:22050 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:11025 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:11025 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:8000 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:8000 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:48000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:48000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:96000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:96000 bits/sample:16
using device: USB 2821 Device
EnumDeviceCaps: output pin: Capture
EnumDeviceCaps: input pin: Line
EnumDeviceCaps: trying pin Capture
EnumDeviceCaps: input pin default format configured
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:44100 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:44100 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:44100 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:32000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:32000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:22050 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:22050 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:11025 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:11025 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:8000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:8000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:44100 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:44100 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:22050 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:22050 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:11025 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:11025 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:8000 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:8000 bits/sample:8
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:48000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:48000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:2, samples/sec:96000 bits/sample:16
EnumDeviceCaps: input pin accepts format: araw, channels:1, samples/sec:96000 bits/sample:16
I implemented a virtual a/v source filter to link with FMLE and it was not easy to figure out given the lack of debug information from the FMLE encoder.
Basically the audio pin needs to implement AUDIO_STREAM_CONFIG_CAPS and correctly return this in the GetStreamCaps call.
Since I only supported the audio format fed into the virtual filter I only needed one stream type. Video was super easy but the audio took me a while to figure out. When connected I feed in 44.1 audio with 2 channels and that seems to be ok with FMLE.
You also need to implement IAMBufferNegotiation
STDMETHODIMP CMyFilterOutputPin::SuggestAllocatorProperties(const ALLOCATOR_PROPERTIES *pprop)
{
return S_OK;
}
STDMETHODIMP CMyFilterOutputPin::GetAllocatorProperties(ALLOCATOR_PROPERTIES *pprop)
{
this->m_pAllocator->GetProperties(pprop);
return S_OK;
}
STDMETHODIMP CMyFilterOutputPin::GetNumberOfCapabilities(int *piCount,int *piSize)
{
*piCount = 0;
if (m_mt.majortype == MEDIATYPE_Audio)
{
*piCount = 1;
*piSize = sizeof(AUDIO_STREAM_CONFIG_CAPS);
return S_OK;
}
return S_OK;
}
STDMETHODIMP CMyFilterOutputPin::GetStreamCaps(int iIndex, AM_MEDIA_TYPE **ppMediaType, BYTE *pSCC)
{
if(iIndex < 0)
return E_INVALIDARG;
if(iIndex > 0)
return S_FALSE;
if(pSCC == NULL)
return E_POINTER;
(*ppMediaType) = ::CreateMediaType((const AM_MEDIA_TYPE*)&m_mt);
if (*ppMediaType == NULL)
return E_OUTOFMEMORY;
WAVEFORMATEX* pMainAudioFormat = (WAVEFORMATEX*)(m_mt.pbFormat);
AUDIO_STREAM_CONFIG_CAPS* pASCC = (AUDIO_STREAM_CONFIG_CAPS*) pSCC;
ZeroMemory(pASCC, sizeof(AUDIO_STREAM_CONFIG_CAPS));
pASCC->guid = MEDIATYPE_Audio;
pASCC->ChannelsGranularity = pMainAudioFormat->nChannels;
pASCC->MaximumChannels = pMainAudioFormat->nChannels;
pASCC->MinimumChannels = pMainAudioFormat->nChannels;
pASCC->MaximumSampleFrequency = pMainAudioFormat->nSamplesPerSec;
pASCC->BitsPerSampleGranularity = pMainAudioFormat->wBitsPerSample;
pASCC->MaximumBitsPerSample = pMainAudioFormat->wBitsPerSample;
pASCC->MinimumBitsPerSample = pMainAudioFormat->wBitsPerSample;
pASCC->MinimumSampleFrequency = pMainAudioFormat->nSamplesPerSec;
pASCC->SampleFrequencyGranularity = pMainAudioFormat->nSamplesPerSec;
return S_OK;
}
Thank you for the help I really appreciate it. Unfortunately FME still rejects my stream! Gah! Would it be possible/too much for me to ask for you to e-mail me your source code so I can compare it with my own? (rogerdpack@gmail.com). I wouldn't release it, of course, just compare it with mine (https://github.com/rdp/virtual-audio-capture-grabber-device) or if you can see an immediate problem then please do let me know ![]()
Thanks much!
-roger-
Ok following the suggestion that cyberhex gave me (I thought I had implemented IAMBufferNegotiation but hadn't all the way--I needed to pass back a cast version from QueryInterface as well), it now works (after also making setFormat so that it rejects bad media types--weird).
Also it only supports 16 bit PCM so don't try using 32 ![]()
Thanks so much!
North America
Europe, Middle East and Africa
Asia Pacific