#ff0000 18  2006 . - #000655       J2ME MIDP 2.0.  Mobile Media API (MMAPI)

#def Mobile Media API (MMAPI) -  ,    .  Java ,   JSR 135,   .         . 
      MMAPI    . 
 MMAPI

  MIDP 1.0     ,      ,    .   MIDP 2.0   ,        MMAPI. 

MMAPI   : 
  ,    Time-Based  .    time-based    . 
  . MMAPI        . 
    . MMAPI       . 
       . 
.          .        . 
   
      : 
 :     ,            . 
 :     ;        (  ). 
    API      : 
DataSource   ,      .        Player  . 
Player    DataSource,  ,   ,   .      .
MMAPI     Manager.         Player   DataSources,  DataSources   InputStreams. 
   Player    Manager.createPlayer(String url).  URL    .   : :. 
     Player    time-based  . 
Player     : UNREALIZED, REALIZED, PREFETCHED, STARTED  CLOSED.  , Player    UNREALIZED.   realize()     REALIZED     player-    .  prefetch()     PREFETCHED.              .  start()     STARTED,     .     (   ), Player    PREFETCHED.   close()  Player   CLOSED. 
   , Player   : 
getState() -    . 
setLoopCount( int ) -      . 
getDuration() -     . 
getMediaTime() -      . 
setMediaTime( int) -      . 
getCountType() -     . 
dellocate() -  ,  . 

Player     .     getControl() (   )  getControls() (  ). ,   MIDI   getControl()  MIDIControl. 
MMAPI 
  MMAPI   : 
javax.microedition.media -      ,    Manager. 
javax.microedition.media.control -   ,    Player,  VolumeControl  VideoControl. 
javax.microedition.media.protocol -     DataSource. 

     ,    ,    MMAPI.    :
(M) - javax.microedition.media
(C) - javax.microedition.media.control
(P) - javax.microedition.media.protocol

 1 - 		
(M)	Manager	  - ,   Playr    . 
(P)	ContentDescriptor	   
(P)	DataSource	   ,   .          .      Player. 
 2 - 		
(M)	Control	       .    Controllable. 
(M)	Controllable	    Control   Player   .
(M)	Player	      .  ,     Player.
(M)	PlayerListener	 ,  Player-
(M)	TimeBase	,     player-.
(C)	FramePositionControl	        Player.
(C)	GUIControl	   ,   GUI.
(C)	MetaDataControl	,     ,    .
(C)	MIDIControl	    MIDI .
(C)	PitchControl	    ,    .
(C)	RateControl	  
(C)	RecordControl	   
(C)	StopTimeControl	,       
(C)	TempoControl	   ( MIDI)
(C)	ToneControl	     
(C)	VideoControl	  ,     
(C)	VolumeControl	 
(P)	SourceStream	   DataSource,      Player.   Controllable.
 3 -  		
(M)	MediaException	         .
          .            Manager.getSupportedContentTypes()  Manager.getSupportedProtocols(). 
 MMAPI

   ,   MMAPI.     ,   WTK: /wtk20/apps/mmademo. 
 
 Manager.playTone()     .      ,    : 
...
try {
   //   C4 ("") 4000    100  (   0  100).
   Manager.playTone()(ToneControl.C4, 4000, 100);
} 
catch(MediaException me) {
}
 ,         .
Player player =
  Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);
player.realize();
ToneControl tc1=(ToneControl)player.getContril("ToneControl");
//  ,    Nots
tc1.setSequence(Nots);
player.start();
       : 

byte[] Nots={
ToneControl.VERSION, 1, //  
ToneControl.TEMPO, speed, // .  speed = 5-127
ToneControl.BLOCK_START, 0, //  0
ToneControl.4, 4          //   4 (  2  16)
ToneControl.SILENCE, 4 //  4
ToneControl.4+1, 4          // #  4
ToneControl.SILENCE, 4 //  4
ToneControl.4+2, 4          //   4
ToneControl.SILENCE, 4 //  4
...
...
ToneControl.4+12, 4     //   
ToneControl.BLOCK_END, 0, //  0
ToneControl.PLAY_BLOCK, 0} //  0
    ToneControl,       .       . 
  
   ,    mp3    .
try {
   Player p = Manager.createPlayer
     ("http://server/somemusic.mp3");
   p.setLoopCount(5);
   p.start();
} 
catch(IOException ioe) {
} 
catch(MediaException e) {
}    wav  midi .

      :

...
Player p;
VolumeControl vc;
try {
   p = Manager.createPlayer("http://server/somemusic.mp3");
   p.realize();
   //           .
   vc = (VolumeControl) p.getControl("VolumeControl");
   if(vc != null) {
      vc.setVolume(100);
   }
   //      
   p.prefetch();
   //  
   p.start();
} 
catch(IOException ioe) {
} 
catch(MediaException e) {
}

 Manager.createPlayer()    InputStream,     ,   MIDP Record Management System (RMS),    JAR .     ,   InputStream  RMS    . 
RecordStore store;
int id;
//   RMS
try {
   InputStream is = new ByteArrayInputStream(store.getRecord(id));
   Player player = Manager.createPlayer(is, "audio/X-wav");
   p.start();
} 
catch (IOException ioe) {
} 
catch (MediaException me) {
}
    Player player = Manager.createPlayer(is, "audio/X-wav").     midi ,    MIME : "audio/midi". 

  ,  wav ,    JAR . 
try {
   InputStream is = getClass().getResourceAsStream("audio.wav");
   Player player = Manager.createPlayer(is, "audio/X-wav");
   p.start();
} 
catch(IOException ioe) {
} 
catch(MediaException me) {
}
 

   ,    MPEG .
Player p;
VideoControl vc; 
try {
   p = Manager.createPlayer("http://server/somemovie.mpg");
   p.realize();
   //    
   vc = (VideoControl) p.getControl("VideoControl");
   ....
   p.start();
} 
catch(IOException ioe) {
} 
catch(MediaException me) {
}

 

MMAPI    .          capture://video .    VideoControl, ,         VideoControl.getSnapshot(String imageType).       PNG.     imageType,     .    ,     video.snapshot.encodings. 
J2ME Wireless Toolkit  MMAPI
J2ME Wireless Toolkit 2.0  MMAPI.        ,  MMAPI.       mmademo   .  ,  mmademo       . 
 
J2ME Wireless Toolkit    
Audio: PCM  WAV 
MIDI: Type 0 (single track), Type 1 (multiple tracks)  SP-MIDI 
Video: MPEG-1 
  MMAPI  WTK

  ,  J2ME Wireless Toolkit    (  ,        ): 
        ,         MIDI .      MediaException. 
WTK      playTone(), ,      .  playTone()      MIDI . 
           Xheapsize  emulator (      )     KToolBar Edit -> Preferences -> Storage 
 WAV       . 
         . 
 , WTK     HTTP  (  ). 
  
        ,  Mobile Media API. PlayerMIDlet   ,   .      URL. 
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
import javax.microedition.midlet.*;

public class PlayerMIDlet extends MIDlet implements 
  CommandListener, PlayerListener, Runnable {
   private Display display;
   private Form form;
   private TextField url;
   private Command start = new Command("Play", 
     Command.SCREEN, 1);
   private Command stop = new Command("Stop", 
     Command.SCREEN, 2);
   private Player player;
      
   public PlayerMIDlet() {
      display = Display.getDisplay(this);
      form = new Form("Demo Player");
      url = new TextField("Enter URL:", "", 100, TextField.URL);
      form.append(url);
      form.addCommand(start);
      form.addCommand(stop);
      form.setCommandListener(this);
      display.setCurrent(form);
   }

   protected void startApp() {
      try {
         if(player != null && player.getState() == Player.PREFETCHED) {
            player.start();
         } else {
            defplayer();
            display.setCurrent(form);
         }
      } 
      catch(MediaException me) {
         reset();
      }
   }

   protected void pauseApp() {
      try {
         if(player != null && player.getState() == 
           Player.STARTED) {
            player.stop();
         } else {
            defplayer();
         }
      } 
      catch(MediaException me) {
         reset();
      }
   }

   protected void destroyApp(
      boolean unconditional) {
      form = null;
      try {
         defplayer();
      } 
      catch(MediaException me) {
      }
   }

   public void playerUpdate(Player player, 
     String event, Object data) {
      if(event == PlayerListener.END_OF_MEDIA) {
         try {
            defplayer();
         } 
         catch(MediaException me) {
         }
         reset();
      }
   }

   public void commandAction(Command c, Displayable d) {
      if(c == start) { 
         start();
      } else if(c == stop) {
         stopPlayer();
      }
   }

   public void start() {
      Thread t = new Thread(this);
      t.start();
   }
   //   ,  
   //      
   //   ,    commandAction.
   public void run() {
      play(getURL());
   }

   String getURL() { 
     return url.getString();
   }

   void play(String url) {
      try {
         VideoControl vc;
         defplayer();
         //  
         player = Manager.createPlayer(url);
         player.addPlayerListener(this);
         player.realize();
         vc = (VideoControl)player.getControl("VideoControl");
         if(vc != null) {
            Item video = (Item)vc.initDisplayMode(
                vc.USE_GUI_PRIMITIVE, null);
            Form v = new Form("Playing Video...");
            StringItem si = new StringItem("Status: ", "Playing...");
            v.append(si);
            v.append(video);
            display.setCurrent(v);
         }
         player.prefetch();
         player.start();
      }
      catch(Throwable t) {
         reset();
      }
   }

   void defplayer() throws MediaException {
      if (player != null) {
         if(player.getState() == Player.STARTED) {
            player.stop();
         }
         if(player.getState() == Player.PREFETCHED) {
            player.deallocate();
         }
         if(player.getState() == Player.REALIZED || 
           player.getState() == Player.UNREALIZED) {
            player.close();
         }
      }
      player = null;
   }

   void reset() {
      player = null;
   }

   void stopPlayer() {
      try {
         defplayer();
      } 
      catch(MediaException me) {
      }
      reset();
   }
}
  play()   : 
C  Player. 
   PlayerListener,      playerUpdate()  PlayerListener.     ,    ,  PlayerListener-   . ,     ,   PlayerListener.END_OF_MEDIA. 
,    VideoControl.  ,     Item     . 
    . 
      ,  J2ME Wireless Toolkit 2.0.          /apps/SimplePlayer/src/PlayerMIDlet.java.     .      URL : 
http://java.sun.com/products/java-media/mma/media/test-wav.wav 
http://java.sun.com/products/java-media/mma/media/test-mpeg.mpg 

      Mobile Media API           .      mmademo,    J2ME Wireless Toolkit 2.0.