ClientConnection.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibAudio/Buffer.h>
  7. #include <LibAudio/ClientConnection.h>
  8. #include <time.h>
  9. namespace Audio {
  10. // FIXME: We don't know what is a good value for this.
  11. // Real-time audio may be improved with a lower value.
  12. static timespec g_enqueue_wait_time { 0, 10'000'000 };
  13. ClientConnection::ClientConnection()
  14. : IPC::ServerConnection<AudioClientEndpoint, AudioServerEndpoint>(*this, "/tmp/portal/audio")
  15. {
  16. }
  17. void ClientConnection::enqueue(Buffer const& buffer)
  18. {
  19. for (;;) {
  20. auto success = enqueue_buffer(buffer.anonymous_buffer(), buffer.id(), buffer.sample_count());
  21. if (success)
  22. break;
  23. nanosleep(&g_enqueue_wait_time, nullptr);
  24. }
  25. }
  26. void ClientConnection::async_enqueue(Buffer const& buffer)
  27. {
  28. async_enqueue_buffer(buffer.anonymous_buffer(), buffer.id(), buffer.sample_count());
  29. }
  30. bool ClientConnection::try_enqueue(Buffer const& buffer)
  31. {
  32. return enqueue_buffer(buffer.anonymous_buffer(), buffer.id(), buffer.sample_count());
  33. }
  34. void ClientConnection::finished_playing_buffer(i32 buffer_id)
  35. {
  36. if (on_finish_playing_buffer)
  37. on_finish_playing_buffer(buffer_id);
  38. }
  39. void ClientConnection::muted_state_changed(bool muted)
  40. {
  41. if (on_muted_state_change)
  42. on_muted_state_change(muted);
  43. }
  44. void ClientConnection::main_mix_volume_changed(double volume)
  45. {
  46. if (on_main_mix_volume_change)
  47. on_main_mix_volume_change(volume);
  48. }
  49. void ClientConnection::client_volume_changed(double volume)
  50. {
  51. if (on_client_volume_change)
  52. on_client_volume_change(volume);
  53. }
  54. }