2 * Copyright (C) 2005-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/Sinks/osx/CoreAudioDevice.h"
13 #include "cores/AudioEngine/Utils/AEDeviceInfo.h"
18 class CAESinkDARWINOSX
: public IAESink
21 const char* GetName() override
{ return "DARWINOSX"; }
24 ~CAESinkDARWINOSX() override
;
26 static void Register();
27 static void EnumerateDevicesEx(AEDeviceInfoList
&list
, bool force
);
28 static std::unique_ptr
<IAESink
> Create(std::string
& device
, AEAudioFormat
& desiredFormat
);
30 bool Initialize(AEAudioFormat
& format
, std::string
& device
) override
;
31 void Deinitialize() override
;
33 void GetDelay(AEDelayStatus
& status
) override
;
34 double GetCacheTotal() override
;
35 unsigned int AddPackets(uint8_t** data
, unsigned int frames
, unsigned int offset
) override
;
36 void Drain() override
;
39 static OSStatus
renderCallback(AudioDeviceID inDevice
, const AudioTimeStamp
* inNow
, const AudioBufferList
* inInputData
, const AudioTimeStamp
* inInputTime
, AudioBufferList
* outOutputData
, const AudioTimeStamp
* inOutputTime
, void* inClientData
);
40 void SetHogMode(bool on
);
44 CCoreAudioDevice m_device
;
45 CCoreAudioStream m_outputStream
;
46 unsigned int m_latentFrames
= 0;
47 unsigned int m_outputBufferIndex
= 0;
49 bool m_outputBitstream
=
50 false; ///< true if we're bistreaming into a LinearPCM stream rather than AC3 stream.
51 unsigned int m_planes
= 1; ///< number of audio planes (1 if non-planar)
52 unsigned int m_frameSizePerPlane
= 0; ///< frame size (per plane) in bytes
53 unsigned int m_framesPerSecond
= 0; ///< sample rate
55 AERingBuffer
* m_buffer
= nullptr;
56 volatile bool m_started
=
57 false; // set once we get a callback from CoreAudio, which can take a little while.
59 CAESpinSection m_render_locker
;
60 volatile int64_t m_render_tick
= 0;
61 volatile double m_render_delay
= 0.0;