AClientConnection.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #include <LibAudio/ABuffer.h>
  2. #include <LibAudio/AClientConnection.h>
  3. #include <SharedBuffer.h>
  4. AClientConnection::AClientConnection()
  5. : Connection("/tmp/asportal")
  6. {
  7. }
  8. void AClientConnection::handshake()
  9. {
  10. ASAPI_ClientMessage request;
  11. request.type = ASAPI_ClientMessage::Type::Greeting;
  12. request.greeting.client_pid = getpid();
  13. auto response = sync_request(request, ASAPI_ServerMessage::Type::Greeting);
  14. set_server_pid(response.greeting.server_pid);
  15. set_my_client_id(response.greeting.your_client_id);
  16. }
  17. void AClientConnection::play(const ABuffer& buffer, bool block)
  18. {
  19. const_cast<ABuffer&>(buffer).shared_buffer().share_with(server_pid());
  20. ASAPI_ClientMessage request;
  21. request.type = ASAPI_ClientMessage::Type::PlayBuffer;
  22. request.play_buffer.buffer_id = buffer.shared_buffer_id();
  23. sync_request(request, block ? ASAPI_ServerMessage::Type::FinishedPlayingBuffer : ASAPI_ServerMessage::Type::PlayingBuffer);
  24. }
  25. void AClientConnection::enqueue(const ABuffer& buffer)
  26. {
  27. for (;;) {
  28. const_cast<ABuffer&>(buffer).shared_buffer().share_with(server_pid());
  29. ASAPI_ClientMessage request;
  30. request.type = ASAPI_ClientMessage::Type::EnqueueBuffer;
  31. request.play_buffer.buffer_id = buffer.shared_buffer_id();
  32. auto response = sync_request(request, ASAPI_ServerMessage::Type::EnqueueBufferResponse);
  33. if (response.success)
  34. break;
  35. dbg() << "EnqueueBuffer failed, retrying...";
  36. sleep(1);
  37. }
  38. }