ClientConnection.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "ClientConnection.h"
  7. #include "Mixer.h"
  8. #include <AudioServer/AudioClientEndpoint.h>
  9. #include <LibAudio/Buffer.h>
  10. #include <errno.h>
  11. #include <stdio.h>
  12. #include <sys/socket.h>
  13. #include <sys/types.h>
  14. #include <sys/uio.h>
  15. #include <unistd.h>
  16. namespace AudioServer {
  17. static HashMap<int, RefPtr<ClientConnection>> s_connections;
  18. void ClientConnection::for_each(Function<void(ClientConnection&)> callback)
  19. {
  20. NonnullRefPtrVector<ClientConnection> connections;
  21. for (auto& it : s_connections)
  22. connections.append(*it.value);
  23. for (auto& connection : connections)
  24. callback(connection);
  25. }
  26. ClientConnection::ClientConnection(NonnullRefPtr<Core::LocalSocket> client_socket, int client_id, Mixer& mixer)
  27. : IPC::ClientConnection<AudioClientEndpoint, AudioServerEndpoint>(*this, move(client_socket), client_id)
  28. , m_mixer(mixer)
  29. {
  30. s_connections.set(client_id, *this);
  31. }
  32. ClientConnection::~ClientConnection()
  33. {
  34. }
  35. void ClientConnection::die()
  36. {
  37. s_connections.remove(client_id());
  38. }
  39. void ClientConnection::did_finish_playing_buffer(Badge<BufferQueue>, int buffer_id)
  40. {
  41. post_message(Messages::AudioClient::FinishedPlayingBuffer(buffer_id));
  42. }
  43. void ClientConnection::did_change_muted_state(Badge<Mixer>, bool muted)
  44. {
  45. post_message(Messages::AudioClient::MutedStateChanged(muted));
  46. }
  47. void ClientConnection::did_change_main_mix_volume(Badge<Mixer>, int volume)
  48. {
  49. post_message(Messages::AudioClient::MainMixVolumeChanged(volume));
  50. }
  51. void ClientConnection::handle(const Messages::AudioServer::Greet&)
  52. {
  53. }
  54. Messages::AudioServer::GetMainMixVolumeResponse ClientConnection::handle(const Messages::AudioServer::GetMainMixVolume&)
  55. {
  56. return m_mixer.main_volume();
  57. }
  58. void ClientConnection::handle(const Messages::AudioServer::SetMainMixVolume& message)
  59. {
  60. m_mixer.set_main_volume(message.volume());
  61. }
  62. Messages::AudioServer::EnqueueBufferResponse ClientConnection::handle(const Messages::AudioServer::EnqueueBuffer& message)
  63. {
  64. if (!m_queue)
  65. m_queue = m_mixer.create_queue(*this);
  66. if (m_queue->is_full())
  67. return false;
  68. m_queue->enqueue(Audio::Buffer::create_with_anonymous_buffer(message.buffer(), message.buffer_id(), message.sample_count()));
  69. return true;
  70. }
  71. Messages::AudioServer::GetRemainingSamplesResponse ClientConnection::handle(const Messages::AudioServer::GetRemainingSamples&)
  72. {
  73. int remaining = 0;
  74. if (m_queue)
  75. remaining = m_queue->get_remaining_samples();
  76. return remaining;
  77. }
  78. Messages::AudioServer::GetPlayedSamplesResponse ClientConnection::handle(const Messages::AudioServer::GetPlayedSamples&)
  79. {
  80. int played = 0;
  81. if (m_queue)
  82. played = m_queue->get_played_samples();
  83. return played;
  84. }
  85. void ClientConnection::handle(const Messages::AudioServer::SetPaused& message)
  86. {
  87. if (m_queue)
  88. m_queue->set_paused(message.paused());
  89. }
  90. void ClientConnection::handle(const Messages::AudioServer::ClearBuffer& message)
  91. {
  92. if (m_queue)
  93. m_queue->clear(message.paused());
  94. }
  95. Messages::AudioServer::GetPlayingBufferResponse ClientConnection::handle(const Messages::AudioServer::GetPlayingBuffer&)
  96. {
  97. int id = -1;
  98. if (m_queue)
  99. id = m_queue->get_playing_buffer();
  100. return id;
  101. }
  102. Messages::AudioServer::GetMutedResponse ClientConnection::handle(const Messages::AudioServer::GetMuted&)
  103. {
  104. return m_mixer.is_muted();
  105. }
  106. void ClientConnection::handle(const Messages::AudioServer::SetMuted& message)
  107. {
  108. m_mixer.set_muted(message.muted());
  109. }
  110. }