2 * Copyright (C) 2010-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
11 #include "cores/AudioEngine/Interfaces/AESink.h"
12 #include "cores/AudioEngine/Utils/AEDeviceInfo.h"
13 #include "threads/CriticalSection.h"
17 #include <mmsystem.h> /* Microsoft can't write standalone headers */
18 #include <DSound.h> /* Microsoft can't write standalone headers */
19 #include <wrl/client.h>
21 class CAESinkDirectSound
: public IAESink
24 virtual const char *GetName() { return "DIRECTSOUND"; }
27 virtual ~CAESinkDirectSound();
29 static void Register();
30 static std::unique_ptr
<IAESink
> Create(std::string
& device
, AEAudioFormat
& desiredFormat
);
32 virtual bool Initialize(AEAudioFormat
&format
, std::string
&device
);
33 virtual void Deinitialize();
37 virtual void GetDelay(AEDelayStatus
& status
);
38 virtual double GetCacheTotal();
39 virtual unsigned int AddPackets(uint8_t **data
, unsigned int frames
, unsigned int offset
);
41 static void EnumerateDevicesEx (AEDeviceInfoList
&deviceInfoList
, bool force
= false);
43 void AEChannelsFromSpeakerMask(DWORD speakers
);
44 DWORD
SpeakerMaskFromAEChannels(const CAEChannelInfo
& channels
);
45 void CheckPlayStatus();
46 bool UpdateCacheStatus();
47 unsigned int GetSpace();
49 Microsoft::WRL::ComPtr
<IDirectSoundBuffer
> m_pBuffer
;
50 Microsoft::WRL::ComPtr
<IDirectSound
> m_pDSound
;
52 AEAudioFormat m_format
;
53 enum AEDataFormat m_encodedFormat
;
54 CAEChannelInfo m_channelLayout
;
57 unsigned int m_AvgBytesPerSec
;
59 unsigned int m_dwChunkSize
;
60 unsigned int m_dwFrameSize
;
61 unsigned int m_dwBufferLen
;
63 unsigned int m_BufferOffset
;
64 unsigned int m_CacheLen
;
65 unsigned int m_BufferTimeouts
;
70 CCriticalSection m_runLock
;