11 #include "cores/AudioEngine/Interfaces/AESink.h"    12 #include "cores/AudioEngine/Utils/AEDeviceInfo.h"    16 #include <mmdeviceapi.h>    18 #include <wrl/implements.h>    22 #include <xaudio2fx.h>    23 #pragma comment(lib,"xaudio2.lib")    28     virtual const char *GetName() { 
return "XAudio"; }
    33     static void Register();
    34     static std::unique_ptr<IAESink> Create(std::string& device, 
AEAudioFormat& desiredFormat);
    36     bool Initialize (
AEAudioFormat &format, std::string &device) 
override;
    37     void Deinitialize() 
override;
    40     double GetCacheTotal() 
override;
    41     double GetLatency() 
override;
    42     unsigned int AddPackets(uint8_t **data, 
unsigned int frames, 
unsigned int offset) 
override;
    43     void Drain() 
override;
    45     static void EnumerateDevicesEx(AEDeviceInfoList &deviceInfoList, 
bool force = 
false);
    57         sink->m_framesInBuffers -= frames;
    62     struct VoiceCallback : 
public IXAudio2VoiceCallback
    66         mBufferEnd.reset(CreateEventEx(
nullptr, 
nullptr, 0, EVENT_MODIFY_STATE | SYNCHRONIZE));
    69           throw std::exception(
"CreateEvent");
    72       virtual ~VoiceCallback() { }
    74       STDMETHOD_(
void, OnVoiceProcessingPassStart) (UINT32) 
override {}
    75       STDMETHOD_(
void, OnVoiceProcessingPassEnd)() 
override {}
    76       STDMETHOD_(
void, OnStreamEnd)() 
override {}
    77       STDMETHOD_(
void, OnBufferStart)(
void*) 
override {}
    78       STDMETHOD_(
void, OnBufferEnd)(
void* context) 
override    80         SetEvent(mBufferEnd.get());
    81         struct buffer_ctx *ctx = 
static_cast<struct buffer_ctx*
>(context);
    85       STDMETHOD_(
void, OnLoopEnd)(
void*) 
override {}
    86       STDMETHOD_(
void, OnVoiceError)(
void*, HRESULT) 
override {}
    90         void operator()(
HANDLE h)
 const    92           assert(h != INVALID_HANDLE_VALUE);
    97       std::unique_ptr<void, handle_closer> mBufferEnd;
   100     bool InitializeInternal(std::string deviceId, 
AEAudioFormat &format);
   103     Microsoft::WRL::ComPtr<IXAudio2> m_xAudio2;
   104     IXAudio2MasteringVoice* m_masterVoice;
   105     IXAudio2SourceVoice* m_sourceVoice;
   106     VoiceCallback m_voiceCallback;
   109     unsigned int m_encodedChannels;
   110     unsigned int m_encodedSampleRate;
   112     std::string m_device;
   114     enum AEDataFormat sinkReqFormat;
   115     enum AEDataFormat sinkRetFormat;
   117     unsigned int m_uiBufferLen;    
   118     unsigned int m_AvgBytesPerSec;
   119     unsigned int m_dwChunkSize;
   120     unsigned int m_dwFrameSize;
   121     unsigned int m_dwBufferLen;
   122     uint64_t m_sinkFrames;
   123     std::atomic<uint16_t> m_framesInBuffers;
   125     double m_avgTimeWaiting;       
 
unsigned int AddPackets(uint8_t **data, unsigned int frames, unsigned int offset) override
Adds packets to be sent out, this routine MUST block or sleep. 
Definition: AESinkXAudio.cpp:229
CAESinkXAudio()
--------------— CAESinkXAudio ---------------------— 
Definition: AESinkXAudio.cpp:57
Definition: EffectAPI.cpp:20
Definition: AEChannelInfo.h:19
Definition: AESinkXAudio.h:25
void GetDelay(AEDelayStatus &status) override
Return a timestamped status structure with delay and sink info. 
Definition: AESinkXAudio.cpp:190