-/************************************************************************/
+/************************************************************************/
/*! \class RtAudio
\brief Realtime audio i/o C++ classes.
#ifndef INITGUID
#define INITGUID
#endif
+
+#include <mfapi.h>
+#include <mferror.h>
+#include <mfplay.h>
+#include <mftransform.h>
+#include <wmcodecdsp.h>
+
#include <audioclient.h>
#include <avrt.h>
#include <mmdeviceapi.h>
#include <functiondiscoverykeys_devpkey.h>
-#include <mfapi.h>
-#include <mferror.h>
-#include <mfplay.h>
-#include <Wmcodecdsp.h>
+#ifndef MF_E_TRANSFORM_NEED_MORE_INPUT
+ #define MF_E_TRANSFORM_NEED_MORE_INPUT _HRESULT_TYPEDEF_(0xc00d6d72)
+#endif
+
+#ifndef MFSTARTUP_NOSOCKET
+ #define MFSTARTUP_NOSOCKET 0x1
+#endif
-#pragma comment( lib, "mfplat.lib" )
-#pragma comment( lib, "mfuuid.lib" )
-#pragma comment( lib, "wmcodecdspuuid" )
+#ifdef _MSC_VER
+ #pragma comment( lib, "ksuser" )
+ #pragma comment( lib, "mfplat.lib" )
+ #pragma comment( lib, "mfuuid.lib" )
+ #pragma comment( lib, "wmcodecdspuuid" )
+#endif
//=============================================================================
, _sampleRatio( ( float ) outSampleRate / inSampleRate )
, _transformUnk( NULL )
, _transform( NULL )
- , _resamplerProps( NULL )
, _mediaType( NULL )
, _inputMediaType( NULL )
, _outputMediaType( NULL )
+
+ #ifdef __IWMResamplerProps_FWD_DEFINED__
+ , _resamplerProps( NULL )
+ #endif
{
// 1. Initialization
_transformUnk->QueryInterface( IID_PPV_ARGS( &_transform ) );
- _transformUnk->QueryInterface( IID_PPV_ARGS( &_resamplerProps ) );
- _resamplerProps->SetHalfFilterLength( 60 ); // best conversion quality
+ #ifdef __IWMResamplerProps_FWD_DEFINED__
+ _transformUnk->QueryInterface( IID_PPV_ARGS( &_resamplerProps ) );
+ _resamplerProps->SetHalfFilterLength( 60 ); // best conversion quality
+ #endif
- // 3. Specify input / output format
+ // 3. Specify input / output format
MFCreateMediaType( &_mediaType );
_mediaType->SetGUID( MF_MT_MAJOR_TYPE, MFMediaType_Audio );
// 4. Send stream start messages to Resampler
- _transform->ProcessMessage( MFT_MESSAGE_COMMAND_FLUSH, NULL );
- _transform->ProcessMessage( MFT_MESSAGE_NOTIFY_BEGIN_STREAMING, NULL );
- _transform->ProcessMessage( MFT_MESSAGE_NOTIFY_START_OF_STREAM, NULL );
+ _transform->ProcessMessage( MFT_MESSAGE_COMMAND_FLUSH, 0 );
+ _transform->ProcessMessage( MFT_MESSAGE_NOTIFY_BEGIN_STREAMING, 0 );
+ _transform->ProcessMessage( MFT_MESSAGE_NOTIFY_START_OF_STREAM, 0 );
}
~WasapiResampler()
{
// 8. Send stream stop messages to Resampler
- _transform->ProcessMessage( MFT_MESSAGE_NOTIFY_END_OF_STREAM, NULL );
- _transform->ProcessMessage( MFT_MESSAGE_NOTIFY_END_STREAMING, NULL );
+ _transform->ProcessMessage( MFT_MESSAGE_NOTIFY_END_OF_STREAM, 0 );
+ _transform->ProcessMessage( MFT_MESSAGE_NOTIFY_END_STREAMING, 0 );
// 9. Cleanup
SAFE_RELEASE( _transformUnk );
SAFE_RELEASE( _transform );
- SAFE_RELEASE( _resamplerProps );
SAFE_RELEASE( _mediaType );
SAFE_RELEASE( _inputMediaType );
SAFE_RELEASE( _outputMediaType );
+
+ #ifdef __IWMResamplerProps_FWD_DEFINED__
+ SAFE_RELEASE( _resamplerProps );
+ #endif
}
void Convert( char* outBuffer, const char* inBuffer, unsigned int inSampleCount, unsigned int& outSampleCount )
DWORD rStatus;
DWORD rBytes = outputBufferSize; // maximum bytes accepted per ProcessOutput
- // 7.1 Create Sample object for output data
+ // 7.1 Create Sample object for output data
memset( &rOutDataBuffer, 0, sizeof rOutDataBuffer );
MFCreateSample( &( rOutDataBuffer.pSample ) );
IUnknown* _transformUnk;
IMFTransform* _transform;
- IWMResamplerProps* _resamplerProps;
IMFMediaType* _mediaType;
IMFMediaType* _inputMediaType;
IMFMediaType* _outputMediaType;
+
+ #ifdef __IWMResamplerProps_FWD_DEFINED__
+ IWMResamplerProps* _resamplerProps;
+ #endif
};
//-----------------------------------------------------------------------------
}
// Convert callback buffer to user sample rate
- unsigned int deviceBufferOffset = convBufferSize * stream_.nDeviceChannels[INPUT] * formatBytes( stream_.userFormat );
+ unsigned int deviceBufferOffset = convBufferSize * stream_.nDeviceChannels[INPUT] * formatBytes( stream_.deviceFormat[INPUT] );
unsigned int convSamples = 0;
captureResampler->Convert( stream_.deviceBuffer + deviceBufferOffset,
CoUninitialize();
+ if ( !errorText_.empty() )
+ error( errorType );
+
// update stream state
stream_.state = STREAM_STOPPED;
-
- if ( errorText_.empty() )
- return;
- else
- error( errorType );
}
//******************** End of __WINDOWS_WASAPI__ *********************//