| // Copyright 2015 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 CHROMECAST_BASE_CAST_RESOURCE_H_ | 
 | #define CHROMECAST_BASE_CAST_RESOURCE_H_ | 
 |  | 
 | #include "base/macros.h" | 
 |  | 
 | namespace chromecast { | 
 |  | 
 | // A CastResource is a user of 1 or more Resources (primary screen, audio, | 
 | // etc). As a user, it is responsible for doing any cast-specific component | 
 | // initialization when the Resources it uses are granted. This initialization | 
 | // is referred to as "acquiring" the Resources. Conversely, when the Resources | 
 | // it uses are revoked, it must deinitialize these cast-specific components. | 
 | // This deinitialization is referred to as "releasing" the Resources. | 
 | // TODO(maclellant): RENAME/DESIGN THIS CLASS IN COMING REFACTOR. | 
 | class CastResource { | 
 |  public: | 
 |   // Resources necessary to run cast apps. CastResource may contain union of the | 
 |   // following types. | 
 |   // TODO(yucliu): Split video resources and graphic resources. | 
 |   enum Resource { | 
 |     kResourceNone = 0, | 
 |     // All resources necessary to render sounds, for example, audio pipeline, | 
 |     // speaker, etc. | 
 |     kResourceAudio = 1 << 0, | 
 |     // All resources necessary to render videos or images, for example, video | 
 |     // pipeline, primary graphics plane, display, etc. | 
 |     kResourceScreenPrimary = 1 << 1, | 
 |     // All resources necessary to render overlaid images, for example, secondary | 
 |     // graphics plane, LCD, etc. | 
 |     kResourceScreenSecondary = 1 << 2, | 
 |     // Collection of resources used for display only combined with bitwise or. | 
 |     kResourceDisplayOnly = (kResourceScreenPrimary | kResourceScreenSecondary), | 
 |     // Collection of all resources combined with bitwise or. | 
 |     kResourceAll = | 
 |         (kResourceAudio | kResourceScreenPrimary | kResourceScreenSecondary), | 
 |   }; | 
 |  | 
 |   // A Client is responsible for notifying all registered CastResource's when | 
 |   // Resources are granted/revoked so that they can acquire/release those | 
 |   // Resources. When a CastResource is done acquiring/releasing, it responds | 
 |   // to the Client that it has completed. A Client can have multiple registered | 
 |   // CastResource's, but each CastResouce has 1 Client that it responds to. | 
 |   class Client { | 
 |    public: | 
 |     // Called to register a CastResource with a Client. After registering, a | 
 |     // CastResource will start getting notified when to acquire/release | 
 |     // Resources. The Client does not take ownership of |cast_resource|. It can | 
 |     // be called from any thread. | 
 |     virtual void RegisterCastResource(CastResource* cast_resource) = 0; | 
 |  | 
 |     // TODO(esum): Add OnResourceAcquired() here once AcquireResource is | 
 |     // allowed to be asynchronous. | 
 |  | 
 |     // Called when part or all resources are released. It can be called from any | 
 |     // thread. | 
 |     //   |cast_resource| the CastResource that is released. The pointer may be | 
 |     //                   invalid. Client can't call functions with that pointer. | 
 |     //   |remain| the unreleased resource of CastResource. If kResourceNone is | 
 |     //            returned, Client will remove the resource from its watching | 
 |     //            list. | 
 |     virtual void OnResourceReleased(CastResource* cast_resource, | 
 |                                     Resource remain) = 0; | 
 |  | 
 |    protected: | 
 |     virtual ~Client() {} | 
 |   }; | 
 |  | 
 |   // Sets the Client for the CastResource to respond to when it is done with | 
 |   // Acquire/ReleaseResource. | 
 |   void SetCastResourceClient(Client* client); | 
 |   // Called to acquire resources after OEM has granted them, and before | 
 |   // they start getting used by consumers. Implementation must be synchronous | 
 |   // since consumers will start using the resource immediately afterwards. | 
 |   // TODO(esum): We should allow this method to be asynchronous in case an | 
 |   // implementer needs to make expensive calls and doesn't want to block the | 
 |   // UI thread (b/26239576). For now, don't do anything expensive in your | 
 |   // implementation; if you really need to, then this bug has to be resolved. | 
 |   virtual void AcquireResource(Resource resource) = 0; | 
 |   // Called to release resources. Implementation should call | 
 |   // Client::OnResourceReleased when resource is released on its side. | 
 |   virtual void ReleaseResource(Resource resource) = 0; | 
 |  | 
 |  protected: | 
 |   CastResource() : client_(nullptr) {} | 
 |   virtual ~CastResource() {} | 
 |  | 
 |   // For derived classes to register themselves with their Client through | 
 |   // Client::RegisterCastResource. | 
 |   void RegisterWithClient(); | 
 |   void NotifyResourceReleased(Resource remain); | 
 |  | 
 |  private: | 
 |   Client* client_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(CastResource); | 
 | }; | 
 |  | 
 | }  // namespace chromecast | 
 |  | 
 | #endif |