playback: cmd lost in pause mode [1/1]

PD#SWPL-140176

Problem:
cmd lost in pause mode,
cmd from update_segment_pids()

Solution:
opt the cmd's definition and processing

Verify:
PB

Change-Id: I7df535aef23d45ad3852b24733e4d30f8cc1c7da
Signed-off-by: Zhiqiang Han <zhiqiang.han@amlogic.com>
diff --git a/include/dvr_playback.h b/include/dvr_playback.h
index 94a564a..7d12012 100644
--- a/include/dvr_playback.h
+++ b/include/dvr_playback.h
@@ -238,27 +238,50 @@
 /**\brief playback play state*/
 typedef enum
 {
-  DVR_PLAYBACK_CMD_START,               /**< start av */
-  DVR_PLAYBACK_CMD_STOP,                /**< stop av */
-  DVR_PLAYBACK_CMD_V_START,              /**< v start */
-  DVR_PLAYBACK_CMD_A_START   ,           /**< a start */
-  DVR_PLAYBACK_CMD_V_STOP  ,             /**< v stop */
-  DVR_PLAYBACK_CMD_A_STOP,               /**< a stop */
-  DVR_PLAYBACK_CMD_V_RESTART,            /**< v restart */
-  DVR_PLAYBACK_CMD_A_RESTART,            /**< a restart */
-  DVR_PLAYBACK_CMD_AV_RESTART,            /**< av restart */
-  DVR_PLAYBACK_CMD_V_STOP_A_START,         /**< v stop a start*/
-  DVR_PLAYBACK_CMD_A_STOP_V_START,         /**< a stop v_start */
-  DVR_PLAYBACK_CMD_V_STOP_A_RESTART,       /**<v stop a restart*/
-  DVR_PLAYBACK_CMD_A_STOP_V_RESTART,       /**<a stop v restart*/
-  DVR_PLAYBACK_CMD_V_START_A_RESTART,       /**<v start a restart*/
-  DVR_PLAYBACK_CMD_A_START_V_RESTART,       /**<a start v restart*/
-  DVR_PLAYBACK_CMD_PAUSE,               /**< pause */
-  DVR_PLAYBACK_CMD_RESUME,              /**< resume */
-  DVR_PLAYBACK_CMD_SEEK,                /**< seek */
-  DVR_PLAYBACK_CMD_FF,                  /**< fast forward */
-  DVR_PLAYBACK_CMD_FB,                  /**< fast backword */
-  DVR_PLAYBACK_CMD_NONE,                  /**< none */
+  /*Bit order to check:
+      stop > start,
+   */
+  DVR_PLAYBACK_CMD_V_START            = 0x0001, /**< v start */
+  DVR_PLAYBACK_CMD_V_STOP             = 0x0002, /**< v stop */
+  DVR_PLAYBACK_CMD_A_START            = 0x0100, /**< a start */
+  DVR_PLAYBACK_CMD_A_STOP             = 0x0200, /**< a stop */
+  DVR_PLAYBACK_CMD_V_RESTART          = (DVR_PLAYBACK_CMD_V_STOP    | DVR_PLAYBACK_CMD_V_START  ), /**< v restart */
+  DVR_PLAYBACK_CMD_A_RESTART          = (DVR_PLAYBACK_CMD_A_STOP    | DVR_PLAYBACK_CMD_A_START  ), /**< a restart */
+  DVR_PLAYBACK_CMD_V_STOP_A_START     = (DVR_PLAYBACK_CMD_V_STOP    | DVR_PLAYBACK_CMD_A_START  ), /**< v stop a start*/
+  DVR_PLAYBACK_CMD_A_STOP_V_START     = (DVR_PLAYBACK_CMD_A_STOP    | DVR_PLAYBACK_CMD_V_START  ), /**< a stop v_start */
+  DVR_PLAYBACK_CMD_V_STOP_A_RESTART   = (DVR_PLAYBACK_CMD_V_STOP    | DVR_PLAYBACK_CMD_A_RESTART), /**<v stop a restart*/
+  DVR_PLAYBACK_CMD_A_STOP_V_RESTART   = (DVR_PLAYBACK_CMD_A_STOP    | DVR_PLAYBACK_CMD_V_RESTART), /**<a stop v restart*/
+  DVR_PLAYBACK_CMD_V_START_A_RESTART  = (DVR_PLAYBACK_CMD_V_START   | DVR_PLAYBACK_CMD_A_RESTART), /**<v start a restart*/
+  DVR_PLAYBACK_CMD_A_START_V_RESTART  = (DVR_PLAYBACK_CMD_A_START   | DVR_PLAYBACK_CMD_V_RESTART), /**<a start v restart*/
+  DVR_PLAYBACK_CMD_AV_RESTART         = (DVR_PLAYBACK_CMD_A_RESTART | DVR_PLAYBACK_CMD_V_RESTART), /**< av restart */
+  DVR_PLAYBACK_CMD_START              = (DVR_PLAYBACK_CMD_V_START   | DVR_PLAYBACK_CMD_A_START  ), /**< start av */
+  DVR_PLAYBACK_CMD_STOP               = (DVR_PLAYBACK_CMD_V_STOP    | DVR_PLAYBACK_CMD_A_STOP   ), /**< stop av */
+
+  #define DVR_PLAYBACK_CMD_RESET_V(_c)      ((_c) & (~0xFF))
+  #define DVR_PLAYBACK_CMD_RESET_A(_c)      ((_c) & (~0xFF00))
+
+  #define DVR_PLAYBACK_CMD_IS_RESTART(_c)   ((_c) == 0x03)
+  #define DVR_PLAYBACK_CMD_IS_STOP(_c)      ((_c) & 0x02)
+  #define DVR_PLAYBACK_CMD_IS_START(_c)     ((_c) & 0x01)
+
+  #define DVR_PLAYBACK_CMD_GET_V_CMD(_c)    ((_c) & 0xFF)
+  #define DVR_PLAYBACK_CMD_GET_A_CMD(_c)    (((_c) & 0xFF00) >> 8)
+
+  #define DVR_PLAYBACK_CMD_IS_V_RESTART(_c) DVR_PLAYBACK_CMD_IS_RESTART(DVR_PLAYBACK_CMD_GET_V_CMD(_c))
+  #define DVR_PLAYBACK_CMD_IS_A_RESTART(_c) DVR_PLAYBACK_CMD_IS_RESTART(DVR_PLAYBACK_CMD_GET_A_CMD(_c))
+
+  #define DVR_PLAYBACK_CMD_IS_V_STOP(_c)    DVR_PLAYBACK_CMD_IS_STOP(DVR_PLAYBACK_CMD_GET_V_CMD(_c))
+  #define DVR_PLAYBACK_CMD_IS_A_STOP(_c)    DVR_PLAYBACK_CMD_IS_STOP(DVR_PLAYBACK_CMD_GET_A_CMD(_c))
+
+  #define DVR_PLAYBACK_CMD_IS_V_START(_c)   DVR_PLAYBACK_CMD_IS_START(DVR_PLAYBACK_CMD_GET_V_CMD(_c))
+  #define DVR_PLAYBACK_CMD_IS_A_START(_c)   DVR_PLAYBACK_CMD_IS_START(DVR_PLAYBACK_CMD_GET_A_CMD(_c))
+
+  DVR_PLAYBACK_CMD_PAUSE              = 0x10000,  /**< pause */
+  DVR_PLAYBACK_CMD_RESUME             = 0x20000,  /**< resume */
+  DVR_PLAYBACK_CMD_SEEK               = 0x40000,  /**< seek */
+  DVR_PLAYBACK_CMD_FF                 = 0x100000, /**< fast forward */
+  DVR_PLAYBACK_CMD_FB                 = 0x200000, /**< fast backword */
+  DVR_PLAYBACK_CMD_NONE               = 0,        /**< none */
 } DVR_PlaybackCmd_t;
 
 
diff --git a/src/dvr_playback.c b/src/dvr_playback.c
index e732fd0..090e6e9 100644
--- a/src/dvr_playback.c
+++ b/src/dvr_playback.c
@@ -2354,124 +2354,57 @@
           //if state is pause, we need process at resume api. we only record change info
             int v_cmd = DVR_PLAYBACK_CMD_NONE;
             int a_cmd = DVR_PLAYBACK_CMD_NONE;
-            if (VALID_PID(segment->pids.video.pid)
-              && VALID_PID(p_pids->video.pid)
-              && segment->pids.video.pid != p_pids->video.pid) {
-              //restart video
-              v_cmd = DVR_PLAYBACK_CMD_V_RESTART;
-            }
-            if (!VALID_PID(segment->pids.video.pid)
-                && VALID_PID(p_pids->video.pid)
-                && segment->pids.video.pid != p_pids->video.pid) {
-                //start video
-                v_cmd = DVR_PLAYBACK_CMD_V_START;
-            }
-            if (VALID_PID(segment->pids.video.pid)
-                && !VALID_PID(p_pids->video.pid)
-                && segment->pids.video.pid != p_pids->video.pid) {
-                //stop video
-                v_cmd = DVR_PLAYBACK_CMD_V_STOP;
-            }
-            if (VALID_PID(segment->pids.audio.pid)
-              && VALID_PID(p_pids->audio.pid)
-              && segment->pids.audio.pid != p_pids->audio.pid) {
-              //restart audio
-              a_cmd = DVR_PLAYBACK_CMD_A_RESTART;
-            }
-            if (!VALID_PID(segment->pids.audio.pid)
-                && VALID_PID(p_pids->audio.pid)
-                && segment->pids.audio.pid != p_pids->audio.pid) {
-                //start audio
-                a_cmd = DVR_PLAYBACK_CMD_A_START;
-            }
-            if (VALID_PID(segment->pids.audio.pid)
-                && !VALID_PID(p_pids->audio.pid)
-                && segment->pids.audio.pid != p_pids->audio.pid) {
-                //stop audio
-                a_cmd = DVR_PLAYBACK_CMD_A_STOP;
-            }
+
+            #define CHECK_IF_NEED_RESTART(_now, _next, _cmd, _v_cmd) \
+              if (VALID_PID(_now) && VALID_PID(_next) && (_now) != (_next)) \
+                (_cmd) = (_v_cmd);
+
+            #define CHECK_IF_NEED_STOP(_now, _next, _cmd, _v_cmd) \
+              if (VALID_PID(_now) && !VALID_PID(_next)) \
+                (_cmd) = (_v_cmd);
+
+            #define CHECK_IF_NEED_START(_now, _next, _cmd, _v_cmd) \
+              if (!VALID_PID(_now) && VALID_PID(_next)) \
+                (_cmd) = (_v_cmd);
+
+            CHECK_IF_NEED_RESTART(segment->pids.video.pid, p_pids->video.pid, v_cmd, DVR_PLAYBACK_CMD_V_RESTART);
+            CHECK_IF_NEED_STOP(segment->pids.video.pid, p_pids->video.pid, v_cmd, DVR_PLAYBACK_CMD_V_STOP);
+            CHECK_IF_NEED_START(segment->pids.video.pid, p_pids->video.pid, v_cmd, DVR_PLAYBACK_CMD_V_START);
+
+            CHECK_IF_NEED_RESTART(segment->pids.audio.pid, p_pids->audio.pid, a_cmd, DVR_PLAYBACK_CMD_A_RESTART);
+            CHECK_IF_NEED_STOP(segment->pids.audio.pid, p_pids->audio.pid, a_cmd, DVR_PLAYBACK_CMD_A_STOP);
+            CHECK_IF_NEED_START(segment->pids.audio.pid, p_pids->audio.pid, a_cmd, DVR_PLAYBACK_CMD_A_START);
 
             /*process the ad, if main audio exists, but no action*/
             if (a_cmd == DVR_PLAYBACK_CMD_NONE && VALID_PID(p_pids->audio.pid)) {
 
-                if (VALID_PID(segment->pids.ad.pid)
-                  && VALID_PID(p_pids->ad.pid)
-                  && segment->pids.ad.pid != p_pids->ad.pid) {
-                  //changed
-                  a_cmd = DVR_PLAYBACK_CMD_A_RESTART;
-                }
-                if (VALID_PID(segment->pids.ad.pid)
-                  && !VALID_PID(p_pids->ad.pid)
-                  && segment->pids.ad.pid != p_pids->ad.pid) {
-                  //to stop
-                  a_cmd = DVR_PLAYBACK_CMD_A_RESTART;
-                }
-                if (!VALID_PID(segment->pids.ad.pid)
-                  && VALID_PID(p_pids->ad.pid)
-                  && segment->pids.ad.pid != p_pids->ad.pid) {
-                  //to start
-                  a_cmd = DVR_PLAYBACK_CMD_A_RESTART;
-                }
+              CHECK_IF_NEED_RESTART(segment->pids.ad.pid, p_pids->ad.pid, a_cmd, DVR_PLAYBACK_CMD_A_RESTART);
+              CHECK_IF_NEED_STOP(segment->pids.ad.pid, p_pids->ad.pid, a_cmd, DVR_PLAYBACK_CMD_A_RESTART);
+              CHECK_IF_NEED_START(segment->pids.ad.pid, p_pids->ad.pid, a_cmd, DVR_PLAYBACK_CMD_A_RESTART);
 
             }
 
-            if (a_cmd == DVR_PLAYBACK_CMD_NONE
-              && v_cmd == DVR_PLAYBACK_CMD_NONE) {
-              //do nothing
-            } else if (a_cmd == DVR_PLAYBACK_CMD_NONE
-              || v_cmd == DVR_PLAYBACK_CMD_NONE) {
-              player->cmd.last_cmd =DVR_PLAYBACK_CMD_PAUSE;
-              player->cmd.cur_cmd = a_cmd != DVR_PLAYBACK_CMD_NONE ? a_cmd : v_cmd;
-            } else if (a_cmd != DVR_PLAYBACK_CMD_NONE
-              && v_cmd != DVR_PLAYBACK_CMD_NONE) {
-              if (v_cmd == DVR_PLAYBACK_CMD_V_RESTART
-                && (a_cmd == DVR_PLAYBACK_CMD_A_RESTART)) {
-                player->cmd.last_cmd =DVR_PLAYBACK_CMD_PAUSE;
-                player->cmd.cur_cmd = DVR_PLAYBACK_CMD_AV_RESTART;
-              }else if (v_cmd == DVR_PLAYBACK_CMD_V_RESTART
-                && a_cmd == DVR_PLAYBACK_CMD_A_START) {
-                player->cmd.last_cmd =DVR_PLAYBACK_CMD_PAUSE;
-                player->cmd.cur_cmd = DVR_PLAYBACK_CMD_A_START_V_RESTART;
-              } else {
-                player->cmd.last_cmd =DVR_PLAYBACK_CMD_PAUSE;
-                player->cmd.cur_cmd = DVR_PLAYBACK_CMD_A_STOP_V_RESTART;
-              }
+            DVR_PB_INFO("%s, v_cmd[%#x] a_cmd[%#x]", __func__, v_cmd, a_cmd);
 
-              if (v_cmd == DVR_PLAYBACK_CMD_V_START
-                && (a_cmd == DVR_PLAYBACK_CMD_A_RESTART)) {
-                player->cmd.last_cmd =DVR_PLAYBACK_CMD_PAUSE;
-                player->cmd.cur_cmd = DVR_PLAYBACK_CMD_V_START_A_RESTART;
-              } else if (v_cmd == DVR_PLAYBACK_CMD_V_START
-                && a_cmd == DVR_PLAYBACK_CMD_A_START) {
-                //not occur this case
-                player->cmd.last_cmd =DVR_PLAYBACK_CMD_PAUSE;
-                player->cmd.cur_cmd = DVR_PLAYBACK_CMD_START;
-              } else {
-                player->cmd.last_cmd =DVR_PLAYBACK_CMD_PAUSE;
-                player->cmd.cur_cmd = DVR_PLAYBACK_CMD_A_STOP_V_START;
-              }
-
-              if (v_cmd == DVR_PLAYBACK_CMD_V_STOP
-                && a_cmd == DVR_PLAYBACK_CMD_A_START) {
-                player->cmd.last_cmd =DVR_PLAYBACK_CMD_PAUSE;
-                player->cmd.cur_cmd = DVR_PLAYBACK_CMD_V_STOP_A_START;
-              } else if (v_cmd == DVR_PLAYBACK_CMD_V_STOP
-                && a_cmd == DVR_PLAYBACK_CMD_A_RESTART) {
-                player->cmd.last_cmd =DVR_PLAYBACK_CMD_PAUSE;
-                player->cmd.cur_cmd = DVR_PLAYBACK_CMD_V_STOP_A_RESTART;
-              } else {
-                //not occur this case
-                player->cmd.last_cmd =DVR_PLAYBACK_CMD_PAUSE;
-                player->cmd.cur_cmd = DVR_PLAYBACK_CMD_STOP;
-              }
+            if (player->cmd.last_cmd == DVR_PLAYBACK_CMD_PAUSE
+              && player->cmd.cur_cmd != DVR_PLAYBACK_CMD_NONE) {
+              /*another cmd coming in pause mode, should check and merge with last cmd*/
+              player->cmd.cur_cmd |= a_cmd | v_cmd;
+            } else {
+              player->cmd.cur_cmd = a_cmd | v_cmd;
             }
+            player->cmd.last_cmd = DVR_PLAYBACK_CMD_PAUSE;
+
+            DVR_PB_INFO("%s, last_cmd[%#x] cur_cmd[%#x]", __func__, player->cmd.last_cmd, player->cmd.cur_cmd);
         }
+
         memcpy(&player->cur_segment.pids, p_pids, sizeof(DVR_PlaybackPids_t));
       }
       //save pids info
-      DVR_PB_INFO(":apid :%d %d", segment->pids.audio.pid, p_pids->audio.pid);
+      DVR_PB_INFO(":vpid :%d -> %d", segment->pids.video.pid, p_pids->video.pid);
+      DVR_PB_INFO(":apid :%d -> %d", segment->pids.audio.pid, p_pids->audio.pid);
+      DVR_PB_INFO(":adpid :%d -> %d", segment->pids.ad.pid, p_pids->ad.pid);
       memcpy(&segment->pids, p_pids, sizeof(DVR_PlaybackPids_t));
-      DVR_PB_INFO(":cp apid :%d %d", segment->pids.audio.pid, p_pids->audio.pid);
       break;
     }
   }
@@ -2760,71 +2693,45 @@
   memset(&audio_params, 0, sizeof(audio_params));
 
   _dvr_playback_get_playinfo(handle, segmentid, &video_params, &audio_params, &ad_params);
-  DVR_PB_INFO("unlock cmd: %d", cmd);
+  DVR_PB_INFO("unlock, _dvr_cmd: %#x", cmd);
   dvr_mutex_unlock(&player->lock);
 
-  switch (cmd) {
-    case DVR_PLAYBACK_CMD_AV_RESTART:
-      //av restart
-      DVR_PB_INFO("do_cmd av_restart");
-      _dvr_playback_replay((DVR_PlaybackHandle_t)player, DVR_FALSE);
-      break;
-    case DVR_PLAYBACK_CMD_V_RESTART:
+  if (DVR_PLAYBACK_CMD_IS_V_RESTART(cmd) && DVR_PLAYBACK_CMD_IS_A_RESTART(cmd)) {
+
+    DVR_PB_INFO("do_cmd av_restart");
+    _dvr_playback_replay((DVR_PlaybackHandle_t)player, DVR_FALSE);
+
+  } else if (cmd == DVR_PLAYBACK_CMD_FF || cmd == DVR_PLAYBACK_CMD_FB) {
+
+    _dvr_playback_fffb((DVR_PlaybackHandle_t)player);
+
+  } else if (cmd == DVR_PLAYBACK_CMD_START || cmd == DVR_PLAYBACK_CMD_STOP) {
+
+    //nop
+
+  } else {
+
+    if (DVR_PLAYBACK_CMD_IS_A_STOP(cmd)) {
+      DVR_PB_INFO("do_cmd a_stop");
+      dvr_playback_audio_stop((DVR_PlaybackHandle_t)player);
+    }
+
+    if (DVR_PLAYBACK_CMD_IS_V_STOP(cmd)) {
+      DVR_PB_INFO("do_cmd v_stop");
       dvr_playback_video_stop((DVR_PlaybackHandle_t)player);
+    }
+
+    if (DVR_PLAYBACK_CMD_IS_V_START(cmd)) {
+      DVR_PB_INFO("do_cmd v_start");
       dvr_playback_video_start((DVR_PlaybackHandle_t)player, &video_params);
-      break;
-    case DVR_PLAYBACK_CMD_V_START:
-      dvr_playback_video_start((DVR_PlaybackHandle_t)player, &video_params);
-      break;
-    case DVR_PLAYBACK_CMD_V_STOP:
-      dvr_playback_video_stop((DVR_PlaybackHandle_t)player);
-      break;
-    case DVR_PLAYBACK_CMD_A_RESTART:
-      //a restart
-      dvr_playback_audio_stop((DVR_PlaybackHandle_t)player);
+    }
+
+    if (DVR_PLAYBACK_CMD_IS_A_START(cmd)) {
+      DVR_PB_INFO("do_cmd a_start");
       dvr_playback_audio_start((DVR_PlaybackHandle_t)player, &audio_params, &ad_params);
-      break;
-    case DVR_PLAYBACK_CMD_A_START:
-      dvr_playback_audio_start((DVR_PlaybackHandle_t)player, &audio_params, &ad_params);
-      break;
-    case DVR_PLAYBACK_CMD_A_STOP:
-      dvr_playback_audio_stop((DVR_PlaybackHandle_t)player);
-      break;
-    case  DVR_PLAYBACK_CMD_A_STOP_V_RESTART:
-      dvr_playback_audio_stop((DVR_PlaybackHandle_t)player);
-      dvr_playback_video_stop((DVR_PlaybackHandle_t)player);
-      dvr_playback_video_start((DVR_PlaybackHandle_t)player, &video_params);
-      break;
-    case DVR_PLAYBACK_CMD_A_STOP_V_START:
-      dvr_playback_audio_stop((DVR_PlaybackHandle_t)player);
-      dvr_playback_video_start((DVR_PlaybackHandle_t)player, &video_params);
-      break;
-    case DVR_PLAYBACK_CMD_V_STOP_A_RESTART:
-      dvr_playback_video_stop((DVR_PlaybackHandle_t)player);
-      dvr_playback_audio_stop((DVR_PlaybackHandle_t)player);
-      dvr_playback_audio_start((DVR_PlaybackHandle_t)player, &audio_params, &ad_params);
-      break;
-    case DVR_PLAYBACK_CMD_STOP:
-      break;
-    case DVR_PLAYBACK_CMD_START:
-      break;
-    case DVR_PLAYBACK_CMD_A_START_V_RESTART:
-      dvr_playback_video_stop((DVR_PlaybackHandle_t)player);
-      dvr_playback_video_start((DVR_PlaybackHandle_t)player, &video_params);
-      dvr_playback_audio_start((DVR_PlaybackHandle_t)player, &audio_params, &ad_params);
-      break;
-    case DVR_PLAYBACK_CMD_V_START_A_RESTART:
-      dvr_playback_audio_stop((DVR_PlaybackHandle_t)player);
-      dvr_playback_video_start((DVR_PlaybackHandle_t)player, &video_params);
-      dvr_playback_audio_start((DVR_PlaybackHandle_t)player, &audio_params, &ad_params);
-      break;
-    case DVR_PLAYBACK_CMD_FF:
-    case DVR_PLAYBACK_CMD_FB:
-      _dvr_playback_fffb((DVR_PlaybackHandle_t)player);
-      break;
-    default:
-      break;
+    }
   }
+
   return DVR_SUCCESS;
 }
 
@@ -3206,42 +3113,14 @@
 #endif
   }
   if (player->state == DVR_PLAYBACK_STATE_PAUSE) {
+
     if (v_restarted) {
-      switch (player->cmd.cur_cmd) {
-      case DVR_PLAYBACK_CMD_V_RESTART:
-        player->cmd.cur_cmd = DVR_PLAYBACK_CMD_NONE;
-        break;
-      case DVR_PLAYBACK_CMD_A_STOP_V_RESTART:
-        player->cmd.cur_cmd = DVR_PLAYBACK_CMD_A_STOP;
-        break;
-      case DVR_PLAYBACK_CMD_A_START_V_RESTART:
-        player->cmd.cur_cmd = DVR_PLAYBACK_CMD_A_START;
-        break;
-      case DVR_PLAYBACK_CMD_AV_RESTART:
-        player->cmd.cur_cmd = DVR_PLAYBACK_CMD_A_RESTART;
-        break;
-      default:
-        break;
-      }
+      DVR_PLAYBACK_CMD_RESET_V(player->cmd.cur_cmd);
     }
     if (a_restarted) {
-      switch (player->cmd.cur_cmd) {
-      case DVR_PLAYBACK_CMD_A_RESTART:
-        player->cmd.cur_cmd = DVR_PLAYBACK_CMD_NONE;
-        break;
-      case DVR_PLAYBACK_CMD_V_STOP_A_RESTART:
-        player->cmd.cur_cmd = DVR_PLAYBACK_CMD_V_STOP;
-        break;
-      case DVR_PLAYBACK_CMD_V_START_A_RESTART:
-        player->cmd.cur_cmd = DVR_PLAYBACK_CMD_V_START;
-        break;
-      case DVR_PLAYBACK_CMD_AV_RESTART:
-        player->cmd.cur_cmd = DVR_PLAYBACK_CMD_V_RESTART;
-        break;
-      default:
-        break;
-      }
+      DVR_PLAYBACK_CMD_RESET_A(player->cmd.cur_cmd);
     }
+
     player->cmd.state = DVR_PLAYBACK_STATE_PAUSE;
     DVR_PLAYER_CHANGE_STATE(player,DVR_PLAYBACK_STATE_PAUSE);
     if (VALID_PID(audio_params.pid) || VALID_PID(video_params.pid))