62 *
out = &
filter->IAMBufferNegotiation_iface;
79 if (!
IsEqualGUID(&mt->formattype, &FORMAT_WaveFormatEx))
140 mt->majortype = MEDIATYPE_Audio;
141 mt->subtype = MEDIASUBTYPE_PCM;
142 mt->bFixedSizeSamples =
TRUE;
143 mt->lSampleSize =
format->nBlockAlign;
144 mt->formattype = FORMAT_WaveFormatEx;
171 if (
filter->props.cbBuffer == -1)
172 props->cbBuffer = (
format->nAvgBytesPerSec / 2) & ~1;
175 if (
filter->props.cbAlign == -1 ||
filter->props.cbAlign == 0)
187 ERR(
"Failed to open device %u, error %u.\n",
filter->id,
ret);
220 return IPin_QueryInterface(&
filter->source.pin.IPin_iface, iid,
out);
226 return IPin_AddRef(&
filter->source.pin.IPin_iface);
232 return IPin_Release(&
filter->source.pin.IPin_iface);
240 TRACE(
"iface %p, mt %p.\n", iface, mt);
265 TRACE(
"iface %p, mt %p.\n", iface, ret_mt);
293 *
size =
sizeof(AUDIO_STREAM_CONFIG_CAPS);
301 AUDIO_STREAM_CONFIG_CAPS *audio_caps = (
void *)caps;
305 TRACE(
"filter %p, index %d, ret_mt %p, caps %p.\n",
filter,
index, ret_mt, caps);
321 audio_caps->guid = MEDIATYPE_Audio;
322 audio_caps->MinimumChannels = 1;
323 audio_caps->MaximumChannels = 2;
324 audio_caps->ChannelsGranularity = 1;
325 audio_caps->MinimumBitsPerSample = 8;
326 audio_caps->MaximumBitsPerSample = 16;
327 audio_caps->BitsPerSampleGranularity = 8;
328 audio_caps->MinimumSampleFrequency = 11025;
329 audio_caps->MaximumSampleFrequency = 44100;
330 audio_caps->SampleFrequencyGranularity = 11025;
354 return IPin_QueryInterface(&
filter->source.pin.IPin_iface, iid,
out);
360 return IPin_AddRef(&
filter->source.pin.IPin_iface);
366 return IPin_Release(&
filter->source.pin.IPin_iface);
375 TRACE(
"Requested %ld buffers, size %ld, alignment %ld, prefix %ld.\n",
388 FIXME(
"iface %p, props %p, stub!\n", iface,
props);
409 return IPin_QueryInterface(&
filter->source.pin.IPin_iface, iid,
out);
415 return IPin_AddRef(&
filter->source.pin.IPin_iface);
421 return IPin_Release(&
filter->source.pin.IPin_iface);
427 FIXME(
"iface %p, set %s, id %lu, instance %p, instance_size %lu, data %p, size %lu, stub!\n",
437 TRACE(
"filter %p, set %s, id %lu, instance %p, instance_size %lu, data %p, size %lu, ret_size %p.\n",
448 FIXME(
"Unknown id %lu, returning E_PROP_ID_UNSUPPORTED.\n",
id);
453 FIXME(
"Unexpected instance data %p, size %lu.\n",
instance, instance_size);
460 *(
GUID *)
data = PIN_CATEGORY_CAPTURE;
491 return &
filter->source.pin;
499 filter->state_cs.DebugInfo->Spare[0] = 0;
513 *
out = &
filter->IPersistPropertyBag_iface;
525 bool started =
false;
547 ERR(
"Failed to get sample, hr %#lx.\n",
hr);
556 ERR(
"Failed to prepare header, error %u.\n",
ret);
559 ERR(
"Failed to add buffer, error %u.\n",
ret);
564 ERR(
"Failed to start, error %u.\n",
ret);
573 ERR(
"Failed to wait, error %u.\n",
ret);
582 ERR(
"Failed to reset, error %u.\n",
ret);
586 ERR(
"Failed to unprepare header, error %u.\n",
ret);
588 IMediaSample_SetActualDataLength(
sample,
header.dwBytesRecorded);
597 ERR(
"Failed to get position, error %u.\n",
ret);
599 ERR(
"Got unexpected type %#x.\n",
time.wType);
602 IMediaSample_SetTime(
sample, &start_pts, &end_pts);
607 ERR(
"IMemInputPin::Receive() returned %#lx.\n",
hr);
608 IMediaSample_Release(
sample);
613 IMediaSample_Release(
sample);
619 ERR(
"Failed to stop, error %u.\n",
ret);
629 if (!
filter->source.pin.peer)
633 ERR(
"Failed to commit allocator, hr %#lx.\n",
hr);
648 if (!
filter->source.pin.peer)
662 if (!
filter->source.pin.peer)
677 if (!
filter->source.pin.peer)
690 hr = IMemAllocator_Decommit(
filter->source.pAllocator);
692 ERR(
"Failed to decommit allocator, hr %#lx.\n",
hr);
742 TRACE(
"(%p/%p)->(%p)\n", iface,
This, pClassID);
743 return IBaseFilter_GetClassID(&
This->filter.IBaseFilter_iface, pClassID);
749 FIXME(
"(%p/%p)->(): stub\n", iface,
This);
759 TRACE(
"filter %p, bag %p, error_log %p.\n",
filter, bag, error_log);
762 if (
FAILED(
hr = IPropertyBag_Read(bag,
L"WaveInID", &
var, error_log)))
773 BOOL fClearDirty,
BOOL fSaveAllProperties)
776 FIXME(
"(%p/%p)->(%p, %u, %u): stub\n", iface,
This, pPropBag, fClearDirty, fSaveAllProperties);
796 if (!(
object =
calloc(1,
sizeof(*
object))))
812 object->props.cBuffers = -1;
813 object->props.cbBuffer = -1;
814 object->props.cbAlign = -1;
815 object->props.cbPrefix = -1;
825 object->state = State_Stopped;
828 object->state_cs.DebugInfo->Spare[0] = (
DWORD_PTR)(__FILE__
": audio_record.state_cs");
830 TRACE(
"Created audio recorder %p.\n",
object);
831 *
out = &
object->filter.IUnknown_inner;
static struct audio_record * impl_from_strmbase_filter(struct strmbase_filter *filter)
static HRESULT WINAPI PPB_InitNew(IPersistPropertyBag *iface)
static HRESULT audio_record_init_stream(struct strmbase_filter *iface)
static HRESULT WINAPI audio_record_source_DecideBufferSize(struct strmbase_source *iface, IMemAllocator *allocator, ALLOCATOR_PROPERTIES *props)
static ULONG WINAPI property_set_AddRef(IKsPropertySet *iface)
static HRESULT fill_media_type(struct audio_record *filter, unsigned int index, AM_MEDIA_TYPE *mt)
static HRESULT WINAPI stream_config_GetNumberOfCapabilities(IAMStreamConfig *iface, int *count, int *size)
static HRESULT WINAPI property_set_Get(IKsPropertySet *iface, const GUID *set, DWORD id, void *instance, DWORD instance_size, void *data, DWORD size, DWORD *ret_size)
static HRESULT WINAPI property_set_QueryInterface(IKsPropertySet *iface, REFIID iid, void **out)
static struct audio_record * impl_from_IAMStreamConfig(IAMStreamConfig *iface)
static ULONG WINAPI stream_config_AddRef(IAMStreamConfig *iface)
static struct audio_record * impl_from_IPersistPropertyBag(IPersistPropertyBag *iface)
static HRESULT WINAPI PPB_GetClassID(IPersistPropertyBag *iface, CLSID *pClassID)
static HRESULT WINAPI property_set_Set(IKsPropertySet *iface, const GUID *set, DWORD id, void *instance, DWORD instance_size, void *data, DWORD size)
static ULONG WINAPI buffer_negotiation_AddRef(IAMBufferNegotiation *iface)
static HRESULT audio_record_wait_state(struct strmbase_filter *iface, DWORD timeout)
static const IAMStreamConfigVtbl stream_config_vtbl
static HRESULT audio_record_start_stream(struct strmbase_filter *iface, REFERENCE_TIME time)
static HRESULT WINAPI property_set_QuerySupported(IKsPropertySet *iface, const GUID *set, DWORD id, DWORD *support)
static HRESULT audio_record_cleanup_stream(struct strmbase_filter *iface)
static const IKsPropertySetVtbl property_set_vtbl
static ULONG WINAPI stream_config_Release(IAMStreamConfig *iface)
static void audio_record_destroy(struct strmbase_filter *iface)
static HRESULT audio_record_source_query_interface(struct strmbase_pin *iface, REFIID iid, void **out)
HRESULT audio_record_create(IUnknown *outer, IUnknown **out)
static ULONG WINAPI PPB_AddRef(IPersistPropertyBag *iface)
static ULONG WINAPI property_set_Release(IKsPropertySet *iface)
static ULONG WINAPI PPB_Release(IPersistPropertyBag *iface)
static const IAMBufferNegotiationVtbl buffer_negotiation_vtbl
static HRESULT WINAPI buffer_negotiation_GetAllocatorProperties(IAMBufferNegotiation *iface, ALLOCATOR_PROPERTIES *props)
static const struct strmbase_source_ops source_ops
static struct strmbase_pin * audio_record_get_pin(struct strmbase_filter *iface, unsigned int index)
static HRESULT WINAPI PPB_Load(IPersistPropertyBag *iface, IPropertyBag *bag, IErrorLog *error_log)
static struct audio_record * impl_from_IAMBufferNegotiation(IAMBufferNegotiation *iface)
static HRESULT audio_record_query_interface(struct strmbase_filter *iface, REFIID iid, void **out)
static const struct @327 audio_formats[]
static const struct strmbase_filter_ops filter_ops
static HRESULT audio_record_source_get_media_type(struct strmbase_pin *iface, unsigned int index, AM_MEDIA_TYPE *mt)
static HRESULT WINAPI stream_config_GetFormat(IAMStreamConfig *iface, AM_MEDIA_TYPE **ret_mt)
static HRESULT WINAPI PPB_Save(IPersistPropertyBag *iface, IPropertyBag *pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties)
static HRESULT WINAPI stream_config_GetStreamCaps(IAMStreamConfig *iface, int index, AM_MEDIA_TYPE **ret_mt, BYTE *caps)
static DWORD WINAPI stream_thread(void *arg)
static HRESULT WINAPI stream_config_SetFormat(IAMStreamConfig *iface, AM_MEDIA_TYPE *mt)
static HRESULT audio_record_stop_stream(struct strmbase_filter *iface)
static void audio_record_source_disconnect(struct strmbase_source *iface)
static HRESULT WINAPI PPB_QueryInterface(IPersistPropertyBag *iface, REFIID riid, LPVOID *ppv)
static HRESULT WINAPI stream_config_QueryInterface(IAMStreamConfig *iface, REFIID iid, void **out)
static const IPersistPropertyBagVtbl PersistPropertyBagVtbl
static ULONG WINAPI buffer_negotiation_Release(IAMBufferNegotiation *iface)
static HRESULT WINAPI buffer_negotiation_QueryInterface(IAMBufferNegotiation *iface, REFIID iid, void **out)
static HRESULT audio_record_source_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt)
static struct audio_record * impl_from_IKsPropertySet(IKsPropertySet *iface)
static HRESULT WINAPI buffer_negotiation_SuggestAllocatorProperties(IAMBufferNegotiation *iface, const ALLOCATOR_PROPERTIES *props)
@ AMPROPERTY_PIN_CATEGORY
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
const GUID IID_IKsPropertySet
static HINSTANCE instance
void *WINAPI CoTaskMemAlloc(SIZE_T size)
void WINAPI CoTaskMemFree(void *ptr)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
BOOL WINAPI SleepConditionVariableCS(PCONDITION_VARIABLE ConditionVariable, PCRITICAL_SECTION CriticalSection, DWORD Timeout)
VOID WINAPI InitializeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount, IN DWORD flags)
VOID WINAPI WakeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
GLuint GLuint GLsizei count
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
static void ULONG ULONG * ret_size
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
const GUID IID_IPersistPropertyBag
#define IsEqualGUID(rguid1, rguid2)
HRESULT WINAPI CopyMediaType(AM_MEDIA_TYPE *pDest, const AM_MEDIA_TYPE *pSrc)
void WINAPI FreeMediaType(AM_MEDIA_TYPE *pMediaType)
HRESULT WINAPI BaseOutputPinImpl_DecideAllocator(struct strmbase_source *pin, IMemInputPin *peer, IMemAllocator **allocator)
void strmbase_source_init(struct strmbase_source *pin, struct strmbase_filter *filter, const WCHAR *name, const struct strmbase_source_ops *func_table)
void strmbase_dump_media_type(const AM_MEDIA_TYPE *mt)
void strmbase_filter_cleanup(struct strmbase_filter *filter)
void strmbase_source_cleanup(struct strmbase_source *pin)
void strmbase_filter_init(struct strmbase_filter *filter, IUnknown *outer, const CLSID *clsid, const struct strmbase_filter_ops *func_table)
HRESULT WINAPI BaseOutputPinImpl_AttemptConnection(struct strmbase_source *pin, IPin *peer, const AM_MEDIA_TYPE *mt)
CRITICAL_SECTION state_cs
IAMStreamConfig IAMStreamConfig_iface
CONDITION_VARIABLE state_cv
IPersistPropertyBag IPersistPropertyBag_iface
IKsPropertySet IKsPropertySet_iface
IAMBufferNegotiation IAMBufferNegotiation_iface
ALLOCATOR_PROPERTIES props
struct strmbase_filter * filter
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
#define CONTAINING_RECORD(address, type, field)
#define E_PROP_ID_UNSUPPORTED
#define E_PROP_SET_UNSUPPORTED
#define VFW_E_NOT_COMMITTED
#define VFW_S_NO_MORE_ITEMS
static const WCHAR props[]
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
UINT WINAPI waveInGetPosition(HWAVEIN hWaveIn, LPMMTIME lpTime, UINT uSize)
UINT WINAPI waveInAddBuffer(HWAVEIN hWaveIn, WAVEHDR *lpWaveInHdr, UINT uSize)
UINT WINAPI waveInPrepareHeader(HWAVEIN hWaveIn, WAVEHDR *lpWaveInHdr, UINT uSize)
UINT WINAPI waveInStop(HWAVEIN hWaveIn)
UINT WINAPI waveInUnprepareHeader(HWAVEIN hWaveIn, WAVEHDR *lpWaveInHdr, UINT uSize)
UINT WINAPI waveInReset(HWAVEIN hWaveIn)
MMRESULT WINAPI waveInOpen(HWAVEIN *lphWaveIn, UINT uDeviceID, LPCWAVEFORMATEX lpFormat, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD dwFlags)
UINT WINAPI waveInClose(HWAVEIN hWaveIn)
UINT WINAPI waveInStart(HWAVEIN hWaveIn)
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO