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 std::string
GetDefaultDevice();
42 static void EnumerateDevicesEx (AEDeviceInfoList
&deviceInfoList
, bool force
= false);
44 void AEChannelsFromSpeakerMask(DWORD speakers
);
45 DWORD
SpeakerMaskFromAEChannels(const CAEChannelInfo
&channels
);
46 void CheckPlayStatus();
47 bool UpdateCacheStatus();
48 unsigned int GetSpace();
49 const char *dserr2str(int err
);
51 Microsoft::WRL::ComPtr
<IDirectSoundBuffer
> m_pBuffer
;
52 Microsoft::WRL::ComPtr
<IDirectSound
> m_pDSound
;
54 AEAudioFormat m_format
;
55 enum AEDataFormat m_encodedFormat
;
56 CAEChannelInfo m_channelLayout
;
59 unsigned int m_AvgBytesPerSec
;
61 unsigned int m_dwChunkSize
;
62 unsigned int m_dwFrameSize
;
63 unsigned int m_dwBufferLen
;
65 unsigned int m_BufferOffset
;
66 unsigned int m_CacheLen
;
67 unsigned int m_BufferTimeouts
;
72 CCriticalSection m_runLock
;