@Override
  public void onServiceConnected(ComponentName name, IBinder service) {
    mService = IPlayerService.Stub.asInterface(service);
    if (bound) {
      Log.d(TAG, "Service Connected");
    } else {
      Log.d(TAG, "Service Connected, but was unbound in the meantime");
      return;
    }

    try {
      mService.registerCallback(mCallback, 0);
    } catch (RemoteException e) {
      throw new RuntimeException(e);
    }

    for (Opt o : options) {
      setOption(o.opt, o.arg);
    }
    options.clear();

    if (modToPlay != null) {
      playMod(modToPlay);
      modToPlay = null;
    }
  }
 public boolean dumpWav(String modName, String destFile, int length, int flags) {
   try {
     return mService.dumpWav(modName, destFile, length, flags);
   } catch (RemoteException e) {
     e.printStackTrace();
   }
   return false;
 }
 public void stop() {
   try {
     mService.stop();
   } catch (RemoteException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
   }
 }
 public byte[] getBinaryData(int what) {
   try {
     return mService.getBinaryData(what);
   } catch (RemoteException e) {
     e.printStackTrace();
   }
   return null;
 }
 public boolean seekTo(int msec) {
   try {
     return mService.seekTo(msec);
   } catch (RemoteException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
   }
   return false;
 }
 public boolean playPause(boolean play) {
   try {
     return mService.playPause(play);
   } catch (RemoteException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
   }
   return false;
 }
 public boolean setSubSong(int song) {
   try {
     return mService.setSubSong(song);
   } catch (RemoteException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
   }
   return false;
 }
 public boolean playPlaylist(String path, int index) {
   try {
     return mService.playPlaylist(path, index);
   } catch (RemoteException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
   }
   return false;
 }
 public boolean playList(java.lang.String[] names, int startIndex) {
   try {
     return mService.playList(names, startIndex);
   } catch (RemoteException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
   }
   return false;
 }
 public Map<String, Object> getSongInfo() {
   try {
     String[] s = mService.getSongInfo();
     return arrayToMap(s);
   } catch (RemoteException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
   }
   return null;
 }
  public boolean playMod(String name) {
    if (mService == null) {
      modToPlay = name;
      return true;
    }

    try {
      return mService.playMod(name);
    } catch (RemoteException e) {
      return false;
    }
  }
 public void unbindService(Context ctx) {
   Log.d(TAG, "Unbinding");
   handler = null;
   bound = false;
   if (mService != null) {
     try {
       mService.unRegisterCallback(mCallback);
     } catch (RemoteException e) {
       // throw new RuntimeException(e);
     }
   }
   ctx.unbindService(this);
 }
  public void setOption(int opt, String arg) {

    if (mService == null) {
      options.add(new Opt(opt, arg));
      return;
    }

    try {
      mService.setOption(opt, arg);
    } catch (RemoteException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }