ASAPI.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. #pragma once
  2. #include <AK/Assertions.h>
  3. struct ASAPI_ServerMessage {
  4. enum class Type {
  5. Invalid,
  6. Greeting,
  7. FinishedPlayingBuffer,
  8. EnqueueBufferResponse,
  9. DidGetMainMixVolume,
  10. DidSetMainMixVolume,
  11. };
  12. Type type { Type::Invalid };
  13. unsigned extra_size { 0 };
  14. bool success { true };
  15. int value { 0 };
  16. union {
  17. struct {
  18. int server_pid;
  19. int your_client_id;
  20. } greeting;
  21. struct {
  22. int buffer_id;
  23. } playing_buffer;
  24. };
  25. };
  26. struct ASAPI_ClientMessage {
  27. enum class Type {
  28. Invalid,
  29. Greeting,
  30. EnqueueBuffer,
  31. GetMainMixVolume,
  32. SetMainMixVolume,
  33. };
  34. Type type { Type::Invalid };
  35. unsigned extra_size { 0 };
  36. int value { 0 };
  37. union {
  38. struct {
  39. int client_pid;
  40. } greeting;
  41. struct {
  42. int buffer_id;
  43. } play_buffer;
  44. };
  45. };
  46. // FIXME: Everything below this line should be generated from some kind of IPC protocol description.
  47. namespace ASAPI_Server {
  48. class Greeting;
  49. class FinishedPlayingBuffer;
  50. class EnqueueBufferResponse;
  51. class DidGetMainMixVolume;
  52. class DidSetMainMixVolume;
  53. }
  54. namespace ASAPI_Client {
  55. template<ASAPI_ClientMessage::Type type>
  56. class Message {
  57. public:
  58. static ASAPI_ClientMessage::Type message_type() { return type; }
  59. operator const ASAPI_ClientMessage&() const { return m_message; }
  60. protected:
  61. Message()
  62. {
  63. m_message.type = type;
  64. }
  65. Message(const ASAPI_ClientMessage& message)
  66. : m_message(message)
  67. {
  68. ASSERT(message.type == type);
  69. }
  70. ASAPI_ClientMessage m_message;
  71. };
  72. class Greeting : public Message<ASAPI_ClientMessage::Type::Greeting> {
  73. public:
  74. typedef ASAPI_Server::Greeting ResponseType;
  75. Greeting(const ASAPI_ClientMessage& message)
  76. : Message(message)
  77. {
  78. }
  79. Greeting(int client_pid)
  80. {
  81. m_message.greeting.client_pid = client_pid;
  82. }
  83. int client_pid() const { return m_message.greeting.client_pid; }
  84. };
  85. class EnqueueBuffer : public Message<ASAPI_ClientMessage::Type::EnqueueBuffer> {
  86. public:
  87. typedef ASAPI_Server::EnqueueBufferResponse ResponseType;
  88. EnqueueBuffer(const ASAPI_ClientMessage& message)
  89. : Message(message)
  90. {
  91. }
  92. EnqueueBuffer(int buffer_id)
  93. {
  94. m_message.play_buffer.buffer_id = buffer_id;
  95. }
  96. int buffer_id() const { return m_message.play_buffer.buffer_id; }
  97. };
  98. class GetMainMixVolume : public Message<ASAPI_ClientMessage::Type::GetMainMixVolume> {
  99. public:
  100. typedef ASAPI_Server::DidGetMainMixVolume ResponseType;
  101. GetMainMixVolume(const ASAPI_ClientMessage& message)
  102. : Message(message)
  103. {
  104. }
  105. GetMainMixVolume()
  106. {
  107. }
  108. };
  109. class SetMainMixVolume : public Message<ASAPI_ClientMessage::Type::SetMainMixVolume> {
  110. public:
  111. typedef ASAPI_Server::DidSetMainMixVolume ResponseType;
  112. SetMainMixVolume(const ASAPI_ClientMessage& message)
  113. : Message(message)
  114. {
  115. }
  116. SetMainMixVolume(int volume)
  117. {
  118. m_message.value = volume;
  119. }
  120. };
  121. }
  122. namespace ASAPI_Server {
  123. template<ASAPI_ServerMessage::Type type>
  124. class Message {
  125. public:
  126. static ASAPI_ServerMessage::Type message_type() { return type; }
  127. operator const ASAPI_ServerMessage&() const { return m_message; }
  128. protected:
  129. Message()
  130. {
  131. m_message.type = type;
  132. }
  133. Message(const ASAPI_ServerMessage& message)
  134. : m_message(message)
  135. {
  136. ASSERT(message.type == type);
  137. }
  138. ASAPI_ServerMessage m_message;
  139. };
  140. class Greeting : public Message<ASAPI_ServerMessage::Type::Greeting> {
  141. public:
  142. Greeting(const ASAPI_ServerMessage& message)
  143. : Message(message)
  144. {
  145. }
  146. Greeting(int server_pid, int your_client_id)
  147. {
  148. m_message.greeting.server_pid = server_pid;
  149. m_message.greeting.your_client_id = your_client_id;
  150. }
  151. int server_pid() const { return m_message.greeting.server_pid; }
  152. int your_client_id() const { return m_message.greeting.your_client_id; }
  153. };
  154. class FinishedPlayingBuffer : public Message<ASAPI_ServerMessage::Type::FinishedPlayingBuffer> {
  155. public:
  156. FinishedPlayingBuffer(const ASAPI_ServerMessage& message)
  157. : Message(message)
  158. {
  159. }
  160. FinishedPlayingBuffer(int buffer_id)
  161. {
  162. m_message.playing_buffer.buffer_id = buffer_id;
  163. }
  164. int buffer_id() const { return m_message.playing_buffer.buffer_id; }
  165. };
  166. class EnqueueBufferResponse : public Message<ASAPI_ServerMessage::Type::EnqueueBufferResponse> {
  167. public:
  168. EnqueueBufferResponse(const ASAPI_ServerMessage& message)
  169. : Message(message)
  170. {
  171. }
  172. EnqueueBufferResponse(bool success, int buffer_id)
  173. {
  174. m_message.success = success;
  175. m_message.playing_buffer.buffer_id = buffer_id;
  176. }
  177. bool success() const { return m_message.success; }
  178. int buffer_id() const { return m_message.playing_buffer.buffer_id; }
  179. };
  180. class DidGetMainMixVolume : public Message<ASAPI_ServerMessage::Type::DidGetMainMixVolume> {
  181. public:
  182. DidGetMainMixVolume(const ASAPI_ServerMessage& message)
  183. : Message(message)
  184. {
  185. }
  186. DidGetMainMixVolume(int volume)
  187. {
  188. m_message.value = volume;
  189. }
  190. int volume() const { return m_message.value; }
  191. };
  192. class DidSetMainMixVolume : public Message<ASAPI_ServerMessage::Type::DidSetMainMixVolume> {
  193. public:
  194. DidSetMainMixVolume(const ASAPI_ServerMessage& message)
  195. : Message(message)
  196. {
  197. }
  198. DidSetMainMixVolume()
  199. {
  200. }
  201. };
  202. }