Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Side by Side Diff: device/bluetooth/bluetooth_audio_sink_chromeos.cc

Issue 963983002: chromeos/dbus: Add verbose log to media-related clients and service provider. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@disconnect
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "device/bluetooth/bluetooth_audio_sink_chromeos.h" 5 #include "device/bluetooth/bluetooth_audio_sink_chromeos.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <sstream> 8 #include <sstream>
9 #include <string>
9 #include <vector> 10 #include <vector>
10 11
11 #include "base/debug/stack_trace.h" 12 #include "base/debug/stack_trace.h"
12 #include "base/logging.h" 13 #include "base/logging.h"
13 #include "chromeos/dbus/dbus_thread_manager.h" 14 #include "chromeos/dbus/dbus_thread_manager.h"
14 #include "dbus/message.h" 15 #include "dbus/message.h"
15 #include "device/bluetooth/bluetooth_adapter_chromeos.h" 16 #include "device/bluetooth/bluetooth_adapter_chromeos.h"
16 17
17 using dbus::ObjectPath; 18 using dbus::ObjectPath;
18 using device::BluetoothAudioSink; 19 using device::BluetoothAudioSink;
19 20
20 namespace { 21 namespace {
21 22
22 // TODO(mcchou): Add the constant to dbus/service_constants.h. 23 // TODO(mcchou): Add the constant to dbus/service_constants.h.
23 const char kBluetoothAudioSinkServicePath[] = "/org/chromium/AudioSink"; 24 const char kBluetoothAudioSinkServicePath[] = "/org/chromium/AudioSink";
24 25
26 // Used in VLOG. Translates a BluetoothAudioSink::State to verbose description.
27 const std::vector<std::string> kState = {
28 "invalid", "disconnected", "idle", "pending", "active"};
29 const std::vector<std::string> kErrorCode = {"unsupported platform",
30 "invalid adapter",
31 "not registered",
32 "not unregistered"};
armansito 2015/02/28 00:50:28 Define helper functions that do the string convers
Ben Chan 2015/02/28 01:09:22 Don't define global constants of non-POD types (ht
Miao 2015/02/28 02:19:32 Done.
33
25 ObjectPath GenerateEndpointPath() { 34 ObjectPath GenerateEndpointPath() {
26 static unsigned int sequence_number = 0; 35 static unsigned int sequence_number = 0;
27 ++sequence_number; 36 ++sequence_number;
28 std::stringstream path; 37 std::stringstream path;
29 path << kBluetoothAudioSinkServicePath << "/endpoint" << sequence_number; 38 path << kBluetoothAudioSinkServicePath << "/endpoint" << sequence_number;
30 return ObjectPath(path.str()); 39 return ObjectPath(path.str());
31 } 40 }
32 41
33 // A dummy error callback for calling Unregister() in destructor. 42 // A dummy error callback for calling Unregister() in destructor.
34 void UnregisterErrorCallback( 43 void UnregisterErrorCallback(
35 device::BluetoothAudioSink::ErrorCode error_code) { 44 device::BluetoothAudioSink::ErrorCode error_code) {
36 VLOG(1) << "Bluetooth audio sink: Error code: " << error_code; 45 VLOG(1) << "Bluetooth audio sink: Error code: " << kErrorCode[error_code]
armansito 2015/02/28 00:50:28 Should this be "UnregisterErrorCallback - Error co
Miao 2015/02/28 02:19:32 Done.
46 << "(" << error_code << ")";
37 } 47 }
38 48
39 } // namespace 49 } // namespace
40 50
41 namespace chromeos { 51 namespace chromeos {
42 52
43 BluetoothAudioSinkChromeOS::BluetoothAudioSinkChromeOS( 53 BluetoothAudioSinkChromeOS::BluetoothAudioSinkChromeOS(
44 scoped_refptr<device::BluetoothAdapter> adapter) 54 scoped_refptr<device::BluetoothAdapter> adapter)
45 : state_(BluetoothAudioSink::STATE_INVALID), 55 : state_(BluetoothAudioSink::STATE_INVALID),
46 volume_(BluetoothAudioSink::kInvalidVolume), 56 volume_(BluetoothAudioSink::kInvalidVolume),
47 read_mtu_(nullptr), 57 read_mtu_(nullptr),
48 write_mtu_(nullptr), 58 write_mtu_(nullptr),
49 adapter_(adapter), 59 adapter_(adapter),
50 weak_ptr_factory_(this) { 60 weak_ptr_factory_(this) {
61 VLOG(1) << "Bluetooth audio sink created";
62
51 DCHECK(adapter_.get()); 63 DCHECK(adapter_.get());
52 DCHECK(adapter_->IsPresent()); 64 DCHECK(adapter_->IsPresent());
53 65
54 adapter_->AddObserver(this); 66 adapter_->AddObserver(this);
55 67
56 chromeos::BluetoothMediaClient* media = 68 chromeos::BluetoothMediaClient* media =
57 DBusThreadManager::Get()->GetBluetoothMediaClient(); 69 DBusThreadManager::Get()->GetBluetoothMediaClient();
58 DCHECK(media); 70 DCHECK(media);
59 media->AddObserver(this); 71 media->AddObserver(this);
60 72
61 chromeos::BluetoothMediaTransportClient *transport = 73 chromeos::BluetoothMediaTransportClient *transport =
62 chromeos::DBusThreadManager::Get()->GetBluetoothMediaTransportClient(); 74 chromeos::DBusThreadManager::Get()->GetBluetoothMediaTransportClient();
63 DCHECK(transport); 75 DCHECK(transport);
64 transport->AddObserver(this); 76 transport->AddObserver(this);
65 77
66 StateChanged(device::BluetoothAudioSink::STATE_DISCONNECTED); 78 StateChanged(device::BluetoothAudioSink::STATE_DISCONNECTED);
67 } 79 }
68 80
69 BluetoothAudioSinkChromeOS::~BluetoothAudioSinkChromeOS() { 81 BluetoothAudioSinkChromeOS::~BluetoothAudioSinkChromeOS() {
82 VLOG(1) << "Bluetooth audio sink destroyed";
83
70 DCHECK(adapter_.get()); 84 DCHECK(adapter_.get());
71 85
72 if (state_ != BluetoothAudioSink::STATE_INVALID && media_endpoint_.get()) { 86 if (state_ != BluetoothAudioSink::STATE_INVALID && media_endpoint_.get()) {
73 Unregister(base::Bind(&base::DoNothing), 87 Unregister(base::Bind(&base::DoNothing),
74 base::Bind(&UnregisterErrorCallback)); 88 base::Bind(&UnregisterErrorCallback));
75 } 89 }
76 90
77 adapter_->RemoveObserver(this); 91 adapter_->RemoveObserver(this);
78 92
79 chromeos::BluetoothMediaClient* media = 93 chromeos::BluetoothMediaClient* media =
80 DBusThreadManager::Get()->GetBluetoothMediaClient(); 94 DBusThreadManager::Get()->GetBluetoothMediaClient();
81 DCHECK(media); 95 DCHECK(media);
82 media->RemoveObserver(this); 96 media->RemoveObserver(this);
83 97
84 chromeos::BluetoothMediaTransportClient *transport = 98 chromeos::BluetoothMediaTransportClient *transport =
85 chromeos::DBusThreadManager::Get()->GetBluetoothMediaTransportClient(); 99 chromeos::DBusThreadManager::Get()->GetBluetoothMediaTransportClient();
86 DCHECK(transport); 100 DCHECK(transport);
87 transport->RemoveObserver(this); 101 transport->RemoveObserver(this);
88 } 102 }
89 103
90 void BluetoothAudioSinkChromeOS::Unregister( 104 void BluetoothAudioSinkChromeOS::Unregister(
91 const base::Closure& callback, 105 const base::Closure& callback,
92 const device::BluetoothAudioSink::ErrorCallback& error_callback) { 106 const device::BluetoothAudioSink::ErrorCallback& error_callback) {
107 VLOG(1) << "Bluetooth audio sink: Unregister called";
108
93 if (!DBusThreadManager::IsInitialized()) 109 if (!DBusThreadManager::IsInitialized())
94 error_callback.Run(BluetoothAudioSink::ERROR_NOT_UNREGISTERED); 110 error_callback.Run(BluetoothAudioSink::ERROR_NOT_UNREGISTERED);
95 111
96 chromeos::BluetoothMediaClient* media = 112 chromeos::BluetoothMediaClient* media =
97 DBusThreadManager::Get()->GetBluetoothMediaClient(); 113 DBusThreadManager::Get()->GetBluetoothMediaClient();
98 DCHECK(media); 114 DCHECK(media);
99 115
100 media->UnregisterEndpoint( 116 media->UnregisterEndpoint(
101 media_path_, 117 media_path_,
102 endpoint_path_, 118 endpoint_path_,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 // Regardless of the new powered state, |state_| goes to STATE_DISCONNECTED. 163 // Regardless of the new powered state, |state_| goes to STATE_DISCONNECTED.
148 // If false, the transport is closed, but the endpoint is still valid for use. 164 // If false, the transport is closed, but the endpoint is still valid for use.
149 // If true, the previous transport has been torn down, so the |state_| has to 165 // If true, the previous transport has been torn down, so the |state_| has to
150 // be disconnected before SetConfigruation is called. 166 // be disconnected before SetConfigruation is called.
151 if (state_ != BluetoothAudioSink::STATE_INVALID) 167 if (state_ != BluetoothAudioSink::STATE_INVALID)
152 StateChanged(BluetoothAudioSink::STATE_DISCONNECTED); 168 StateChanged(BluetoothAudioSink::STATE_DISCONNECTED);
153 } 169 }
154 170
155 void BluetoothAudioSinkChromeOS::MediaRemoved(const ObjectPath& object_path) { 171 void BluetoothAudioSinkChromeOS::MediaRemoved(const ObjectPath& object_path) {
156 if (object_path == media_path_) { 172 if (object_path == media_path_) {
173 VLOG(1) << "Bluetooth audio sink: media removed: "
174 << object_path.value();
157 StateChanged(BluetoothAudioSink::STATE_INVALID); 175 StateChanged(BluetoothAudioSink::STATE_INVALID);
158 } 176 }
159 } 177 }
160 178
161 void BluetoothAudioSinkChromeOS::MediaTransportRemoved( 179 void BluetoothAudioSinkChromeOS::MediaTransportRemoved(
162 const ObjectPath& object_path) { 180 const ObjectPath& object_path) {
163 // Whenever powered of |adapter_| turns false while present stays true, media 181 // Whenever powered of |adapter_| turns false while present stays true, media
164 // transport object should be removed accordingly, and the state should be 182 // transport object should be removed accordingly, and the state should be
165 // changed to STATE_DISCONNECTED. 183 // changed to STATE_DISCONNECTED.
166 if (object_path == transport_path_) { 184 if (object_path == transport_path_) {
185 VLOG(1) << "Bluetooth audio sink: media transport removed: "
armansito 2015/02/28 00:50:28 "Bluetooth audio sink - media transport removed: "
Miao 2015/02/28 02:19:33 Done.
186 << object_path.value();
167 StateChanged(BluetoothAudioSink::STATE_DISCONNECTED); 187 StateChanged(BluetoothAudioSink::STATE_DISCONNECTED);
168 } 188 }
169 } 189 }
170 190
171 void BluetoothAudioSinkChromeOS::MediaTransportPropertyChanged( 191 void BluetoothAudioSinkChromeOS::MediaTransportPropertyChanged(
172 const ObjectPath& object_path, 192 const ObjectPath& object_path,
173 const std::string& property_name) { 193 const std::string& property_name) {
174 if (object_path != transport_path_) 194 if (object_path != transport_path_)
175 return; 195 return;
176 196
(...skipping 24 matching lines...) Expand all
201 } 221 }
202 222
203 void BluetoothAudioSinkChromeOS::SetConfiguration( 223 void BluetoothAudioSinkChromeOS::SetConfiguration(
204 const ObjectPath& transport_path, 224 const ObjectPath& transport_path,
205 const TransportProperties& properties) { 225 const TransportProperties& properties) {
206 VLOG(1) << "Bluetooth audio sink: SetConfiguration called"; 226 VLOG(1) << "Bluetooth audio sink: SetConfiguration called";
207 transport_path_ = transport_path; 227 transport_path_ = transport_path;
208 228
209 // The initial state for a connection should be "idle". 229 // The initial state for a connection should be "idle".
210 if (properties.state != BluetoothMediaTransportClient::kStateIdle) { 230 if (properties.state != BluetoothMediaTransportClient::kStateIdle) {
211 VLOG(1) << "Bluetooth Audio Sink: unexpected state " << properties.state; 231 VLOG(1) << "Bluetooth audio sink: unexpected state " << properties.state;
212 return; 232 return;
213 } 233 }
214 234
215 // Updates |volume_| if the volume level is provided in |properties|. 235 // Updates |volume_| if the volume level is provided in |properties|.
216 if (properties.volume.get()) { 236 if (properties.volume.get()) {
217 VolumeChanged(*properties.volume); 237 VolumeChanged(*properties.volume);
218 } 238 }
219 239
220 StateChanged(BluetoothAudioSink::STATE_IDLE); 240 StateChanged(BluetoothAudioSink::STATE_IDLE);
221 } 241 }
(...skipping 15 matching lines...) Expand all
237 257
238 void BluetoothAudioSinkChromeOS::Released() { 258 void BluetoothAudioSinkChromeOS::Released() {
239 VLOG(1) << "Bluetooth audio sink: Released called"; 259 VLOG(1) << "Bluetooth audio sink: Released called";
240 StateChanged(BluetoothAudioSink::STATE_INVALID); 260 StateChanged(BluetoothAudioSink::STATE_INVALID);
241 } 261 }
242 262
243 void BluetoothAudioSinkChromeOS::Register( 263 void BluetoothAudioSinkChromeOS::Register(
244 const BluetoothAudioSink::Options& options, 264 const BluetoothAudioSink::Options& options,
245 const base::Closure& callback, 265 const base::Closure& callback,
246 const BluetoothAudioSink::ErrorCallback& error_callback) { 266 const BluetoothAudioSink::ErrorCallback& error_callback) {
267 VLOG(1) << "Bluetooth audio sink: Register called";
268
247 DCHECK(adapter_.get()); 269 DCHECK(adapter_.get());
248 DCHECK_EQ(state_, BluetoothAudioSink::STATE_DISCONNECTED); 270 DCHECK_EQ(state_, BluetoothAudioSink::STATE_DISCONNECTED);
249 271
250 // Gets system bus. 272 // Gets system bus.
251 dbus::Bus* system_bus = DBusThreadManager::Get()->GetSystemBus(); 273 dbus::Bus* system_bus = DBusThreadManager::Get()->GetSystemBus();
252 274
253 // Creates a Media Endpoint with newly-generated path. 275 // Creates a Media Endpoint with newly-generated path.
254 endpoint_path_ = GenerateEndpointPath(); 276 endpoint_path_ = GenerateEndpointPath();
255 media_endpoint_.reset( 277 media_endpoint_.reset(
256 BluetoothMediaEndpointServiceProvider::Create( 278 BluetoothMediaEndpointServiceProvider::Create(
(...skipping 27 matching lines...) Expand all
284 BluetoothMediaEndpointServiceProvider* 306 BluetoothMediaEndpointServiceProvider*
285 BluetoothAudioSinkChromeOS::GetEndpointServiceProvider() { 307 BluetoothAudioSinkChromeOS::GetEndpointServiceProvider() {
286 return media_endpoint_.get(); 308 return media_endpoint_.get();
287 } 309 }
288 310
289 void BluetoothAudioSinkChromeOS::StateChanged( 311 void BluetoothAudioSinkChromeOS::StateChanged(
290 BluetoothAudioSink::State state) { 312 BluetoothAudioSink::State state) {
291 if (state == state_) 313 if (state == state_)
292 return; 314 return;
293 315
294 VLOG(1) << "Bluetooth audio sink state changed: " << state; 316 VLOG(1) << "Bluetooth audio sink state changed: " << kState[state];
317
295 switch (state) { 318 switch (state) {
296 case BluetoothAudioSink::STATE_INVALID: 319 case BluetoothAudioSink::STATE_INVALID:
297 ResetMedia(); 320 ResetMedia();
298 ResetEndpoint(); 321 ResetEndpoint();
299 case BluetoothAudioSink::STATE_DISCONNECTED: 322 case BluetoothAudioSink::STATE_DISCONNECTED:
300 ResetTransport(); 323 ResetTransport();
301 break; 324 break;
302 case BluetoothAudioSink::STATE_IDLE: 325 case BluetoothAudioSink::STATE_IDLE:
303 // TODO(mcchou): BUG=441581 326 // TODO(mcchou): BUG=441581
304 // Triggered by MediaTransportPropertyChanged and SetConfiguration. 327 // Triggered by MediaTransportPropertyChanged and SetConfiguration.
(...skipping 15 matching lines...) Expand all
320 state_ = state; 343 state_ = state;
321 FOR_EACH_OBSERVER(BluetoothAudioSink::Observer, observers_, 344 FOR_EACH_OBSERVER(BluetoothAudioSink::Observer, observers_,
322 BluetoothAudioSinkStateChanged(this, state_)); 345 BluetoothAudioSinkStateChanged(this, state_));
323 } 346 }
324 347
325 void BluetoothAudioSinkChromeOS::VolumeChanged(uint16_t volume) { 348 void BluetoothAudioSinkChromeOS::VolumeChanged(uint16_t volume) {
326 if (volume == volume_) 349 if (volume == volume_)
327 return; 350 return;
328 351
329 VLOG(1) << "Bluetooth audio sink volume changed: " << volume; 352 VLOG(1) << "Bluetooth audio sink volume changed: " << volume;
353
330 volume_ = std::min(volume, BluetoothAudioSink::kInvalidVolume); 354 volume_ = std::min(volume, BluetoothAudioSink::kInvalidVolume);
331
332 FOR_EACH_OBSERVER(BluetoothAudioSink::Observer, observers_, 355 FOR_EACH_OBSERVER(BluetoothAudioSink::Observer, observers_,
333 BluetoothAudioSinkVolumeChanged(this, volume_)); 356 BluetoothAudioSinkVolumeChanged(this, volume_));
334 } 357 }
335 358
336 void BluetoothAudioSinkChromeOS::OnRegisterSucceeded( 359 void BluetoothAudioSinkChromeOS::OnRegisterSucceeded(
337 const base::Closure& callback) { 360 const base::Closure& callback) {
338 DCHECK(media_endpoint_.get()); 361 DCHECK(media_endpoint_.get());
339 VLOG(1) << "Bluetooth audio sink registerd"; 362 VLOG(1) << "Bluetooth audio sink registerd";
340 363
341 StateChanged(BluetoothAudioSink::STATE_DISCONNECTED); 364 StateChanged(BluetoothAudioSink::STATE_DISCONNECTED);
342 callback.Run(); 365 callback.Run();
343 } 366 }
344 367
345 void BluetoothAudioSinkChromeOS::OnRegisterFailed( 368 void BluetoothAudioSinkChromeOS::OnRegisterFailed(
346 const BluetoothAudioSink::ErrorCallback& error_callback, 369 const BluetoothAudioSink::ErrorCallback& error_callback,
347 const std::string& error_name, 370 const std::string& error_name,
348 const std::string& error_message) { 371 const std::string& error_message) {
349 VLOG(1) << "Bluetooth audio sink: " << error_name << ": " << error_message; 372 VLOG(1) << "Bluetooth audio sink: error " << error_name << ": "
373 << error_message;
350 374
351 ResetEndpoint(); 375 ResetEndpoint();
352 error_callback.Run(BluetoothAudioSink::ERROR_NOT_REGISTERED); 376 error_callback.Run(BluetoothAudioSink::ERROR_NOT_REGISTERED);
353 } 377 }
354 378
355 void BluetoothAudioSinkChromeOS::OnUnregisterSucceeded( 379 void BluetoothAudioSinkChromeOS::OnUnregisterSucceeded(
356 const base::Closure& callback) { 380 const base::Closure& callback) {
357 VLOG(1) << "Bluetooth audio sink unregisterd"; 381 VLOG(1) << "Bluetooth audio sink unregisterd";
358 382
359 // Once the state becomes STATE_INVALID, media, media transport and media 383 // Once the state becomes STATE_INVALID, media, media transport and media
360 // endpoint will be reset. 384 // endpoint will be reset.
361 StateChanged(BluetoothAudioSink::STATE_INVALID); 385 StateChanged(BluetoothAudioSink::STATE_INVALID);
362 callback.Run(); 386 callback.Run();
363 } 387 }
364 388
365 void BluetoothAudioSinkChromeOS::OnUnregisterFailed( 389 void BluetoothAudioSinkChromeOS::OnUnregisterFailed(
366 const device::BluetoothAudioSink::ErrorCallback& error_callback, 390 const device::BluetoothAudioSink::ErrorCallback& error_callback,
367 const std::string& error_name, 391 const std::string& error_name,
368 const std::string& error_message) { 392 const std::string& error_message) {
369 VLOG(1) << "Bluetooth audio sink: " << error_name << ": " << error_message; 393 VLOG(1) << "Bluetooth audio sink: error " << error_name << ": "
armansito 2015/02/28 00:50:28 "UnregisterError - error_name: " << error_name <<
Miao 2015/02/28 02:19:33 Done.
394 << error_message;
395
370 error_callback.Run(BluetoothAudioSink::ERROR_NOT_UNREGISTERED); 396 error_callback.Run(BluetoothAudioSink::ERROR_NOT_UNREGISTERED);
371 } 397 }
372 398
373 void BluetoothAudioSinkChromeOS::ReadFromFD() { 399 void BluetoothAudioSinkChromeOS::ReadFromFD() {
374 DCHECK_GE(fd_.value(), 0); 400 DCHECK_GE(fd_.value(), 0);
375 401
376 // TODO(mcchou): BUG=441581 402 // TODO(mcchou): BUG=441581
377 // Read from file descriptor using watcher and create a buffer to contain the 403 // Read from file descriptor using watcher and create a buffer to contain the
378 // data. Notify |Observers_| while there is audio data available. 404 // data. Notify |Observers_| while there is audio data available.
379 } 405 }
380 406
381 void BluetoothAudioSinkChromeOS::ResetMedia() { 407 void BluetoothAudioSinkChromeOS::ResetMedia() {
408 VLOG(1) << "Bluetooth audio sink: ResetMedia";
409
382 media_path_ = dbus::ObjectPath(""); 410 media_path_ = dbus::ObjectPath("");
383 } 411 }
384 412
385 void BluetoothAudioSinkChromeOS::ResetTransport() { 413 void BluetoothAudioSinkChromeOS::ResetTransport() {
414 VLOG(1) << "Bluetooth audio sink: ResetTransport";
415
386 if (transport_path_.value() == "") 416 if (transport_path_.value() == "")
387 return; 417 return;
388 transport_path_ = dbus::ObjectPath(""); 418 transport_path_ = dbus::ObjectPath("");
389 VolumeChanged(BluetoothAudioSink::kInvalidVolume); 419 VolumeChanged(BluetoothAudioSink::kInvalidVolume);
390 read_mtu_ = 0; 420 read_mtu_ = 0;
391 write_mtu_ = 0; 421 write_mtu_ = 0;
392 fd_.PutValue(-1); 422 fd_.PutValue(-1);
393 } 423 }
394 424
395 void BluetoothAudioSinkChromeOS::ResetEndpoint() { 425 void BluetoothAudioSinkChromeOS::ResetEndpoint() {
426 VLOG(1) << "Bluetooth audio sink: ResetEndpoint";
427
396 endpoint_path_ = ObjectPath(""); 428 endpoint_path_ = ObjectPath("");
397 media_endpoint_ = nullptr; 429 media_endpoint_ = nullptr;
398 } 430 }
399 431
400 } // namespace chromeos 432 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698