summaryrefslogtreecommitdiffstats
path: root/chromeos/dbus/bluetooth_media_endpoint_service_provider.h
blob: fffaa5330d6f4308a52ee8b3ca5e19ba989590fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMEOS_DBUS_BLUETOOTH_MEDIA_ENDPOINT_SERVICE_PROVIDER_H_
#define CHROMEOS_DBUS_BLUETOOTH_MEDIA_ENDPOINT_SERVICE_PROVIDER_H_

#include <string>
#include <vector>

#include "base/callback.h"
#include "chromeos/chromeos_export.h"
#include "dbus/bus.h"
#include "dbus/message.h"
#include "dbus/object_path.h"

namespace chromeos {

// BluetoothMediaEndpointServiceProvider is used to provide a D-Bus object that
// the Bluetooth daemon can commuicate with to serve as a media source/sink.
//
// Instantiate with a chosen D-Bus object path and a delegate object, and pass
// the D-Bus object path as |endpoint_path| argument to the
// chromeos::BluetoothMediaClient::RegisterEndoint() method.
//
// After initiating a connection between an audio source and an audio sink, the
// Bluetooth daemon will make calls to this endpoint object and they will be
// passed to user's Delegate object for handling. For SelectConfiguration method
// the response is returned using the SelectConfiguration callback.
class CHROMEOS_EXPORT BluetoothMediaEndpointServiceProvider {
 public:
  // Delegate is the interface for reacting to endpoint requests. User
  // applications will implement this interface to handle either A2DP Sink or
  // Source.
  class Delegate {
   public:
    // Transport-specific properties.
    struct CHROMEOS_EXPORT TransportProperties {
      TransportProperties();
      ~TransportProperties();

      // The path to the device object which the transport is connected to.
      dbus::ObjectPath device;

      // The UUID of the profile which the transport is for.
      std::string uuid;

      // The Codec value agreed by the remote device and used by the media
      // transport.
      uint8_t codec;

      // The configuration used by the media transport.
      std::vector<uint8_t> configuration;

      // The state of the transport. The values can be one of the following:
      // "idle": not streaming
      // "pending": streaming but not acquired
      // "active": streaming and acquired
      std::string state;

      // The unit of transport is in 1/10 millisecond. Optional.
      scoped_ptr<uint16_t> delay;

      // The volume level of the transport. Optional.
      scoped_ptr<uint16_t> volume;

     private:
      DISALLOW_COPY_AND_ASSIGN(TransportProperties);
    };

    virtual ~Delegate() {}

    // SelectConfigurationCallback is used for the SelectConfiguration() method,
    // it should be called with two arguements, the |configuration| which is
    // agreed by the application and the |length| of |configuration|.
    typedef base::Callback<void(const std::vector<uint8_t>&)>
        SelectConfigurationCallback;

    // This method will be called after an Audio Source receives the agreed
    // capabilities from the Audio Sink to set the configuration for the
    // media transport object. |transport_path| is the path to the
    // MediaTransport object, and |properties| are the properties for that
    // MediaTransport object.
    virtual void SetConfiguration(const dbus::ObjectPath& transport_path,
                                  const TransportProperties& properties) = 0;

    // This method will be called when an Audio Source connects to an Audio Sink
    // and asks it to decide the configuration to be used during the oncoming
    // streaming. Audio Sources provide |capabilities| as a reference, where
    // a user application can use these |capabilities| to figure out
    // a well-matched configuration and return it to the Audio Source via
    // |callback|.
    virtual void SelectConfiguration(
        const std::vector<uint8_t>& capabilities,
        const SelectConfigurationCallback& callback) = 0;

    // This method will be called when an Audio Source disconnects from an Audio
    // Sink. A user application is supposed to clear any of its resources which
    // it keeps for that particular connection. |transport_path| is the Media
    // Transport object which has been kept by an endpoint during the
    // connection.
    virtual void ClearConfiguration(const dbus::ObjectPath& transport_path) = 0;

    // This method will be called when the Bluetooth daemon unregisters the
    // Media Endpoint. Media Endpoint objects can use this method to clean up
    // tasks. There is no need to unregister the endpoint, since when this
    // method gets called, that endpoint has been unregistered. This corresponds
    // to the org.bluez.MediaEndpoint1.Release and is renamed to avoid
    // a conflict with base::RefCounted<T>.
    virtual void Released() = 0;
  };

  virtual ~BluetoothMediaEndpointServiceProvider();

  // Creates the instance where |bus| is the D-Bus bus connection to export the
  // object onto, |object_path| is the object path that it should have and
  // |delegate| is the object to which all method calls will be passed and
  // responses generated from.
  static BluetoothMediaEndpointServiceProvider* Create(
      dbus::Bus* bus,
      const dbus::ObjectPath& object_path,
      Delegate* delegate);

 protected:
  BluetoothMediaEndpointServiceProvider();

 private:
  DISALLOW_COPY_AND_ASSIGN(BluetoothMediaEndpointServiceProvider);
};

}  // namespace chromeos

#endif  // CHROMEOS_DBUS_BLUETOOTH_MEDIA_ENDPOINT_SERVICE_PROVIDER_H_