kodi
AESinkDirectSound.h
1 /*
2  * Copyright (C) 2010-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "cores/AudioEngine/Interfaces/AESink.h"
12 #include "cores/AudioEngine/Utils/AEDeviceInfo.h"
13 #include "threads/CriticalSection.h"
14 
15 #include <stdint.h>
16 
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>
20 
22 {
23 public:
24  virtual const char *GetName() { return "DIRECTSOUND"; }
25 
27  virtual ~CAESinkDirectSound();
28 
29  static void Register();
30  static std::unique_ptr<IAESink> Create(std::string& device, AEAudioFormat& desiredFormat);
31 
32  virtual bool Initialize(AEAudioFormat &format, std::string &device);
33  virtual void Deinitialize();
34 
35  virtual void Stop();
36  virtual void Drain();
37  virtual void GetDelay(AEDelayStatus& status);
38  virtual double GetCacheTotal();
39  virtual unsigned int AddPackets(uint8_t **data, unsigned int frames, unsigned int offset);
40 
41  static std::string GetDefaultDevice();
42  static void EnumerateDevicesEx (AEDeviceInfoList &deviceInfoList, bool force = false);
43 private:
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);
50 
51  Microsoft::WRL::ComPtr<IDirectSoundBuffer> m_pBuffer;
52  Microsoft::WRL::ComPtr<IDirectSound> m_pDSound;
53 
54  AEAudioFormat m_format;
55  enum AEDataFormat m_encodedFormat;
56  CAEChannelInfo m_channelLayout;
57  std::string m_device;
58 
59  unsigned int m_AvgBytesPerSec;
60 
61  unsigned int m_dwChunkSize;
62  unsigned int m_dwFrameSize;
63  unsigned int m_dwBufferLen;
64 
65  unsigned int m_BufferOffset;
66  unsigned int m_CacheLen;
67  unsigned int m_BufferTimeouts;
68 
69  bool m_running;
70  bool m_initialized;
71  bool m_isDirtyDS;
72  CCriticalSection m_runLock;
73 };
virtual unsigned int AddPackets(uint8_t **data, unsigned int frames, unsigned int offset)
Adds packets to be sent out, this routine MUST block or sleep.
Definition: AESinkDirectSound.cpp:314
Definition: AESinkDirectSound.h:21
virtual double GetCacheTotal()
Definition: AESinkDirectSound.cpp:427
virtual void GetDelay(AEDelayStatus &status)
Return a timestamped status structure with delay and sink info.
Definition: AESinkDirectSound.cpp:411
Definition: AESink.h:18
The audio format structure that fully defines a stream&#39;s audio information.
Definition: AEAudioFormat.h:19
Definition: AEUtil.h:27
Definition: AEChannelInfo.h:19
virtual bool Initialize(AEAudioFormat &format, std::string &device)
Definition: AESinkDirectSound.cpp:122