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();
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:230
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:191