[WASAPI] set stream audio category
[xbmc.git] / xbmc / cores / AudioEngine / Sinks / pipewire / Pipewire.cpp
blob25b5518d32a5faf9f5e913d208215f28c1cbf384
1 /*
2 * Copyright (C) 2010-2021 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 "Pipewire.h"
11 #include "PipewireContext.h"
12 #include "PipewireCore.h"
13 #include "PipewireRegistry.h"
14 #include "PipewireThreadLoop.h"
15 #include "commons/ilog.h"
16 #include "utils/log.h"
18 #include <pipewire/pipewire.h>
20 using namespace std::chrono_literals;
22 using namespace KODI;
23 using namespace PIPEWIRE;
25 CPipewire::CPipewire()
27 pw_init(nullptr, nullptr);
30 CPipewire::~CPipewire()
32 if (m_loop)
34 m_loop->Unlock();
35 m_loop->Stop();
38 m_registry.reset();
39 m_core.reset();
40 m_context.reset();
41 m_loop.reset();
43 pw_deinit();
46 bool CPipewire::Start()
48 m_loop = std::make_unique<CPipewireThreadLoop>();
50 m_context = std::make_unique<CPipewireContext>(*m_loop);
52 PIPEWIRE::CLoopLockGuard lock(*m_loop);
54 if (!m_loop->Start())
56 CLog::Log(LOGERROR, "Pipewire: failed to start threaded mainloop: {}", strerror(errno));
57 return false;
60 try
62 m_core = std::make_unique<CPipewireCore>(*m_context);
64 catch (std::exception& e)
66 CLog::Log(LOGERROR, "Pipewire: failed to connect to server");
67 return false;
70 CLog::Log(LOGINFO, "Pipewire: connected to server");
72 m_registry = std::make_unique<CPipewireRegistry>(*m_core);
74 m_core->Sync();
76 int ret = m_loop->Wait(5s);
77 if (ret == -ETIMEDOUT)
79 CLog::Log(LOGDEBUG, "Pipewire: timed out out waiting for synchronization");
80 return false;
83 return true;
86 std::unique_ptr<CPipewire> CPipewire::Create()
88 struct PipewireMaker : public CPipewire
90 using CPipewire::CPipewire;
93 try
95 auto pipewire = std::make_unique<PipewireMaker>();
97 if (!pipewire->Start())
98 return {};
100 return pipewire;
102 catch (const std::exception& e)
104 CLog::Log(LOGWARNING, "Pipewire: Exception in 'Create': {}", e.what());
105 return {};