Добавлена команда queue

This commit is contained in:
Victor 2015-05-03 13:33:24 +03:00
parent a426a6dc2c
commit d454d99d62
4 changed files with 66 additions and 0 deletions

View File

@ -28,6 +28,7 @@ public final class Lexer {
static { static {
KEYWORDS = new HashMap<String, TokenType>(); KEYWORDS = new HashMap<String, TokenType>();
KEYWORDS.put("play", TokenType.PLAY); KEYWORDS.put("play", TokenType.PLAY);
KEYWORDS.put("queue", TokenType.QUEUE);
KEYWORDS.put("stop", TokenType.STOP); KEYWORDS.put("stop", TokenType.STOP);
KEYWORDS.put("music", TokenType.MUSIC); KEYWORDS.put("music", TokenType.MUSIC);
KEYWORDS.put("ambience", TokenType.AMBIENCE); KEYWORDS.put("ambience", TokenType.AMBIENCE);

View File

@ -146,6 +146,7 @@ public final class Parser {
if (match(token, TokenType.COMMAND)) return command(); if (match(token, TokenType.COMMAND)) return command();
if (match(token, TokenType.SCENE)) return scene(); if (match(token, TokenType.SCENE)) return scene();
if (match(token, TokenType.PLAY)) return play(); if (match(token, TokenType.PLAY)) return play();
if (match(token, TokenType.QUEUE)) return queue();
if (match(token, TokenType.STOP)) return stop(); if (match(token, TokenType.STOP)) return stop();
if (match(token, TokenType.SHOW)) return show(); if (match(token, TokenType.SHOW)) return show();
@ -392,6 +393,24 @@ public final class Parser {
return false; return false;
} }
private boolean queue() {
if (match(TokenType.MUSIC)) return queueMusic();
if (match(TokenType.SOUND)) return queueSound();
return false;
}
private boolean queueMusic() {
final String name = consume(TokenType.TEXT).getText();
ViewActivity.getInstance().addMusicToQueue(name);
return false;
}
private boolean queueSound() {
final String name = consume(TokenType.TEXT).getText();
ViewActivity.getInstance().addSoundToQueue(name);
return false;
}
private boolean stop() { private boolean stop() {
if (match(TokenType.MUSIC)) { if (match(TokenType.MUSIC)) {
final FadeInfo fade = matchFade(); final FadeInfo fade = matchFade();

View File

@ -25,6 +25,7 @@ public enum TokenType {
// ключевые слова // ключевые слова
PLAY, PLAY,
QUEUE,
STOP, STOP,
MUSIC, MUSIC,
AMBIENCE, AMBIENCE,

View File

@ -3,6 +3,7 @@ package com.annimon.everlastingsummer;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import com.annimon.everlastingsummer.TouchGesture.TouchGestureType; import com.annimon.everlastingsummer.TouchGesture.TouchGestureType;
@ -50,6 +51,7 @@ public final class ViewActivity extends Activity implements TouchGesture.OnTouch
private FrameLayout container; private FrameLayout container;
private TextView textview; private TextView textview;
private MediaPlayer musicPlayer, soundPlayer; private MediaPlayer musicPlayer, soundPlayer;
private LinkedList<String> musicQueue, soundQueue;
private MapPlaces places; private MapPlaces places;
private Characters characters; private Characters characters;
@ -75,6 +77,9 @@ public final class ViewActivity extends Activity implements TouchGesture.OnTouch
container = (FrameLayout) findViewById(R.id.container); container = (FrameLayout) findViewById(R.id.container);
textview = (TextView) findViewById(R.id.text); textview = (TextView) findViewById(R.id.text);
musicQueue = new LinkedList<String>();
soundQueue = new LinkedList<String>();
background.setOnTouchListener(new TouchGesture(this, this)); background.setOnTouchListener(new TouchGesture(this, this));
spriteInContainer = new HashMap<String, ImageView>(); spriteInContainer = new HashMap<String, ImageView>();
@ -367,10 +372,29 @@ public final class ViewActivity extends Activity implements TouchGesture.OnTouch
}); });
} }
public void addMusicToQueue(String name) {
if ( (musicPlayer != null) && (musicPlayer.isPlaying()) ) {
// Если музыка играет, просто добавляем в очередь
musicQueue.addLast(name);
} else {
// Воспроизводим
music(name, NO_FADE);
}
}
public void addSoundToQueue(String name) {
if ( (soundPlayer != null) && (soundPlayer.isPlaying()) ) {
soundQueue.addLast(name);
} else {
sound(name, false, NO_FADE);
}
}
public void music(String name, FadeInfo fade) { public void music(String name, FadeInfo fade) {
try { try {
stopMusic(fade); stopMusic(fade);
musicPlayer = new MediaPlayer(); musicPlayer = new MediaPlayer();
musicPlayer.setOnCompletionListener(musicCompleteListener);
musicPlayer.setDataSource( IOUtil.getFD(PathResolver.music(name)) ); musicPlayer.setDataSource( IOUtil.getFD(PathResolver.music(name)) );
musicPlayer.prepare(); musicPlayer.prepare();
musicPlayer.setVolume(1f, 1f); musicPlayer.setVolume(1f, 1f);
@ -394,6 +418,7 @@ public final class ViewActivity extends Activity implements TouchGesture.OnTouch
try { try {
stopSound(fade); stopSound(fade);
soundPlayer = new MediaPlayer(); soundPlayer = new MediaPlayer();
soundPlayer.setOnCompletionListener(soundCompleteListener);
soundPlayer.setDataSource( IOUtil.getFD(PathResolver.sound(name)) ); soundPlayer.setDataSource( IOUtil.getFD(PathResolver.sound(name)) );
soundPlayer.prepare(); soundPlayer.prepare();
soundPlayer.setVolume(1f, 1f); soundPlayer.setVolume(1f, 1f);
@ -475,4 +500,24 @@ public final class ViewActivity extends Activity implements TouchGesture.OnTouch
onMenuItemSelected(item); onMenuItemSelected(item);
} }
}; };
private final MediaPlayer.OnCompletionListener musicCompleteListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
if (musicQueue.size() > 0) {
music(musicQueue.removeFirst(), NO_FADE);
}
}
};
private final MediaPlayer.OnCompletionListener soundCompleteListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
if (soundQueue.size() > 0) {
sound(soundQueue.removeFirst(), false, NO_FADE);
}
}
};
} }