xbmc
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 "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 
34 {
35 public:
36  // ANNOUNCEMENT::IAnnouncer
37  void Announce(ANNOUNCEMENT::AnnouncementFlag flag,
38  const std::string& sender,
39  const std::string& message,
40  const CVariant& data) override;
41 
42  void RegisterActionListener(bool doRegister);
43  static void EnableActionProcessing(bool enable);
44  // IACtionListener
45  bool OnAction(const CAction &action) override;
46 
47  //CThread
48  void Process() override;
49 
50  static bool StartServer(int port, bool nonlocal, bool usePassword, const std::string &password="");
51  static void StopServer(bool bWait);
52  static bool IsRunning();
53  bool IsRAOPRunningInternal();
54  static void SetMetadataFromBuffer(const char *buffer, unsigned int size);
55  static void SetCoverArtFromBuffer(const char *buffer, unsigned int size);
56  static void SetupRemoteControl();
57  static void FreeDACPRemote();
58 
59 private:
60  CAirTunesServer(int port, bool nonlocal);
61  ~CAirTunesServer() override;
62  bool Initialize(const std::string &password);
63  void Deinitialize();
64  static void RefreshCoverArt(const char *outputFilename = NULL);
65  static void RefreshMetadata();
66  static void ResetMetadata();
67  static void InformPlayerAboutPlayTimes();
68 
69  int m_port;
70  raop_t* m_pRaop = nullptr;
71  XFILE::CPipeFile *m_pPipe;
72  static CAirTunesServer *ServerInstance;
73  static std::string m_macAddress;
74  static CCriticalSection m_metadataLock;
75  static std::string m_metadata[3];//0 - album, 1 - title, 2 - artist
76  static bool m_streamStarted;
77  static CCriticalSection m_dacpLock;
78  static CDACP *m_pDACP;
79  static std::string m_dacp_id;
80  static std::string m_active_remote_header;
81  static CCriticalSection m_actionQueueLock;
82  static std::list<CAction> m_actionQueue;
83  static CEvent m_processActions;
84  static int m_sampleRate;
85  static unsigned int m_cachedStartTime;
86  static unsigned int m_cachedEndTime;
87  static unsigned int m_cachedCurrentTime;
88 
89  class AudioOutputFunctions
90  {
91  public:
92  static void* audio_init(void *cls, int bits, int channels, int samplerate);
93  static void audio_set_volume(void *cls, void *session, float volume);
94  static void audio_set_metadata(void *cls, void *session, const void *buffer, int buflen);
95  static void audio_set_coverart(void *cls, void *session, const void *buffer, int buflen);
96  static void audio_process(void *cls, void *session, const void *buffer, int buflen);
97  static void audio_destroy(void *cls, void *session);
98  static void audio_remote_control_id(void *cls, const char *identifier, const char *active_remote_header);
99  static void audio_set_progress(void *cls, void *session, unsigned int start, unsigned int curr, unsigned int end);
100  };
101 };
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:29
class encapsulating information regarding a particular user action to be sent to windows and controls...
Definition: Action.h:22
Definition: AirTunesServer.h:33
Definition: IActionListener.h:13
Definition: dacp.h:15