Chromium Code Reviews| Index: device/bluetooth/bluetooth_audio_sink.h |
| diff --git a/device/bluetooth/bluetooth_audio_sink.h b/device/bluetooth/bluetooth_audio_sink.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ee6da882ff46b6101d84b0644617b53ae0ae5cae |
| --- /dev/null |
| +++ b/device/bluetooth/bluetooth_audio_sink.h |
| @@ -0,0 +1,127 @@ |
| +// 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 DEVICE_BLUETOOTH_BLUETOOTH_AUDIO_SINK_H_ |
| +#define DEVICE_BLUETOOTH_BLUETOOTH_AUDIO_SINK_H_ |
| + |
| +#include <string> |
| +#include <vector> |
| + |
| +#include "base/callback.h" |
| +#include "base/memory/ref_counted.h" |
| +#include "base/memory/scoped_ptr.h" |
| +#include "dbus/file_descriptor.h" |
|
armansito
2014/12/02 19:20:20
We can't have dbus includes here. The code wouldn'
|
| + |
| +namespace device { |
| + |
| +class BluetoothAdapter; |
| + |
| +// BluetoothAudioSink represents a local audio sink where a remote device can |
|
armansito
2014/12/02 19:20:19
In general you shouldn't refer to any BlueZ concep
Miao
2014/12/03 20:06:38
Done.
|
| +// stream audio data. BluetoothAudioSink manages the creation/deletion of a BT |
| +// Media Endpoint and delivers the file descriptor from the BT Media Transport |
| +// which attaches to that endpoint. |
|
armansito
2014/12/02 19:20:19
I wouldn't go into BlueZ API details here. This is
Miao
2014/12/03 20:06:38
Done.
|
| +// An user applications can obtain a pointer to a BluetoothAudioSink object via |
|
armansito
2014/12/02 19:20:19
"An user applications" -> "User applications" ?
Miao
2014/12/03 20:06:38
Done.
|
| +// the interface provided by BluetoothAdapter. The validity of |
| +// BluetoothAudioSink's endopint object depends on whether BluetoothAdapter is |
|
armansito
2014/12/02 19:20:20
s/endopint/endpoint/
Though I wouldn't mention en
Miao
2014/12/03 20:06:38
Done.
|
| +// present and whether it is powered. Therefore, BlueotoothAudioSink has to keep |
| +// track of the changes on both BluetoothAdapter's state and the connection to |
| +// the remote device. |
|
armansito
2014/12/02 19:20:19
Get rid of the last sentence. These are implementa
Miao
2014/12/03 20:06:38
Done.
|
| +class BluetoothAudioSink : public base::RefCounted<BluetoothAudioSink> { |
| + public: |
| + // Possible values indicating the connection states between the |
| + // BluetoothAudioSink and the remote device. Since a BluetoothAudioSink object |
| + // depends on the BluetoothAdapter object's state, the BluetoothAudioSink has |
| + // to unregister its endpoint if either present or power of the |
| + // BluetoothAdapter object's changes. |
|
armansito
2014/12/02 19:20:19
You don't need the second sentence. Just saying "P
Miao
2014/12/03 20:06:38
Done.
|
| + enum AudioSinkState { |
| + STATE_INVALID, // BluetoothAdapter not presented or not powered. |
| + STATE_DISCONNECTED, // Not connected. |
| + STATE_IDLE, // Connected but not streaming. |
| + STATE_PENDING, // Connected, streaming but not acquired. |
| + STATE_ACTIVE, // Connected, streaming and acquired. |
| + }; |
| + |
| + // Used to configure an BT Media Endpoint. |
|
armansito
2014/12/02 19:20:20
Don't mention anything about BlueZ APIs. Just say
Miao
2014/12/03 20:06:38
Done.
|
| + struct AudioSinkOptions { |
|
armansito
2014/12/02 19:20:20
I'd just call this "struct Options". BluetoothAudi
Miao
2014/12/03 20:06:38
Done.
|
| + AudioSinkOptions(); |
| + ~AudioSinkOptions(); |
| + |
| + scoped_ptr<uint8_t> codec; |
| + scoped_ptr<std::vector<uint8_t>> capabilities; |
|
armansito
2014/12/02 19:20:20
Aren't codec and capabilities mandatory? I would r
Miao
2014/12/03 20:06:38
Done.
Codec and capabilities are mandatory. In the
|
| + }; |
| + |
| + // Interface for observing changes from Bluetooth Audio Sinks. |
|
armansito
2014/12/02 19:20:20
from a BluetoothAudioSink
Miao
2014/12/03 20:06:38
Done.
|
| + class Observer { |
| + public: |
| + virtual ~Observer() {} |
| + |
| + // Called when the state of the BluetoothAudioSink object is changed. |
| + // |audio_sink| indicates the object being changed, and |audio_sink_state| |
| + // indicates the new state of that object. |
| + virtual void BluetoothAudioSinkStateChanged( |
| + BluetoothAudioSink* audio_sink, |
| + const BluetoothAudioSink::AudioSinkState& audio_sink_state) = 0; |
|
armansito
2014/12/02 19:20:20
Pass enum by value. No need for a const reference
Miao
2014/12/03 20:06:38
Done.
|
| + |
| + // Called when the volume of the BluetoothAudioSink object is changed. |
| + // |audio_sink| indicates the object being changed, and |audio_sink_volume| |
| + // indicates the new volume level of that object. |
| + virtual void BluetoothAudioSinkVolumeChanged( |
| + BluetoothAudioSink* audio_sink, |
| + uint16_t audio_sink_volume) = 0; |
| + |
| + // Called when the file descriptor of the BluetoothAudioSink object is |
| + // ready to be read. |fd| is the file descriptor, where |read_mtu| and |
| + // |write_mtu| are the maximum transport units for reading and writing. |
| + virtual void BluetoothAudioSinkFdAvailable(BluetoothAudioSink* audio_sink, |
| + const dbus::FileDescriptor& fd, |
|
armansito
2014/12/02 19:20:20
Don't expose dbus objects here since the whole poi
|
| + uint16_t read_mtu, |
| + uint16_t write_mtu) = 0; |
| + }; |
| + |
| + // The EndpointAcuiredCallback is used to pass the scoped_refptr of |
|
armansito
2014/12/02 19:20:19
Acuired -> Acquired
Also you called it EndpointRe
Miao
2014/12/03 20:06:38
Done.
|
| + // a BluetoothAudioSink object while a BT Media Endpoint is successfully |
|
armansito
2014/12/02 19:20:19
Don't mention BlueZ concepts.
Miao
2014/12/03 20:06:38
Done.
|
| + // created and registered. |
| + typedef base::Callback<void( |
| + scoped_refptr<BluetoothAudioSink>)> EndpointRegisteredCallback; |
|
armansito
2014/12/02 19:20:20
I would call this "AudioSinkRegisteredCallback" si
Miao
2014/12/03 20:06:38
Done.
|
| + |
| + // The EndpointDeletedCallback is used to handle the clean-up while a BT Media |
|
armansito
2014/12/02 19:20:20
EndpointUnregisteredCallback?
Miao
2014/12/03 20:06:38
Done.
|
| + // Endpoint is unregistered. |
| + typedef base::Callback<void()> EndpointUnregisteredCallback; |
|
armansito
2014/12/02 19:20:20
This typedef is unnecessary since you're method ca
Miao
2014/12/03 20:06:38
Done.
|
| + |
| + // The ErrorCallback is used for the methods that can fail in which case it |
| + // can fail. |
|
armansito
2014/12/02 19:20:19
"in which case it can fail" -> "in which case it i
Miao
2014/12/03 20:06:38
Done.
Miao
2014/12/03 20:06:38
Done.
|
| + typedef base::Callback<void(const std::string& error_message)> ErrorCallback; |
| + |
| + virtual ~BluetoothAudioSink(); |
| + |
| + // Adds and removes a observer for events on the BluetoothAudioSink object. If |
| + // monitoring multiple audio sinks, check the |audio_sink| parameter of |
| + // observer methods to determine which audio sink is issuing the event. |
| + virtual void AddObserver(Observer* observer) = 0; |
| + virtual void RemoveObserver(Observer* observer) = 0; |
| + |
| + // Registers a BT Media Endpoint. User applications can use |options| to |
| + // configure a new BT Media Endpoint which will bound to the audio sink. |
| + // |callback| will be executed if the endpoint is successfully created, |
| + // otherwise |error_callback| will be called. |
| + virtual void RegisterEndpoint(const AudioSinkOptions& options, |
| + const EndpointRegisteredCallback& callback, |
| + const ErrorCallback& error_callback) = 0; |
|
armansito
2014/12/02 19:20:19
I thought we were going to have this method in Blu
Miao
2014/12/03 20:06:38
Sorry about the confusion, there is no doubt that
|
| + |
| + // Unregister the BT Media Endpoint if there is one. |callback| should handle |
| + // the clean-up after the endpoint is deleted successfully, otherwise |
| + // |error_callback| will be called. |
| + virtual void UnregisterEndpoint(const EndpointUnregisteredCallback& callback, |
|
armansito
2014/12/02 19:20:19
I think just base::Closure is sufficient.
armansito
2014/12/02 19:20:20
Should we call this method just "Unregister"? I do
Miao
2014/12/03 20:06:38
Done.
|
| + const ErrorCallback& error_callback) = 0; |
| + |
| + protected: |
| + BluetoothAudioSink(); |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(BluetoothAudioSink); |
| +}; |
| + |
| +} // namespace device |
| + |
| +#endif // DEVICE_BLUETOOTH_BLUETOOTH_AUDIO_SINK_H_ |