kodi
PipewireStream.h
1 /*
2  * Copyright (C) 2010-2021 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 <memory>
12 #include <vector>
13 
14 #include <pipewire/core.h>
15 #include <pipewire/stream.h>
16 
17 namespace KODI
18 {
19 namespace PIPEWIRE
20 {
21 
22 class CPipewireCore;
23 
25 {
26 public:
27  explicit CPipewireStream(CPipewireCore& core);
28  CPipewireStream() = delete;
29  ~CPipewireStream();
30 
31  pw_stream* Get() const { return m_stream.get(); }
32 
33  CPipewireCore& GetCore() const { return m_core; }
34 
35  bool Connect(uint32_t id,
36  const pw_direction& direction,
37  std::vector<const spa_pod*>& params,
38  const pw_stream_flags& flags);
39 
40  pw_stream_state GetState();
41  void SetActive(bool active);
42 
43  pw_buffer* DequeueBuffer();
44  void QueueBuffer(pw_buffer* buffer);
45 
46  bool TriggerProcess() const;
47 
48  void Flush(bool drain);
49 
50  uint32_t GetNodeId();
51 
52  void UpdateProperties(spa_dict* dict);
53 
54  pw_time GetTime() const;
55 
56 private:
57  static void StateChanged(void* userdata,
58  enum pw_stream_state old,
59  enum pw_stream_state state,
60  const char* error);
61  static void Process(void* userdata);
62  static void Drained(void* userdata);
63 
64  static pw_stream_events CreateStreamEvents();
65 
66  CPipewireCore& m_core;
67 
68  const pw_stream_events m_streamEvents;
69 
70  spa_hook m_streamListener;
71 
72  struct PipewireStreamDeleter
73  {
74  void operator()(pw_stream* p) { pw_stream_destroy(p); }
75  };
76 
77  std::unique_ptr<pw_stream, PipewireStreamDeleter> m_stream;
78 };
79 
80 } // namespace PIPEWIRE
81 } // namespace KODI
Definition: PipewireCore.h:22
Definition: AudioDecoder.h:18
Definition: PipewireStream.h:24