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

Side by Side Diff: media/mojo/services/mojo_media_application.cc

Issue 1200323003: media: Quit MojoMediaApplication when no service is bound. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "media/mojo/services/mojo_media_application.h" 5 #include "media/mojo/services/mojo_media_application.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/thread_task_runner_handle.h"
8 #include "media/mojo/services/mojo_cdm_service.h" 9 #include "media/mojo/services/mojo_cdm_service.h"
9 #include "media/mojo/services/mojo_renderer_service.h" 10 #include "media/mojo/services/mojo_renderer_service.h"
10 #include "mojo/application/public/cpp/application_connection.h" 11 #include "mojo/application/public/cpp/application_connection.h"
11 #include "mojo/application/public/cpp/application_impl.h" 12 #include "mojo/application/public/cpp/application_impl.h"
12 13
13 namespace media { 14 namespace media {
14 15
15 const char kMojoMediaAppUrl[] = "mojo:media"; 16 const char kMojoMediaAppUrl[] = "mojo:media";
17 const int kIdleTimeoutInSeconds = 30;
16 18
17 // static 19 // static
18 GURL MojoMediaApplication::AppUrl() { 20 GURL MojoMediaApplication::AppUrl() {
19 return GURL(kMojoMediaAppUrl); 21 return GURL(kMojoMediaAppUrl);
20 } 22 }
21 23
22 // static 24 // static
23 scoped_ptr<mojo::ApplicationDelegate> MojoMediaApplication::CreateApp() { 25 scoped_ptr<mojo::ApplicationDelegate> MojoMediaApplication::CreateApp() {
24 return scoped_ptr<mojo::ApplicationDelegate>(new MojoMediaApplication()); 26 return scoped_ptr<mojo::ApplicationDelegate>(new MojoMediaApplication());
25 } 27 }
26 28
27 MojoMediaApplication::MojoMediaApplication() { 29 MojoMediaApplication::MojoMediaApplication() {
28 } 30 }
29 31
30 MojoMediaApplication::~MojoMediaApplication() { 32 MojoMediaApplication::~MojoMediaApplication() {
31 } 33 }
32 34
33 void MojoMediaApplication::Initialize(mojo::ApplicationImpl* app) { 35 void MojoMediaApplication::Initialize(mojo::ApplicationImpl* app) {
36 app_impl_ = app;
sky 2015/06/24 03:03:31 Add to member initializers and set to null.
xhwang 2015/06/26 16:30:07 Added Class Member Initializers.
37
38 // Enable logging.
34 logging::LoggingSettings settings; 39 logging::LoggingSettings settings;
35 settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; 40 settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
36 logging::InitLogging(settings); 41 logging::InitLogging(settings);
37 // Display process ID, thread ID and timestamp in logs. 42 // Display process ID, thread ID and timestamp in logs.
38 logging::SetLogItems(true, true, true, false); 43 logging::SetLogItems(true, true, true, false);
44
45 StartIdleTimer();
39 } 46 }
40 47
41 bool MojoMediaApplication::ConfigureIncomingConnection( 48 bool MojoMediaApplication::ConfigureIncomingConnection(
42 mojo::ApplicationConnection* connection) { 49 mojo::ApplicationConnection* connection) {
43 connection->AddService<mojo::ContentDecryptionModule>(this); 50 connection->AddService<mojo::ContentDecryptionModule>(this);
44 connection->AddService<mojo::MediaRenderer>(this); 51 connection->AddService<mojo::MediaRenderer>(this);
45 return true; 52 return true;
46 } 53 }
47 54
48 void MojoMediaApplication::Create( 55 void MojoMediaApplication::Create(
49 mojo::ApplicationConnection* connection, 56 mojo::ApplicationConnection* connection,
50 mojo::InterfaceRequest<mojo::ContentDecryptionModule> request) { 57 mojo::InterfaceRequest<mojo::ContentDecryptionModule> request) {
51 // The created object is owned by the pipe. 58 // The created object is owned by the pipe.
52 new MojoCdmService(&cdm_service_context_, request.Pass()); 59 MojoCdmService* mojo_cdm_service =
60 new MojoCdmService(&cdm_service_context_, request.Pass());
61
62 // Passing unretained |this| is safe here because the app is guaranteed to
63 // outlive all services.
64 mojo_cdm_service->set_connection_error_handler(base::Bind(
65 &MojoMediaApplication::OnConnectionError, base::Unretained(this)));
sky 2015/06/24 03:03:31 I'm not familiar with this code. Who owns mojo_cmd
xhwang 2015/06/25 18:09:52 mojo_cmd_service is owned by the pipe since it use
66
67 active_service_count_++;
68 idle_timeout_callback_.Cancel();
53 } 69 }
54 70
55 void MojoMediaApplication::Create( 71 void MojoMediaApplication::Create(
56 mojo::ApplicationConnection* connection, 72 mojo::ApplicationConnection* connection,
57 mojo::InterfaceRequest<mojo::MediaRenderer> request) { 73 mojo::InterfaceRequest<mojo::MediaRenderer> request) {
58 // The created object is owned by the pipe. 74 // The created object is owned by the pipe.
59 new MojoRendererService(request.Pass()); 75 MojoRendererService* mojo_renderer_service =
76 new MojoRendererService(request.Pass());
77
78 // Passing unretained |this| is safe here because the app is guaranteed to
79 // outlive all services.
80 mojo_renderer_service->set_connection_error_handler(base::Bind(
81 &MojoMediaApplication::OnConnectionError, base::Unretained(this)));
82
83 active_service_count_++;
84 idle_timeout_callback_.Cancel();
85 }
86
87 void MojoMediaApplication::Quit() {
88 app_impl_ = nullptr;
89 }
90
91 void MojoMediaApplication::StartIdleTimer() {
92 // Passing unretained |app_impl_| is safe here because |app_impl_| is
93 // guaranteed to outlive |this|, and the callback is canceled if |this| is
94 // destroyed.
95 idle_timeout_callback_.Reset(base::Bind(&mojo::ApplicationImpl::Terminate,
96 base::Unretained(app_impl_)));
97 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
98 FROM_HERE, idle_timeout_callback_.callback(),
99 base::TimeDelta::FromSeconds(kIdleTimeoutInSeconds));
100 }
101
102 void MojoMediaApplication::OnConnectionError() {
103 DCHECK_GT(active_service_count_, 0u);
104 active_service_count_--;
105 if (active_service_count_ == 0) {
106 // If the last service connection has been dropped, kick off an idle timeout
107 // to shut ourselves down.
108 StartIdleTimer();
109 }
60 } 110 }
61 111
62 } // namespace media 112 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698