[Merge] lp:~albaguirre/media-hub/fix-1368786 into lp:media-hub

Jim Hodapp jim.hodapp at canonical.com
Wed Sep 17 17:48:24 UTC 2014


Review: Approve code

Looks great, thanks.

Diff comments:

> === modified file 'src/core/media/player_implementation.cpp'
> --- src/core/media/player_implementation.cpp	2014-09-09 21:27:29 +0000
> +++ src/core/media/player_implementation.cpp	2014-09-17 14:45:41 +0000
> @@ -47,7 +47,7 @@
>          WAKELOCK_CLEAR_DISPLAY,
>          WAKELOCK_CLEAR_SYSTEM,
>          WAKELOCK_CLEAR_INVALID
> -    };    
> +    };
>  
>      Private(PlayerImplementation* parent,
>              const dbus::types::ObjectPath& session_path,
> @@ -79,11 +79,8 @@
>  
>          /*
>           * Wakelock state logic:
> -         *
> -         * PLAYING->READY: delay 4 seconds and try to clear current wakelock type
> -         * PLAYING->PAUSED or PLAYING->STOPPED: delay 4 seconds and try to clear current wakelock type
> -         * READY->PAUSED: request a new wakelock (system or display)
> -         * PLAYING->PAUSED: delay 4 seconds and try to clear current wakelock type
> +         * PLAYING->READY or PLAYING->PAUSED or PLAYING->STOPPED: delay 4 seconds and try to clear current wakelock type
> +         * ANY STATE->PLAYING: request a new wakelock (system or display)
>           */
>          engine->state().changed().connect(
>                      [parent, this](const Engine::State& state)
> @@ -107,25 +104,23 @@
>                  parent->meta_data_for_current_track().set(std::get<1>(engine->track_meta_data().get()));
>                  // And update our playback status.
>                  parent->playback_status().set(media::Player::playing);
> -                if (previous_state == Engine::State::stopped || previous_state == Engine::State::paused)
> -                {
> -                    request_power_state();
> -                }
> +                request_power_state();
>                  break;
>              }
>              case Engine::State::stopped:
>              {
>                  parent->playback_status().set(media::Player::stopped);
> +                if (previous_state ==  Engine::State::playing)
> +                {
> +                    wakelock_timeout.reset(new timeout(4000, true, std::bind(&Private::clear_wakelock,
> +                                     this, std::placeholders::_1), current_wakelock_type()));
> +                }
>                  break;
>              }
>              case Engine::State::paused:
>              {
>                  parent->playback_status().set(media::Player::paused);
> -                if (previous_state == Engine::State::ready)
> -                {
> -                    request_power_state();
> -                }
> -                else if (previous_state == Engine::State::playing)
> +                if (previous_state == Engine::State::playing)
>                  {
>                      wakelock_timeout.reset(new timeout(4000, true, std::bind(&Private::clear_wakelock,
>                                      this, std::placeholders::_1), current_wakelock_type()));
> @@ -154,7 +149,7 @@
>          {
>              if (parent->is_video_source())
>              {
> -                if (display_wakelock_count == 0)
> +                if (++display_wakelock_count == 1)
>                  {
>                      auto result = uscreen_session->invoke_method_synchronously<core::UScreen::keepDisplayOn, int>();
>                      if (result.is_error())
> @@ -162,16 +157,10 @@
>                      disp_cookie = result.value();
>                      cout << "Requested new display wakelock" << endl;
>                  }
> -
> -                {
> -                    // Keep track of how many display wakelocks have been requested
> -                    std::lock_guard<std::mutex> lock(wakelock_mutex);
> -                    ++display_wakelock_count;
> -                }
>              }
>              else
>              {
> -                if (system_wakelock_count == 0)
> +                if (++system_wakelock_count == 1)
>                  {
>                      auto result = powerd_session->invoke_method_synchronously<core::Powerd::requestSysState, std::string>(sys_lock_name, static_cast<int>(1));
>                      if (result.is_error())
> @@ -179,12 +168,6 @@
>                      sys_cookie = result.value();
>                      cout << "Requested new system wakelock" << endl;
>                  }
> -
> -                {
> -                    // Keep track of how many system wakelocks have been requested
> -                    std::lock_guard<std::mutex> lock(wakelock_mutex);
> -                    ++system_wakelock_count;
> -                }
>              }
>          }
>          catch(const std::exception& e)
> @@ -204,12 +187,8 @@
>                  case wakelock_clear_t::WAKELOCK_CLEAR_INACTIVE:
>                      break;
>                  case wakelock_clear_t::WAKELOCK_CLEAR_SYSTEM:
> -                    {
> -                        std::lock_guard<std::mutex> lock(wakelock_mutex);
> -                        --system_wakelock_count;
> -                    }
>                      // Only actually clear the system wakelock once the count reaches zero
> -                    if (system_wakelock_count == 0)
> +                    if (--system_wakelock_count == 0)
>                      {
>                          cout << "Clearing system wakelock" << endl;
>                          powerd_session->invoke_method_synchronously<core::Powerd::clearSysState, void>(sys_cookie);
> @@ -217,12 +196,8 @@
>                      }
>                      break;
>                  case wakelock_clear_t::WAKELOCK_CLEAR_DISPLAY:
> -                    {
> -                        std::lock_guard<std::mutex> lock(wakelock_mutex);
> -                        --display_wakelock_count;
> -                    }
>                      // Only actually clear the display wakelock once the count reaches zero
> -                    if (display_wakelock_count == 0)
> +                    if (--display_wakelock_count == 0)
>                      {
>                          cout << "Clearing display wakelock" << endl;
>                          uscreen_session->invoke_method_synchronously<core::UScreen::removeDisplayOnRequest, void>(disp_cookie);
> @@ -250,20 +225,14 @@
>      void clear_wakelocks()
>      {
>          // Clear both types of wakelocks (display and system)
> -        if (system_wakelock_count > 0)
> +        if (system_wakelock_count.load() > 0)
>          {
> -            {
> -                std::lock_guard<std::mutex> lock(wakelock_mutex);
> -                system_wakelock_count = 1;
> -            }
> +            system_wakelock_count = 1;
>              clear_wakelock(wakelock_clear_t::WAKELOCK_CLEAR_SYSTEM);
>          }
> -        if (display_wakelock_count > 0)
> +        if (display_wakelock_count.load() > 0)
>          {
> -            {
> -                std::lock_guard<std::mutex> lock(wakelock_mutex);
> -                display_wakelock_count = 1;
> -            }
> +            display_wakelock_count = 1;
>              clear_wakelock(wakelock_clear_t::WAKELOCK_CLEAR_DISPLAY);
>          }
>      }
> @@ -278,9 +247,8 @@
>      std::string sys_lock_name;
>      int disp_cookie;
>      std::string sys_cookie;
> -    std::mutex wakelock_mutex;
> -    uint8_t system_wakelock_count;
> -    uint8_t display_wakelock_count;
> +    std::atomic<int> system_wakelock_count;

This is the first time I've seen std::atomic and is a great thing to be aware of - this is part of what code reviews are good for.

> +    std::atomic<int> display_wakelock_count;
>      std::unique_ptr<timeout> wakelock_timeout;
>      Engine::State previous_state;
>      PlayerImplementation::PlayerKey key;
> 


-- 
https://code.launchpad.net/~albaguirre/media-hub/fix-1368786/+merge/234900
Your team Ubuntu Phablet Team is subscribed to branch lp:media-hub.



More information about the Ubuntu-reviews mailing list