[videodb] remove unused seasons table from episode_view
[xbmc.git] / xbmc / cores / AudioEngine / AESinkFactory.cpp
blob2504e032dea98cf0e73298c18a4bc9de7b090755
1 /*
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.
7 */
9 #include "AESinkFactory.h"
11 #include "Interfaces/AESink.h"
12 #include "ServiceBroker.h"
13 #include "utils/StringUtils.h"
14 #include "utils/log.h"
16 #include <algorithm>
18 using namespace AE;
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();
27 if (ae)
28 ae->DeviceChange();
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)
43 AESinkDevice dev{};
44 dev.name = device;
46 size_t pos = dev.name.find_first_of(':');
47 bool found = false;
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))
56 continue;
58 dev.name = dev.name.substr(pos + 1, dev.name.length() - pos - 1);
59 found = true;
63 if (!found)
64 dev.driver.clear();
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
72 if (found)
73 dev.friendlyName = dev.name.substr(pos + 1);
74 dev.name = dev.name.substr(0, pos);
77 return dev;
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)
93 continue;
95 sink = reg.second.createFunc(tmpDevice, tmpFormat);
96 if (sink)
98 desiredFormat = tmpFormat;
99 return sink;
102 return nullptr;
105 void CAESinkFactory::EnumerateEx(std::vector<AESinkInfo>& list,
106 bool force,
107 const std::string& driver)
109 AESinkInfo info;
111 for (const auto& reg : m_AESinkRegEntry)
113 if (!driver.empty() && driver != reg.second.sinkName)
114 continue;
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();