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.
9 #include "AESinkFactory.h"
11 #include "Interfaces/AESink.h"
12 #include "ServiceBroker.h"
13 #include "utils/StringUtils.h"
14 #include "utils/log.h"
20 std::map
<std::string
, AESinkRegEntry
> CAESinkFactory::m_AESinkRegEntry
;
22 void CAESinkFactory::RegisterSink(const AESinkRegEntry
& regEntry
)
24 m_AESinkRegEntry
[regEntry
.sinkName
] = regEntry
;
26 IAE
*ae
= CServiceBroker::GetActiveAE();
31 void CAESinkFactory::ClearSinks()
33 m_AESinkRegEntry
.clear();
36 bool CAESinkFactory::HasSinks()
38 return !m_AESinkRegEntry
.empty();
41 AESinkDevice
CAESinkFactory::ParseDevice(const std::string
& device
)
46 size_t pos
= dev
.name
.find_first_of(':');
49 if (pos
!= std::string::npos
)
51 dev
.driver
= device
.substr(0, pos
);
53 for (const auto& reg
: m_AESinkRegEntry
)
55 if (!StringUtils::EqualsNoCase(dev
.driver
, reg
.second
.sinkName
))
58 dev
.name
= dev
.name
.substr(pos
+ 1, dev
.name
.length() - pos
- 1);
66 pos
= dev
.name
.find_last_of('|');
68 if (pos
!= std::string::npos
)
70 // if no known driver found considers the string starts
71 // with the device name and discarts the rest
73 dev
.friendlyName
= dev
.name
.substr(pos
+ 1);
74 dev
.name
= dev
.name
.substr(0, pos
);
80 std::unique_ptr
<IAESink
> CAESinkFactory::Create(const std::string
& device
,
81 AEAudioFormat
& desiredFormat
)
83 // extract the driver from the device string if it exists
84 const AESinkDevice dev
= ParseDevice(device
);
86 AEAudioFormat tmpFormat
= desiredFormat
;
87 std::unique_ptr
<IAESink
> sink
;
88 std::string tmpDevice
= dev
.name
;
90 for (const auto& reg
: m_AESinkRegEntry
)
92 if (dev
.driver
!= reg
.second
.sinkName
)
95 sink
= reg
.second
.createFunc(tmpDevice
, tmpFormat
);
98 desiredFormat
= tmpFormat
;
105 void CAESinkFactory::EnumerateEx(std::vector
<AESinkInfo
>& list
,
107 const std::string
& driver
)
111 for (const auto& reg
: m_AESinkRegEntry
)
113 if (!driver
.empty() && driver
!= reg
.second
.sinkName
)
116 info
.m_deviceInfoList
.clear();
117 info
.m_sinkName
= reg
.second
.sinkName
;
118 reg
.second
.enumerateFunc(info
.m_deviceInfoList
, force
);
119 if (!info
.m_deviceInfoList
.empty())
120 list
.push_back(info
);
124 void CAESinkFactory::Cleanup()
126 for (const auto& reg
: m_AESinkRegEntry
)
128 if (reg
.second
.cleanupFunc
)
129 reg
.second
.cleanupFunc();