content: /*
   * Created by LuaView.
   * Copyright (c) 2017, Alibaba Group. All rights reserved.
   *
   * This source code is licensed under the MIT.
   * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
   */
  
  package com.taobao.luaview.fun.mapper.kit;
  
  import com.taobao.luaview.fun.base.BaseMethodMapper;
  import com.taobao.luaview.fun.mapper.LuaViewLib;
  import com.taobao.luaview.userdata.kit.UDAudio;
  import com.taobao.luaview.util.LuaUtil;
  
  import org.luaj.vm2.LuaFunction;
  import org.luaj.vm2.LuaValue;
  import org.luaj.vm2.Varargs;
  
  import java.util.List;
  
  /**
   * Audio 接口封装，声音处理
   *
   * @author song
   * @date 15/8/21
   */
  @LuaViewLib(revisions = {"20170306已对标"})
  public class AudioMethodMapper<U extends UDAudio> extends BaseMethodMapper<U> {
      private static final String TAG = "AudioMethodMapper";
      private static final String[] sMethods = new String[]{
              "play",//0
              "pause",//1
              "resume",//2
              "stop",//3
              "seekTo",//4
              "callback",//5
              "playing",//6
              "pausing",//7
              "looping"//8
      };
  
      @Override
      public List<String> getAllFunctionNames() {
          return mergeFunctionNames(TAG, super.getAllFunctionNames(), sMethods);
      }
  
      @Override
      public Varargs invoke(int code, U target, Varargs varargs) {
          final int optcode = code - super.getAllFunctionNames().size();
          switch (optcode) {
              case 0:
                  return play(target, varargs);
              case 1:
                  return pause(target, varargs);
              case 2:
                  return resume(target, varargs);
              case 3:
                  return stop(target, varargs);
              case 4:
                  return seekTo(target, varargs);
              case 5:
                  return callback(target, varargs);
              case 6:
                  return playing(target, varargs);
              case 7:
                  return pausing(target, varargs);
              case 8:
                  return looping(target, varargs);
          }
          return super.invoke(code, target, varargs);
      }
  
      //--------------------------------------- API --------------------------------------------------
  
      /**
       * play music
       *
       * @param audio
       * @param varargs
       * @return
       */
      public LuaValue play(U audio, Varargs varargs) {
          final String uriOrName = LuaUtil.getString(varargs, 2);
          final Integer loopTimes = LuaUtil.getInt(varargs, 2, 3);
          return audio.play(uriOrName, loopTimes);
      }
  
      /**
       * pause playing
       *
       * @param audio
       * @param varargs
       * @return
       */
      public LuaValue pause(U audio, Varargs varargs) {
          return audio.pause();
      }
  
  
      /**
       * resume playing
       *
       * @param audio
       * @param varargs
       * @return
       */
      public LuaValue resume(U audio, Varargs varargs) {
          return audio.resume();
      }
  
      /**
       * stop playing
       *
       * @param audio
       * @param varargs
       * @return
       */
      public LuaValue stop(U audio, Varargs varargs) {
          return audio.stop();
      }
  
      /**
       * 到某个位置
       *
       * @param audio
       * @param varargs
       * @return
       */
      public LuaValue seekTo(U audio, Varargs varargs) {
          final Integer msec = LuaUtil.getInt(varargs, 2);
          return audio.seekTo(msec);
      }
  
      /**
       * 回调
       *
       * @param audio
       * @param varargs
       * @return
       */
      public LuaValue callback(U audio, Varargs varargs) {
          if (varargs.narg() > 1) {
              return setCallback(audio, varargs);
          } else {
              return getCallback(audio, varargs);
          }
      }
  
      public LuaValue setCallback(U audio, Varargs varargs) {
          final LuaFunction callback = LuaUtil.getFunction(varargs, 2);
          return audio.setCallback(callback);
      }
  
      public LuaValue getCallback(U audio, Varargs varargs) {
          return audio.getCallback();
      }
  
  
      /**
       * 是否播放
       *
       * @param audio
       * @param varargs
       * @return
       */
      public LuaValue playing(U audio, Varargs varargs) {
          return valueOf(audio.isPlaying());
      }
  
      /**
       * 是否暂停
       *
       * @param audio
       * @param varargs
       * @return
       */
      public LuaValue pausing(U audio, Varargs varargs) {
          return valueOf(audio.isPause());
      }
  
      /**
       * 是否循环
       *
       * @param audio
       * @param varargs
       * @return
       */
      public LuaValue looping(U audio, Varargs varargs) {
          return valueOf(audio.isLooping());
      }
  
  }
  