kodi
AirTunesServer.h
1 /*
2  * Many concepts and protocol specification in this code are taken from
3  * the Boxee project. http://www.boxee.tv
4  *
5  * Copyright (C) 2011-2018 Team Kodi
6  * This file is part of Kodi - https://kodi.tv
7  *
8  * SPDX-License-Identifier: GPL-2.0-or-later
9  * See LICENSES/README.md for more information.
10  */
11 
12 #pragma once
13 
14 #include "filesystem/PipeFile.h"
15 #include "input/actions/interfaces/IActionListener.h"
16 #include "interfaces/IAnnouncer.h"
17 #include "threads/CriticalSection.h"
18 #include "threads/Thread.h"
19 
20 #include <list>
21 #include <string>
22 #include <vector>
23 
24 #include <arpa/inet.h>
25 #include <netinet/in.h>
26 #include <shairplay/raop.h>
27 #include <sys/socket.h>
28 #include <sys/types.h>
29 
30 class CDACP;
31 class CVariant;
32 
35  public CThread
36 {
37 public:
38  // ANNOUNCEMENT::IAnnouncer
39  void Announce(ANNOUNCEMENT::AnnouncementFlag flag,
40  const std::string& sender,
41  const std::string& message,
42  const CVariant& data) override;
43 
44  void RegisterActionListener(bool doRegister);
45  static void EnableActionProcessing(bool enable);
46  // IACtionListener
47  bool OnAction(const CAction &action) override;
48 
49  //CThread
50  void Process() override;
51 
52  static bool StartServer(int port, bool nonlocal, bool usePassword, const std::string &password="");
53  static void StopServer(bool bWait);
54  static bool IsRunning();
55  bool IsRAOPRunningInternal();
56  static void SetMetadataFromBuffer(const char *buffer, unsigned int size);
57  static void SetCoverArtFromBuffer(const char *buffer, unsigned int size);
58  static void SetupRemoteControl();
59  static void FreeDACPRemote();
60 
61 private:
62  CAirTunesServer(int port, bool nonlocal);
63  ~CAirTunesServer() override;
64  bool Initialize(const std::string &password);
65  void Deinitialize();
66  static void RefreshCoverArt(const char *outputFilename = NULL);
67  static void RefreshMetadata();
68  static void ResetMetadata();
69  static void InformPlayerAboutPlayTimes();
70 
71  int m_port;
72  raop_t* m_pRaop = nullptr;
73  XFILE::CPipeFile *m_pPipe;
74  static CAirTunesServer *ServerInstance;
75  static std::string m_macAddress;
76  static CCriticalSection m_metadataLock;
77  static std::string m_metadata[3];//0 - album, 1 - title, 2 - artist
78  static bool m_streamStarted;
79  static CCriticalSection m_dacpLock;
80  static CDACP *m_pDACP;
81  static std::string m_dacp_id;
82  static std::string m_active_remote_header;
83  static CCriticalSection m_actionQueueLock;
84  static std::list<CAction> m_actionQueue;
85  static CEvent m_processActions;
86  static int m_sampleRate;
87  static unsigned int m_cachedStartTime;
88  static unsigned int m_cachedEndTime;
89  static unsigned int m_cachedCurrentTime;
90 
91  class AudioOutputFunctions
92  {
93  public:
94  static void* audio_init(void *cls, int bits, int channels, int samplerate);
95  static void audio_set_volume(void *cls, void *session, float volume);
96  static void audio_set_metadata(void *cls, void *session, const void *buffer, int buflen);
97  static void audio_set_coverart(void *cls, void *session, const void *buffer, int buflen);
98  static void audio_process(void *cls, void *session, const void *buffer, int buflen);
99  static void audio_destroy(void *cls, void *session);
100  static void audio_remote_control_id(void *cls, const char *identifier, const char *active_remote_header);
101  static void audio_set_progress(void *cls, void *session, unsigned int start, unsigned int curr, unsigned int end);
102  };
103 };
This is an Event class built from a ConditionVariable.
Definition: Event.h:35
Definition: PipeFile.h:27
Definition: Thread.h:44
Definition: IAnnouncer.h:70
Definition: Variant.h:31
Class encapsulating information regarding a particular user action to be sent to windows and controls...
Definition: Action.h:21
Definition: AirTunesServer.h:33
Definition: dacp.h:15
bool OnAction(const CAction &action) override
Handle a GUI action.
Definition: AirTunesServer.cpp:209
Interface defining methods to handle GUI actions.
Definition: IActionListener.h:22