controls.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. * (c) Philippe G. 2019, philippe_44@outlook.com
  3. *
  4. * This software is released under the MIT License.
  5. * https://opensource.org/licenses/MIT
  6. *
  7. */
  8. #include "squeezelite.h"
  9. #include "audio_controls.h"
  10. static log_level loglevel = lINFO;
  11. static in_addr_t server_ip;
  12. static u16_t server_hport;
  13. static u16_t server_cport;
  14. static u8_t mac[6];
  15. static void (*chained_notify)(in_addr_t, u16_t, u16_t);
  16. static void cli_send_cmd(char *cmd);
  17. static void lms_volume_up(void) {
  18. cli_send_cmd("button volup");
  19. }
  20. static void lms_volume_down(void) {
  21. cli_send_cmd("button voldown");
  22. }
  23. static void lms_toggle(void) {
  24. cli_send_cmd("pause");
  25. }
  26. static void lms_pause(void) {
  27. cli_send_cmd("pause 1");
  28. }
  29. static void lms_play(void) {
  30. cli_send_cmd("button play.single");
  31. }
  32. static void lms_stop(void) {
  33. cli_send_cmd("button stop");
  34. }
  35. static void lms_rew(void) {
  36. cli_send_cmd("button rew.repeat");
  37. }
  38. static void lms_fwd(void) {
  39. cli_send_cmd("button fwd.repeat");
  40. }
  41. static void lms_prev(void) {
  42. cli_send_cmd("button rew");
  43. }
  44. static void lms_next(void) {
  45. cli_send_cmd("button fwd");
  46. }
  47. static void lms_up(void) {
  48. cli_send_cmd("button arrow_up");
  49. }
  50. static void lms_down(void) {
  51. cli_send_cmd("button arrow_down");
  52. }
  53. static void lms_left(void) {
  54. cli_send_cmd("button arrow_left");
  55. }
  56. static void lms_right(void) {
  57. cli_send_cmd("button arrow_right");
  58. }
  59. static void lms_knob_left(void) {
  60. cli_send_cmd("button knob_left");
  61. }
  62. static void lms_knob_right(void) {
  63. cli_send_cmd("button knob_right");
  64. }
  65. static void lms_knob_push(void) {
  66. cli_send_cmd("button knob_push");
  67. }
  68. const actrls_t LMS_controls = {
  69. lms_volume_up, lms_volume_down, // volume up, volume down
  70. lms_toggle, lms_play, // toggle, play
  71. lms_pause, lms_stop, // pause, stop
  72. lms_rew, lms_fwd, // rew, fwd
  73. lms_prev, lms_next, // prev, next
  74. lms_up, lms_down,
  75. lms_left, lms_right,
  76. lms_knob_left, lms_knob_right, lms_knob_push,
  77. };
  78. /****************************************************************************************
  79. *
  80. */
  81. static void cli_send_cmd(char *cmd) {
  82. char packet[64];
  83. struct sockaddr_in addr;
  84. socklen_t addrlen = sizeof(addr);
  85. int len, sock = socket(AF_INET, SOCK_STREAM, 0);
  86. addr.sin_family = AF_INET;
  87. addr.sin_addr.s_addr = server_ip;
  88. addr.sin_port = htons(server_cport);
  89. if (connect(sock, (struct sockaddr *) &addr, addrlen) < 0) {
  90. LOG_ERROR("unable to connect to server %s:%hu with cli", inet_ntoa(server_ip), server_cport);
  91. return;
  92. }
  93. len = sprintf(packet, "%02x:%02x:%02x:%02x:%02x:%02x %s\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], cmd);
  94. LOG_DEBUG("sending command %s at %s:%hu", packet, inet_ntoa(server_ip), server_cport);
  95. if (send(sock, packet, len, 0) < 0) {
  96. LOG_WARN("cannot send CLI %s", packet);
  97. }
  98. closesocket(sock);
  99. }
  100. /****************************************************************************************
  101. * Notification when server changes
  102. */
  103. static void notify(in_addr_t ip, u16_t hport, u16_t cport) {
  104. server_ip = ip;
  105. server_hport = hport;
  106. server_cport = cport;
  107. LOG_INFO("notified server %s hport %hu cport %hu", inet_ntoa(ip), hport, cport);
  108. if (chained_notify) (*chained_notify)(ip, hport, cport);
  109. }
  110. /****************************************************************************************
  111. * Initialize controls - shall be called once from output_init_embedded
  112. */
  113. void sb_controls_init(void) {
  114. LOG_INFO("initializing CLI controls");
  115. get_mac(mac);
  116. actrls_set_default(LMS_controls, NULL);
  117. chained_notify = server_notify;
  118. server_notify = notify;
  119. }