Index: device/bluetooth/bluetooth_audio_sink_chromeos.h |
diff --git a/device/bluetooth/bluetooth_audio_sink_chromeos.h b/device/bluetooth/bluetooth_audio_sink_chromeos.h |
index 58d1fb2fee932852dbe410e65ee2e2cd2598ed1a..a284a1f41f8fee18a39fe6c58595614017c6e4c2 100644 |
--- a/device/bluetooth/bluetooth_audio_sink_chromeos.h |
+++ b/device/bluetooth/bluetooth_audio_sink_chromeos.h |
@@ -9,8 +9,10 @@ |
#include <string> |
#include <vector> |
+#include "base/files/file.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/memory/weak_ptr.h" |
+#include "base/message_loop/message_loop.h" |
#include "base/observer_list.h" |
#include "chromeos/dbus/bluetooth_media_client.h" |
#include "chromeos/dbus/bluetooth_media_endpoint_service_provider.h" |
@@ -30,7 +32,8 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothAudioSinkChromeOS |
public device::BluetoothAdapter::Observer, |
public BluetoothMediaClient::Observer, |
public BluetoothMediaTransportClient::Observer, |
- public BluetoothMediaEndpointServiceProvider::Delegate { |
+ public BluetoothMediaEndpointServiceProvider::Delegate, |
+ public base::MessageLoopForIO::Watcher { |
public: |
explicit BluetoothAudioSinkChromeOS( |
scoped_refptr<device::BluetoothAdapter> adapter); |
@@ -47,6 +50,22 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothAudioSinkChromeOS |
device::BluetoothAudioSink::State GetState() const override; |
uint16_t GetVolume() const override; |
+ // Registers a BluetoothAudioSink. User applications can use |options| to |
+ // configure the audio sink. |callback| will be executed if the audio sink is |
+ // successfully registered, otherwise |error_callback| will be called. Called |
+ // by BluetoothAdapterChromeOS. |
+ void Register( |
+ const device::BluetoothAudioSink::Options& options, |
+ const base::Closure& callback, |
+ const device::BluetoothAudioSink::ErrorCallback& error_callback); |
+ |
+ // Returns a pointer to the media endpoint object. This function should be |
+ // used for testing purpose only. |
+ BluetoothMediaEndpointServiceProvider* GetEndpointServiceProvider(); |
+ |
+ private: |
+ ~BluetoothAudioSinkChromeOS() override; |
+ |
// device::BluetoothAdapter::Observer overrides. |
void AdapterPresentChanged(device::BluetoothAdapter* adapter, |
bool present) override; |
@@ -70,21 +89,23 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothAudioSinkChromeOS |
void ClearConfiguration(const dbus::ObjectPath& transport_path) override; |
void Released() override; |
- // Registers a BluetoothAudioSink. User applications can use |options| to |
- // configure the audio sink. |callback| will be executed if the audio sink is |
- // successfully registered, otherwise |error_callback| will be called. Called |
- // by BluetoothAdapterChromeOS. |
- void Register( |
- const device::BluetoothAudioSink::Options& options, |
- const base::Closure& callback, |
- const device::BluetoothAudioSink::ErrorCallback& error_callback); |
+ // base::MessageLoopForIO::Watcher overrides. |
+ void OnFileCanReadWithoutBlocking(int fd) override; |
+ void OnFileCanWriteWithoutBlocking(int fd) override; |
- // Returns a pointer to the media endpoint object. This function should be |
- // used for testing purpose only. |
- BluetoothMediaEndpointServiceProvider* GetEndpointServiceProvider(); |
+ // Acquires file descriptor via current transport object when the state change |
+ // is triggered by MediaTransportPropertyChanged. |
+ void AcquireFD(); |
- private: |
- ~BluetoothAudioSinkChromeOS() override; |
+ // Watches if there is any available data from |fd_|. |
+ void WatchFD(); |
+ |
+ // Stops watching |fd_| and resets |fd_|. |
+ void StopWatchingFD(); |
+ |
+ // Reads from the file descriptor acquired via Media Transport object and |
+ // notify |observer_| while the audio data is available. |
+ void ReadFromFile(); |
// Called when the state property of BluetoothMediaTransport has been updated. |
void StateChanged(device::BluetoothAudioSink::State state); |
@@ -112,9 +133,22 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothAudioSinkChromeOS |
const std::string& error_name, |
const std::string& error_message); |
- // Reads from the file descriptor acquired via Media Transport object and |
- // notify |observer_| while the audio data is available. |
- void ReadFromFD(); |
+ // Called when the file descriptor, read MTU and write MTU are retrieved |
+ // successfully using |transport_path_|. |
+ void OnAcquireSucceeded(dbus::FileDescriptor* fd, |
+ const uint16_t read_mtu, |
+ const uint16_t write_mtu); |
+ |
+ // Called when acquiring the file descriptor, read MTU and write MTU failed. |
+ void OnAcquireFailed(const std::string& error_name, |
+ const std::string& error_message); |
+ |
+ // Called when the file descriptor is released successfully. |
+ void OnReleaseFDSucceeded(); |
+ |
+ // Called when it failed to release file descriptor. |
+ void OnReleaseFDFailed(const std::string& error_name, |
+ const std::string& error_message); |
// Helper functions to clean up media, media transport and media endpoint. |
// Called when the |state_| changes to either STATE_INVALID or |
@@ -132,13 +166,25 @@ class DEVICE_BLUETOOTH_EXPORT BluetoothAudioSinkChromeOS |
uint16_t volume_; |
// Read MTU of the file descriptor acquired via Media Transport object. |
- scoped_ptr<uint16_t> read_mtu_; |
+ uint16_t read_mtu_; |
// Write MTU of the file descriptor acquired via Media Transport object. |
- scoped_ptr<uint16_t> write_mtu_; |
+ uint16_t write_mtu_; |
+ |
+ // Flag for logging the read failure in ReadFromFD. |
+ bool read_has_failed_; |
+ |
+ // The file which takes ownership of the file descriptor acquired via Media |
+ // Transport object. |
+ scoped_ptr<base::File> file_; |
+ |
+ // To avoid reallocation of memory, data will be updated only when |read_mtu_| |
+ // changes. |
+ scoped_ptr<char[]> data_; |
- // File descriptor acquired via Media Transport object. |
- dbus::FileDescriptor fd_; |
+ // File descriptor watcher for the file descriptor acquired via Media |
+ // Transport object. |
+ base::MessageLoopForIO::FileDescriptorWatcher fd_read_watcher_; |
// Object path of the media object being used. |
dbus::ObjectPath media_path_; |