PlayerController.java
上传用户:liming6160
上传日期:2022-06-07
资源大小:785k
文件大小:10k
源码类别:

J2ME

开发平台:

Java

  1. /*
  2.  *    MFRadio - stream radio client for Java 2 Micro Edition
  3.  *    Copyright (C) 2001 - 2007 Mobicom-Kavkaz, Inc
  4.  *    
  5.  *    Visit the project page at: http://mfradio.sourceforge.net
  6.  *
  7.  *    This program is free software; you can redistribute it and/or modify
  8.  *    it under the terms of the GNU General Public License as published by
  9.  *    the Free Software Foundation; either version 2 of the License, or
  10.  *    (at your option) any later version.
  11.  *
  12.  *    This program is distributed in the hope that it will be useful,
  13.  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  *    GNU General Public License for more details.
  16.  *
  17.  *    You should have received a copy of the GNU General Public License
  18.  *    along with this program; if not, write to the Free Software
  19.  *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  *
  21.  *    Java (TM) and all Java (TM)-based marks are a trademark or 
  22.  *    registered trademark of Sun Microsystems, Inc, in the United States 
  23.  *    and other countries.
  24.  */
  25. package ru.mobicomk.mfradio.controller;
  26. import java.util.Hashtable;
  27. import javax.microedition.media.PlayerListener;
  28. import ru.mobicomk.mfradio.Constants;
  29. import ru.mobicomk.mfradio.iface.PlayerQueue;
  30. import ru.mobicomk.mfradio.util.AppException;
  31. import ru.mobicomk.mfradio.util.PlayerQueueImpl;
  32. import ru.mobicomk.mfradio.util.StationInfo;
  33. /**
  34.  * Player maker and player runner threads controller.
  35.  * Владеет PlayerQueue, владеет и управляет PlayerMaker-ом и PlayerRunner-ом.
  36.  * Создаётся для каждой новой интернет радиостанции.
  37.  *
  38.  * @author  Roman Bondarenko
  39.  */
  40. public class PlayerController {
  41.     
  42.     // Members /////////////////////////////////////////////////////////////////
  43.     
  44.     private StationInfo stationInfo_;
  45.     private PlayerMakerThread maker_;
  46.     private PlayerRunnerThread runner_;
  47.     private PlayerQueue playerQueue_;
  48.     private PlayerListener playerListener_;
  49.     
  50.     private UIController uiController_;
  51.     
  52.     private boolean isPlaying_;
  53.     
  54.     // Public //////////////////////////////////////////////////////////////////
  55.     
  56.     /**
  57.      * Creates a new instance of PlayerController.
  58.      * @param uiController Application controller object.
  59.      */
  60.     public PlayerController(UIController uiController) {
  61.         uiController_ = uiController;
  62.         playerListener_ = null;
  63.         isPlaying_ = false;
  64.     }
  65.     
  66.     /**
  67.      * Second level initialize method. Setting up station information for
  68.      * player.
  69.      * <p>Note: Must be called before each {@link #startPlay} method invocation.</p>
  70.      * <p>Note: Player must be stopped before this method call.</p>
  71.      * @param si New radio station information.
  72.      * @throws java.lang.Exception if called during plaing.
  73.      */
  74.     public synchronized void init(StationInfo si) throws Exception {
  75.         if (isPlaying_) {
  76.             throw new AppException(uiController_.getLocale().getString(Constants.STR_Must_be_stopped));
  77.         }
  78.         uiController_.progressMessage(uiController_.getLocale().getString(Constants.STR_Initialize));
  79.         initPlayerImpl(si); // exception
  80.     }
  81.     
  82.     /**
  83.      * Run stream playing loop.
  84.      * <p>Note: Must be called ater {@link #init} method.</p>
  85.      * <p>Note: Player must be stopped before this method call.</p>
  86.      * @throws java.lang.Exception if called during plaing or if called
  87.      * without initialization ({@link #init}).
  88.      */
  89.     public synchronized void startPlay() throws Exception {
  90.         //uiController_.log("startPlay >> begin");
  91.         
  92.         if (isPlaying_) {
  93.             throw new Exception(uiController_.getLocale().getString(Constants.STR_Must_be_stopped));
  94.         }
  95.         if (maker_ == null || runner_ == null) {
  96.             throw new Exception(uiController_.getLocale().getString(Constants.STR_Must_be_inited));
  97.         }
  98.         
  99.         maker_.start();
  100.         runner_.start();
  101.         
  102.         isPlaying_ = true;
  103.         //uiController_.log("startPlay >> end");
  104.     }
  105. /*
  106.     public void stopPlay() {
  107.         //uiController_.log("stopPlay >> begin");
  108.  
  109.         if (!isPlaying_) {
  110.             //uiController_.log("stopPlay >> end (not playing)");
  111.             return;
  112.         }
  113.  
  114.         maker_.StopFlag.set();
  115.         runner_.StopFlag.set();
  116.  
  117.         runner_.stop();
  118.  
  119.  
  120.         //uiController_.log("stopPlay >> Stop flags is set...");
  121.  
  122.         Thread.yield();
  123.         /*
  124.         try {
  125.             maker_.join();
  126.             runner_.join();
  127.         } catch (InterruptedException ex) {
  128.             //uiController_.log(ex);
  129.         }* /
  130.         //maker_.interrupt();
  131.         //runner_.interrupt();
  132.  
  133.         maker_ = null;
  134.         runner_ = null;
  135.  
  136.         playerQueue_.clear();
  137.         playerQueue_ = null;
  138.  
  139.         isPlaying_ = false;
  140.         //uiController_.log("stopPlay: leave");
  141.     }*/
  142.     
  143.     /**
  144.      * Stop stream playing loop.
  145.      */
  146.     public synchronized void stopPlay() {
  147.         //uiController_.log("stopPlay >> begin");
  148.         
  149.         if (!isPlaying_) {
  150.             //uiController_.log("stopPlay >> end (not playing)");
  151.             return;
  152.         }
  153.         
  154.         // check for maker is a current thread
  155.         boolean needToStopMaker = (maker_ != null)
  156.         && !maker_.StopFlag.value()
  157.         && (maker_ != Thread.currentThread());
  158.         
  159.         if (needToStopMaker && maker_.isAlive()) {
  160.             maker_.stop();
  161.         }
  162.         
  163.         if (playerQueue_ != null) {
  164.             playerQueue_.clear();
  165.         }
  166.         
  167.         boolean needToStopRunner = (runner_ != null)
  168.         && !runner_.StopFlag.value()
  169.         && (runner_ != Thread.currentThread());
  170.         
  171.         if (needToStopRunner && runner_.isAlive()) {
  172.             runner_.stop();
  173.         }
  174.         
  175.         Thread.yield();
  176.         
  177.         //uiController_.log("stopPlay >> Stop flags is set...");
  178.         
  179.         int counter = 0;
  180.         try {
  181.             while (((needToStopMaker && maker_.isAlive())
  182.             || (needToStopRunner && runner_.isAlive()))
  183.             && (counter < 6)) {
  184.                 Thread.sleep(500);
  185.                 uiController_.updateProgress();
  186.                 counter++;
  187.             }
  188.         } catch (InterruptedException ex) { }
  189.         
  190.         /*
  191.         if (maker_.isAlive()) {
  192.             maker_.interrupt(); // WARNING: CLDC 1.1!
  193.             uiController_.progressMessage("maker killed!");
  194.             //uiController_.log("stopPlay >> maker killed!");
  195.         }
  196.          
  197.         if (runner_.isAlive()) {
  198.             runner_.interrupt(); // WARNING: CLDC 1.1!
  199.             uiController_.progressMessage("runner killed!");
  200.             //uiController_.log("stopPlay >> runner killed!");
  201.         }*/
  202.         
  203.         maker_ = null;
  204.         runner_ = null;
  205.         playerQueue_ = null;
  206.         
  207.         isPlaying_ = false;
  208.         
  209.         //uiController_.log("stopPlay >> end");
  210.     }
  211.     
  212.     /**
  213.      * Get information about current player state.
  214.      * @return <b>true</b> if stream playing loop is running, <b>false</b>
  215.      * othrwise.
  216.      */
  217.     public boolean isPlaying() {
  218.         return isPlaying_;
  219.     }
  220.     
  221.     /**
  222.      * Set the volume using linear point scale with values between 0 and 100.
  223.      * 0 is silence; 100 is the loudest usefull level that current
  224.      * VolumeControl supports. If the given level is less than 0 or greater
  225.      * than 100, the level well be set to 0 or 100 respectively.
  226.      * @param level The new volume specified in the level scale.
  227.      */
  228.     public void setVolume(int level) {
  229.         if (runner_ != null) {
  230.             runner_.setVolume(level);
  231.         }
  232.     }
  233.     
  234.     /**
  235.      * HTTP headers of the audio stream request accessor.
  236.      * @return HTTP header of the audio stream request.
  237.      */
  238.     public Hashtable getHeaders() {
  239.         return maker_.getHeaders();
  240.     }
  241.     
  242.     // Privates ////////////////////////////////////////////////////////////////
  243.     
  244.     private void initPlayerImpl(StationInfo si) throws Exception  {
  245.         stationInfo_ = si;
  246.         boolean inited = false;
  247.         
  248.         try {
  249.             uiController_.updateProgress(); // exception
  250.             
  251.             //uiController_.log("initPlayer >> start");
  252.             
  253.             playerQueue_ = new PlayerQueueImpl(uiController_);
  254.             maker_ = new PlayerMakerThread(uiController_);
  255.             runner_ = new PlayerRunnerThread(playerQueue_, uiController_);
  256.             runner_.setPlayerListener(playerListener_);
  257.             
  258.             maker_.init(stationInfo_.Url, playerQueue_, runner_); // exception
  259.             uiController_.updateProgress(); // exception
  260.             
  261.             //uiController_.log("initPlayer >> finish");
  262.             
  263.             inited = true;
  264.         } catch (Exception ex) {
  265.             //uiController_.progressMessage("interrupt - 3");
  266.             //uiController_.log("initPlayer >> interrupt - 3");
  267.             runner_ = null;
  268.             maker_ = null;
  269.             playerQueue_ = null;
  270.             System.gc();
  271.             throw ex;
  272.         } /*
  273.         catch (MediaException ex) {
  274.             //uiController_.log("PlayerMakerThread.ctor >> MediaException >> " + ex.getMessage());
  275.             uiController_.firePlayerStatus("err: " + ex.getMessage());
  276.         } catch (IOException ex) {
  277.             uiController_.firePlayerStatus("err: " + ex.getMessage());
  278.             //uiController_.log("PlayerMakerThread.ctor >> IOException >> " + ex.getMessage());
  279.         } catch (Exception ex) {
  280.             uiController_.firePlayerStatus("err: " + ex.getMessage());
  281.             //uiController_.log("PlayerMakerThread.ctor >> Exception >> " + ex.getMessage());
  282.         }*/
  283.     }
  284.     
  285.     void setPlayerListener(PlayerListener listener) {
  286.         playerListener_ = listener;
  287.     }
  288.     
  289. }